[project @ 1996-06-27 15:55:53 by partain]
authorpartain <unknown>
Thu, 27 Jun 1996 16:00:09 +0000 (16:00 +0000)
committerpartain <unknown>
Thu, 27 Jun 1996 16:00:09 +0000 (16:00 +0000)
partain 1.3 changes to 960626

61 files changed:
ANNOUNCE-2.01 [new file with mode: 0644]
Makefile.in
STARTUP.in
config.guess
config.sub
configure.in
ghc/Jmakefile
ghc/Makefile.BOOT
ghc/PATCHLEVEL
ghc/README
ghc/docs/Jmakefile
ghc/docs/install_guide/installing.lit
ghc/docs/release_notes/release.lit
ghc/docs/state_interface/state-interface.verb
ghc/docs/users_guide/gone_wrong.lit
ghc/docs/users_guide/prof-compiler-options.lit
ghc/docs/users_guide/prof-output.lit
ghc/docs/users_guide/prof-rts-options.lit
ghc/docs/users_guide/profiling.lit
ghc/docs/users_guide/user.lit
ghc/docs/users_guide/utils.lit
ghc/docs/users_guide/vs_haskell.lit
ghc/driver/Jmakefile
ghc/driver/driver.lit [deleted file]
ghc/driver/ghc-asm-alpha.lprl [deleted file]
ghc/driver/ghc-asm-hppa.lprl [deleted file]
ghc/driver/ghc-asm-m68k.lprl [deleted file]
ghc/driver/ghc-asm-mips.lprl [deleted file]
ghc/driver/ghc-asm-sgi.prl [deleted file]
ghc/driver/ghc-asm-solaris.lprl [deleted file]
ghc/driver/ghc-asm-sparc.lprl [deleted file]
ghc/driver/ghc-asm.lprl
ghc/driver/ghc-iface.lprl [new file with mode: 0644]
ghc/driver/ghc-recomp.lprl [new file with mode: 0644]
ghc/driver/ghc-split.lprl
ghc/driver/ghc.lprl
ghc/includes/COptJumps.lh
ghc/includes/COptWraps.lh
ghc/includes/CostCentre.lh
ghc/includes/GranSim.lh
ghc/includes/Jmakefile
ghc/includes/Parallel.lh
ghc/includes/RtsFlags.lh
ghc/includes/RtsTypes.lh
ghc/includes/SMClosures.lh
ghc/includes/SMInfoTables.lh
ghc/includes/SMcompact.lh
ghc/includes/SMcopying.lh
ghc/includes/SMinterface.lh
ghc/includes/SMmark.lh
ghc/includes/SMupdate.lh
ghc/includes/StgMacros.lh
ghc/includes/StgTypes.lh
ghc/includes/Threads.lh
ghc/includes/config.h.in
ghc/includes/ghcSockets.h
ghc/includes/libposix.h
ghc/includes/mkNativeHdr.lc
ghc/includes/stgdefs.h
ghc/includes/stgio.h
ghc/includes/timezone.h

diff --git a/ANNOUNCE-2.01 b/ANNOUNCE-2.01
new file mode 100644 (file)
index 0000000..0fc4ab0
--- /dev/null
@@ -0,0 +1,165 @@
+            The Glasgow Haskell Compiler -- version 2.01
+            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+We are proud to announce the first public release of the Glasgow
+Haskell Compiler (GHC) for the revised Haskell 1.3 language. Sources
+and binaries are freely available by anonymous FTP and on the
+World-Wide Web; details below.
+
+GHC 2.01 is a test-quality release, worth trying if you are a gung-ho
+Haskell user or if you want to ensure that we quickly fix bugs that
+affect your programs :-) We advise *AGAINST* deleting your copy of
+that old workhorse GHC 0.26 (for Haskell 1.2), and *AGAINST* relying
+on this compiler (2.01) in any way.  With your help in testing 2.01,
+we hope to release a more solid Haskell 1.3 compiler relatively soon.
+
+Haskell is "the" standard lazy functional programming language [see
+SIGPLAN Notices, May 1992].  The current language version is 1.3,
+agreed in May, 1996.
+
+The Glasgow Haskell project seeks to bring the power and elegance of
+functional programming to bear on real-world problems.  To that end,
+GHC lets you call C (including cross-system garbage collection),
+provides good profiling tools, supports ever richer I/O, and
+concurrency and parallelism.  Our goal is to make it the "tool of
+choice for real-world applications".
+
+GHC 2.01 is quite different from 0.26 (July 1995), as the new version
+number suggests.  (The 1.xx numbers are reserved for any Haskell-1.2
+compiler releases.)  Changes worth noting include:
+
+.......
+
+  * Concurrent Haskell: with this, you can build programs out of many
+    I/O-performing, interacting `threads'.  We have a draft paper
+    about Concurrent Haskell, and our forthcoming Haggis GUI toolkit
+    uses it.
+
+  * Parallel Haskell, running on top of PVM (Parallel Virtual Machine)
+    and hence portable to pretty much any parallel architecture,
+    whether shared memory or distributed memory.  With this, your
+    Haskell program runs on multiple processors, guided by `par` and
+    `seq` annotations.  The first pretty-much-everyone-can-try-it
+    parallel functional programming system!  NB: The parallel stuff is
+    "research-tool quality"... consider this an alpha release.
+
+  * "Foldr/build" deforestation (by Andy Gill) is in, as are
+    "SPECIALIZE instance" pragmas (by Patrick Sansom).
+
+  * The LibPosix library provides an even richer I/O interface than
+    the standard 1.3 I/O library.  A program like a shell or an FTP
+    client can be written in Haskell -- examples included.
+
+  * Yet more cool libraries: Readline (GNU command-line editing),
+    Socket (BSD sockets), Regex and MatchPS (GNU regular expressions).
+    By Darren Moffat and Sigbjorn Finne.
+
+  * New ports -- Linux (a.out) and MIPS (Silicon Graphics).
+
+  * NB: configuration has changed yet again -- for the better, of
+    course :-)
+
+Please see the release notes for a complete discussion of What's New.
+
+To run this release, you need a machine with 16+MB memory, GNU C
+(`gcc'), and `perl'.  We have seen GHC 0.26 work on these platforms:
+alpha-dec-osf2, hppa1.1-hp-hpux9, i386-unknown-linuxaout,
+m68k-sun-sunos4, mips-sgi-irix5, and sparc-sun-{sunos4,solaris2}.
+Similar platforms should work with minimal hacking effort.
+The installer's guide give a full what-ports-work report.
+
+Binaries are now distributed in `bundles', e.g. a "profiling bundle"
+or a "concurrency bundle" for your platform.  Just grab the ones you
+need.
+
+Once you have the distribution, please follow the pointers in
+ghc/README to find all of the documentation about this release.  NB:
+preserve modification times when un-tarring the files (no `m' option
+for tar, please)!
+
+We run mailing lists for GHC users and bug reports; to subscribe, send
+mail to glasgow-haskell-{users,bugs}-request@dcs.glasgow.ac.uk.
+Please send bug reports to glasgow-haskell-bugs.
+
+Particular thanks to: Jim Mattson (author of much of the code) who has
+now moved to HP in California; and the Turing Institute who donated a
+lot of SGI cycles for the SGI port.
+
+Simon Peyton Jones and Will Partain
+
+Dated: 95/07/24
+
+Relevant URLs on the World-Wide Web:
+
+GHC home page            http://www.dcs.glasgow.ac.uk/fp/software/ghc.html
+Glasgow FP group page     http://www.dcs.glasgow.ac.uk/fp/
+comp.lang.functional FAQ  http://www.cs.nott.ac.uk/Department/Staff/mpj/faq.html
+
+======================================================================
+How to get GHC 0.26:
+
+This release is available by anonymous FTP from the main Haskell
+archive sites, in the directory pub/haskell/glasgow:
+
+       ftp.dcs.glasgow.ac.uk  (130.209.240.50)
+       ftp.cs.chalmers.se     (129.16.227.140)
+       haskell.cs.yale.edu    (128.36.11.43)
+
+The Glasgow site is mirrored by src.doc.ic.ac.uk (146.169.43.1), in
+computing/programming/languages/haskell/glasgow.
+
+These are the available files (.gz files are gzipped) -- some are `on
+demand', ask if you don't see them:
+
+ghc-0.26-src.tar.gz    The source distribution; about 3MB.
+
+ghc-0.26.ANNOUNCE      This file.
+
+ghc-0.26.{README,RELEASE-NOTES} From the distribution; for those who
+                       want to peek before FTPing...
+
+ghc-0.26-ps-docs.tar.gz        Main GHC documents in PostScript format; in
+                       case your TeX setup doesn't agree with our
+                       DVI files...
+
+ghc-0.26-<platform>.tar.gz Basic binary distribution for a particular
+                       <platform>.  Unpack and go: you can compile
+                       and run Haskell programs with nothing but one
+                       of these files.  NB: does *not* include
+                       profiling (see below).
+
+       <platform> ==>  alpha-dec-osf2
+                       hppa1.1-hp-hpux9
+                       i386-unknown-linuxaout
+                       i386-unknown-solaris2
+                       m68k-sun-sunos4
+                       mips-sgi-irix5
+                       sparc-sun-sunos4
+                       sparc-sun-solaris2
+
+ghc-0.26-<bundle>-<platform>.tar.gz
+
+       <platform> ==>  as above
+       <bundle>   ==>  prof (profiling)
+                       conc (concurrent Haskell)
+                       par  (parallel)
+                       gran (GranSim parallel simulator)
+                       ticky (`ticky-ticky' counts -- for implementors)
+                       prof-conc (profiling for "conc[urrent]")
+                       prof-ticky (ticky for "conc[urrent]")
+
+ghc-0.26-hc-files.tar.gz Basic set of intermediate C (.hc) files for the
+                        compiler proper, the prelude, and `Hello,
+                        world'.  Used for bootstrapping the system.
+                        About 4MB.
+
+ghc-0.26-<bundle>-hc-files.tar.gz Further sets of .hc files, for
+                       building other "bundles", e.g., profiling.
+
+ghc-0.26-hi-files-<blah>.tar.gz Sometimes it's more convenient to
+                       use a different set of interface files than
+                       the ones in *-src.tar.gz.  (The installation
+                       guide will advise you of this.)
+
+We could provide diffs from previous versions of GHC, should you
+require them.  A full set would be very large (7MB).
index 3626858..93b4582 100644 (file)
@@ -31,6 +31,6 @@ Makefile: Makefile.in config.status
 config.status: configure
        $(SHELL) config.status --recheck
 configure: configure.in
-       cd $(srcdir); autoconf < configure.in > configure.new
+       cd $(srcdir) && autoconf < configure.in > configure.new
        grep -v '# Generated automatically from' < configure.new > configure
     
index 814426a..0416b7f 100644 (file)
@@ -30,15 +30,15 @@ esac
 
 for i in @DoingMkWorld@ @DoingGlaFpUtils@ @DoingLiterate@ ; do
   if [ -d $i ] ; then
-    ( set -e;                                                                  \
-      cd $i ;                                                                  \
-      echo '' ;                                                                        \
-      echo "*** configuring $i ..." ;                                          \
-      make -f Makefile.BOOT BOOT_DEFINES="-P none -S std -DTopDirPwd=$hardtop";        \
-      echo '' ;                                                                        \
-      echo "*** making Makefiles in $i ..." ;                                  \
-      make Makefile ;                                                          \
-      make Makefiles                                                           \
+    ( set -e;                                                          \
+      cd $i ;                                                          \
+      echo '' ;                                                                \
+      echo "*** configuring $i ..." ;                                  \
+      @MakeCmd@ -f Makefile.BOOT BOOT_DEFINES="-P none -S std -DTopDirPwd=$hardtop";   \
+      echo '' ;                                                                \
+      echo "*** making Makefiles in $i ..." ;                          \
+      @MakeCmd@ Makefile ;                                             \
+      @MakeCmd@ Makefiles                                              \
     )
   else
     echo warning: $i is not a directory -- doing nothing for it
@@ -49,14 +49,14 @@ done
 
 for i in @DoingMkWorld@ @DoingGlaFpUtils@ @DoingLiterate@ ; do
   if [ -d $i ] ; then
-    ( set -e;                                                                  \
-      cd $i ;                                                                  \
-      echo '' ;                                                                        \
-      echo "*** making dependencies in $i ..." ;                               \
-      make depend ;                                                            \
-      echo '' ;                                                                        \
-      echo "*** making all in $i ..." ;                                                \
-      make all                                                                 \
+    ( set -e;                                                          \
+      cd $i ;                                                          \
+      echo '' ;                                                                \
+      echo "*** making dependencies in $i ..." ;                       \
+      @MakeCmd@ depend ;                                               \
+      echo '' ;                                                                \
+      echo "*** making all in $i ..." ;                                        \
+      @MakeCmd@ all                                                    \
     )
   else
     echo warning: $i is not a directory -- doing nothing for it
@@ -67,22 +67,22 @@ done
 
 passed_in_setup="-S @MkWorldSetup@"
 
-for i in @DoingGHC@ @DoingHappy@ @DoingHaggis@ @DoingNoFib@ EndOfList ; do
+for i in @DoingGHC@ @DoingHsLibs@ @DoingHappy@ @DoingHaggis@ @DoingNoFib@ EndOfList ; do
   if [ $i = nofib ] ; then
      setup=$passed_in_setup
   else
      setup=''
   fi
   if [ -d $i ] ; then
-    ( set -e;                                                                  \
-      cd $i ;                                                                  \
-      echo '' ;                                                                        \
-      echo "*** configuring $i ..." ;                                          \
-      make -f Makefile.BOOT BOOT_DEFINES="-P $i $setup -C mkworld -DTopDirPwd=$hardtop"; \
-      echo '' ;                                                                        \
-      echo "*** making Makefiles in $i ..." ;                                  \
-      make Makefile ;                                                          \
-      make Makefiles                                                           \
+    ( set -e;                                                          \
+      cd $i ;                                                          \
+      echo '' ;                                                                \
+      echo "*** configuring $i ..." ;                                  \
+      @MakeCmd@ -f Makefile.BOOT BOOT_DEFINES="-P $i $setup -C mkworld -DTopDirPwd=$hardtop"; \
+      echo '' ;                                                                \
+      echo "*** making Makefiles in $i ..." ;                          \
+      @MakeCmd@ Makefile ;                                             \
+      @MakeCmd@ Makefiles                                              \
     )
   else
     if [ $i != EndOfList ] ; then
@@ -93,13 +93,13 @@ done
 
 # Finally, the dependencies
 
-for i in @DoingGHC@ @DoingHappy@ @DoingHaggis@ @DoingNoFib@ EndOfList ; do
+for i in @DoingGHC@ @DoingHsLibs@ @DoingHappy@ @DoingHaggis@ @DoingNoFib@ EndOfList ; do
   if [ -d $i ] ; then
-    ( set -e;                                                                  \
-      cd $i ;                                                                  \
-      echo '' ;                                                                        \
-      echo "*** making dependencies in $i ..." ;                               \
-      make depend                                                              \
+    ( set -e;                                                          \
+      cd $i ;                                                          \
+      echo '' ;                                                                \
+      echo "*** making dependencies in $i ..." ;                       \
+      @MakeCmd@ depend                                                         \
     )
   else
     if [ $i != EndOfList ] ; then
@@ -112,7 +112,7 @@ echo ''
 echo '*******************************************************************'
 echo "* Looking good! All you should need to do now is...               *"
 echo '*                                                                 *'
-for i in @DoingGHC@ @DoingHappy@ @DoingHaggis@ @DoingNoFib@ EndOfList ; do
+for i in @DoingGHC@ @DoingHsLibs@ @DoingHappy@ @DoingHaggis@ @DoingNoFib@ EndOfList ; do
     if [ $i != EndOfList ] ; then
        echo "        cd $i"
        if [ $i = nofib ] ; then
index 41f828a..c3c4e79 100644 (file)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
-#   Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+#   Copyright (C) 1992, 93, 94, 95, 1996 Free Software Foundation, Inc.
 #
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -14,7 +14,7 @@
 #
 # 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 to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
@@ -51,14 +51,21 @@ trap 'rm -f dummy.c dummy.o dummy; exit 1' 1 2 15
 # Note: order is significant - the case branches are not exclusive.
 
 case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
-    alpha:OSF1:V*:*)
+    alpha:OSF1:[VX]*:*)
        # After 1.2, OSF1 uses "V1.3" for uname -r.
-       echo alpha-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^V//'`
+       # After 4.x, OSF1 uses "X4.x" for uname -r.
+       echo alpha-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VX]//'`
        exit 0 ;;
     alpha:OSF1:*:*)
        # 1.2 uses "1.2" for uname -r.
        echo alpha-dec-osf${UNAME_RELEASE}
         exit 0 ;;
+    21064:Windows_NT:50:3)
+       echo alpha-dec-winnt3.5
+       exit 0 ;;
+    Amiga*:UNIX_System_V:4.0:*)
+       echo m68k-cbm-sysv4
+       exit 0;;
     amiga:NetBSD:*:*)
       echo m68k-cbm-netbsd${UNAME_RELEASE}
       exit 0 ;;
@@ -111,9 +118,15 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
     VAX*:ULTRIX*:*:*)
        echo vax-dec-ultrix${UNAME_RELEASE}
        exit 0 ;;
+    mips:*:4*:UMIPS)
+       echo mips-mips-riscos4sysv
+       exit 0 ;;
     mips:*:5*:RISCos)
        echo mips-mips-riscos${UNAME_RELEASE}
        exit 0 ;;
+    Night_Hawk:Power_UNIX:*:*)
+       echo powerpc-harris-powerunix
+       exit 0 ;;
     m88k:CX/UX:7*:*)
        echo m88k-harris-cxux7
        exit 0 ;;
@@ -124,12 +137,17 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
        echo m88k-motorola-sysv3
        exit 0 ;;
     AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`uname -p`
+        if [ $UNAME_PROCESSOR = mc88100 -o $UNAME_PROCESSOR = mc88100 ] ; then
        if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \
             -o ${TARGET_BINARY_INTERFACE}x = x ] ; then
                echo m88k-dg-dgux${UNAME_RELEASE}
        else
                echo m88k-dg-dguxbcs${UNAME_RELEASE}
        fi
+        else echo i586-dg-dgux${UNAME_RELEASE}
+        fi
        exit 0 ;;
     M88*:DolphinOS:*:*)        # DolphinOS (SVR3)
        echo m88k-dolphin-sysv3
@@ -181,10 +199,8 @@ EOF
        else
                IBM_ARCH=powerpc
        fi
-       if grep bos410 /usr/include/stdio.h >/dev/null 2>&1; then
-               IBM_REV=4.1
-       elif grep bos411 /usr/include/stdio.h >/dev/null 2>&1; then
-               IBM_REV=4.1.1
+       if [ -x /usr/bin/oslevel ] ; then
+               IBM_REV=`/usr/bin/oslevel`
        else
                IBM_REV=4.${UNAME_RELEASE}
        fi
@@ -215,7 +231,7 @@ EOF
        case "${UNAME_MACHINE}" in
            9000/31? )            HP_ARCH=m68000 ;;
            9000/[34]?? )         HP_ARCH=m68k ;;
-           9000/7?? | 9000/8?7 ) HP_ARCH=hppa1.1 ;;
+           9000/7?? | 9000/8?[679] ) HP_ARCH=hppa1.1 ;;
            9000/8?? )            HP_ARCH=hppa1.0 ;;
        esac
        HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
@@ -251,13 +267,13 @@ EOF
        rm -f dummy.c dummy
        echo unknown-hitachi-hiuxwe2
        exit 0 ;;
-    9000/7??:4.3bsd:*:* | 9000/8?7:4.3bsd:*:* )
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
        echo hppa1.1-hp-bsd
        exit 0 ;;
     9000/8??:4.3bsd:*:*)
        echo hppa1.0-hp-bsd
        exit 0 ;;
-    hp7??:OSF1:*:* | hp8?7:OSF1:*:* )
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
        echo hppa1.1-hp-osf
        exit 0 ;;
     hp8??:OSF1:*:*)
@@ -308,19 +324,38 @@ EOF
     *:NetBSD:*:*)
        echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
        exit 0 ;;
+    i*:CYGWIN*:*)
+       echo i386-unknown-cygwin32
+       exit 0 ;;
+    p*:CYGWIN*:*)
+       echo powerpcle-unknown-cygwin32
+       exit 0 ;;
     *:GNU:*:*)
        echo `echo ${UNAME_MACHINE}|sed -e 's,/.*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
        exit 0 ;;
     *:Linux:*:*)
-       # Systems without a BFD linker
-       if test -d /usr/lib/ldscripts/. ; then
-         :
+       # The BFD linker knows what the default object file format is, so
+       # first see if it will tell us.
+       ld_help_string=`ld --help 2>&1`
+       if echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: elf_i[345]86"; then
+         echo "${UNAME_MACHINE}-unknown-linux" ; exit 0
+       elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: i[345]86linux"; then
+         echo "${UNAME_MACHINE}-unknown-linuxaout" ; exit 0
+       elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: i[345]86coff"; then
+         echo "${UNAME_MACHINE}-unknown-linuxcoff" ; exit 0
+       elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: m68kelf"; then
+         echo "${UNAME_MACHINE}-unknown-linux" ; exit 0
+       elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: m68klinux"; then
+         echo "${UNAME_MACHINE}-unknown-linuxaout" ; exit 0
+       elif test "${UNAME_MACHINE}" = "alpha" ; then
+         echo alpha-unknown-linux ; exit 0
        else
-         echo "${UNAME_MACHINE}-unknown-linuxoldld"
-         exit 0
-       fi
-       # Determine whether the default compiler is a.out or elf
-       cat >dummy.c <<EOF
+         # Either a pre-BFD a.out linker (linuxoldld) or one that does not give us
+         # useful --help.  Gcc wants to distinguish between linuxoldld and linuxaout.
+         test ! -d /usr/lib/ldscripts/. \
+           && echo "${UNAME_MACHINE}-unknown-linuxoldld" && exit 0
+         # Determine whether the default compiler is a.out or elf
+         cat >dummy.c <<EOF
 main(argc, argv)
 int argc;
 char *argv[];
@@ -333,8 +368,9 @@ char *argv[];
   return 0;
 }
 EOF
-       ${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0
-       rm -f dummy.c dummy;;
+         ${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0
+         rm -f dummy.c dummy
+       fi ;;
 # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.  earlier versions
 # are messed up and put the nodename in both sysname and nodename.
     i[34]86:DYNIX/ptx:4*:*)
@@ -354,6 +390,8 @@ EOF
        elif /bin/uname -X 2>/dev/null >/dev/null ; then
                UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
                (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+               (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+                       && UNAME_MACHINE=i586
                echo ${UNAME_MACHINE}-unknown-sco$UNAME_REL
        else
                echo ${UNAME_MACHINE}-unknown-sysv32
@@ -384,19 +422,19 @@ EOF
     3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
         uname -p 2>/dev/null | grep 86 >/dev/null \
           && echo i486-ncr-sysv4 && exit 0 ;;
-    m680[234]0:LynxOS:2.2*:*)
+    m680[234]0:LynxOS:2.[23]*:*)
        echo m68k-lynx-lynxos${UNAME_RELEASE}
        exit 0 ;;
     mc68030:UNIX_System_V:4.*:*)
        echo m68k-atari-sysv4
        exit 0 ;;
-    i[34]86:LynxOS:2.2*:*)
+    i[34]86:LynxOS:2.[23]*:*)
        echo i386-lynx-lynxos${UNAME_RELEASE}
        exit 0 ;;
-    TSUNAMI:LynxOS:2.2*:*)
+    TSUNAMI:LynxOS:2.[23]*:*)
        echo sparc-lynx-lynxos${UNAME_RELEASE}
        exit 0 ;;
-    rs6000:LynxOS:2.2*:*)
+    rs6000:LynxOS:2.[23]*:*)
        echo rs6000-lynx-lynxos${UNAME_RELEASE}
        exit 0 ;;
     RM*:SINIX-*:*:*)
@@ -410,12 +448,26 @@ EOF
                echo ns32k-sni-sysv
        fi
        exit 0 ;;
+    mc68*:A/UX:*:*)
+       echo m68k-apple-aux${UNAME_RELEASE}
+       exit 0 ;;
+    R3000:*System_V*:*:*)
+       if [ -d /usr/nec ]; then
+               echo mips-nec-sysv${UNAME_RELEASE}
+       else
+               echo mips-unknown-sysv${UNAME_RELEASE}
+       fi
+        exit 0 ;;
 esac
 
 #echo '(No uname command or uname output not recognized.)' 1>&2
 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
 
 cat >dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
 main ()
 {
 #if defined (sony)
@@ -479,7 +531,18 @@ main ()
 #endif
 
 #if defined (_SEQUENT_)
-  printf ("i386-sequent-ptx\n"); exit (0);
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+       printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+       printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
 #endif
 
 #if defined (vax)
index 93371be..c462f8a 100644 (file)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Configuration validation subroutine script, version 1.1.
-#   Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+#   Copyright (C) 1991, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
 # This file is (in principle) common to ALL GNU software.
 # The presence of a machine in this file suggests that SOME GNU software
 # can handle that machine.  It does not imply ALL GNU software can. 
@@ -17,7 +17,8 @@
 #
 # 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 to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
@@ -84,9 +85,27 @@ case $os in
                os=
                basic_machine=$1
                ;;
+       -sim | -cisco | -oki | -wec | -winbond )        # CYGNUS LOCAL
+               os=
+               basic_machine=$1
+               ;;
+       -apple*)                                        # CYGNUS LOCAL
+               os=
+               basic_machine=$1
+               ;;
+       -scout)                                         # CYGNUS LOCAL
+               ;;
+       -wrs)                                           # CYGNUS LOCAL
+               os=vxworks
+               basic_machine=$1
+               ;;
        -hiux*)
                os=-hiuxwe2
                ;;
+       -sco5)
+               os=sco3.2v5
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
+               ;;
        -sco4)
                os=-sco3.2v4
                basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
@@ -122,19 +141,31 @@ case $os in
        -windowsnt*)
                os=`echo $os | sed -e 's/windowsnt/winnt/'`
                ;;
+       -psos*)
+               os=-psos
+               ;;
 esac
 
 # Decode aliases for certain CPU-COMPANY combinations.
 case $basic_machine in
        # Recognize the basic CPU types without company name.
        # Some are omitted here because they have special meanings below.
-       tahoe | i[345]86 | i860 | m68k | m68000 | m88k | ns32k | arm \
+       tahoe | i[3456]86 | i860 | m68k | m68000 | m88k | ns32k | arm \
                | arme[lb] | pyramid \
                | tron | a29k | 580 | i960 | h8300 | hppa1.0 | hppa1.1 \
-               | alpha | we32k | ns16k | clipper | sparclite | i370 | sh \
-               | powerpc | powerpcle | sparc64 | 1750a | dsp16xx | mips64 | mipsel \
+               | alpha | we32k | ns16k | clipper | i370 | sh \
+               | powerpc | powerpcle | 1750a | dsp16xx | mips64 | mipsel \
                | pdp11 | mips64el | mips64orion | mips64orionel \
-               | sparc)
+               | sparc | sparclet | sparclite | sparc64)
+               basic_machine=$basic_machine-unknown
+               ;;
+       m88110 | m680[01234]0 | m683?2 | m68360 | z8k | v70 | h8500 | w65) # CYGNUS LOCAL
+               basic_machine=$basic_machine-unknown
+               ;;
+       mips64vr4300 | mips64vr4300el) # CYGNUS LOCAL jsmith/vr4300
+               basic_machine=$basic_machine-unknown
+               ;;
+       mips64vr4100 | mips64vr4100el) # CYGNUS LOCAL jsmith/vr4100
                basic_machine=$basic_machine-unknown
                ;;
        # Object if more than one company name word.
@@ -143,8 +174,8 @@ case $basic_machine in
                exit 1
                ;;
        # Recognize the basic CPU types with company name.
-       vax-* | tahoe-* | i[345]86-* | i860-* | m68k-* | m68000-* | m88k-* \
-             | sparc-* | ns32k-* | fx80-* | arm-* | c[123]* \
+       vax-* | tahoe-* | i[3456]86-* | i860-* | m68k-* | m68000-* | m88k-* \
+             | sparc-* | ns32k-* | fx80-* | arm-* | arme[lb]-* | c[123]* \
              | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* | power-* \
              | none-* | 580-* | cray2-* | h8300-* | i960-* | xmp-* | ymp-* \
              | hppa1.0-* | hppa1.1-* | alpha-* | we32k-* | cydra-* | ns16k-* \
@@ -152,14 +183,32 @@ case $basic_machine in
              | pdp11-* | sh-* | powerpc-* | powerpcle-* | sparc64-* | mips64-* | mipsel-* \
              | mips64el-* | mips64orion-* | mips64orionel-*)
                ;;
+       m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | h8500-*) # CYGNUS LOCAL
+               ;;
+       mips64vr4300-* | mips64vr4300el-*) # CYGNUS LOCAL jsmith/vr4300
+               ;;
+       mips64vr4100-* | mips64vr4100el-*) # CYGNUS LOCAL jsmith/vr4100
+               ;;
        # Recognize the various machine names and aliases which stand
        # for a CPU type and a company and sometimes even an OS.
+       386bsd)                                         # CYGNUS LOCAL
+               basic_machine=i386-unknown
+               os=-bsd
+               ;;
        3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
                basic_machine=m68000-att
                ;;
        3b*)
                basic_machine=we32k-att
                ;;
+       a29khif)                                        # CYGNUS LOCAL
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       adobe68k)                                       # CYGNUS LOCAL
+               basic_machine=m68010-adobe
+               os=-scout
+               ;;
        alliant | fx80)
                basic_machine=fx80-alliant
                ;;
@@ -189,6 +238,18 @@ case $basic_machine in
                basic_machine=m68k-apollo
                os=-sysv
                ;;
+       apollo68bsd)                                    # CYGNUS LOCAL
+               basic_machine=m68k-apollo
+               os=-bsd
+               ;;
+       arm | armel | armeb)
+               basic_machine=arm-arm
+               os=-aout
+               ;;
+       aux)
+               basic_machine=m68k-apple
+               os=-aux
+               ;;
        balance)
                basic_machine=ns32k-sequent
                os=-dynix
@@ -257,6 +318,10 @@ case $basic_machine in
        encore | umax | mmax)
                basic_machine=ns32k-encore
                ;;
+       es1800 | OSE68k | ose68k | ose | OSE)           # CYGNUS LOCAL
+               basic_machine=m68k-ericsson
+               os=-ose
+               ;;
        fx2800)
                basic_machine=i860-alliant
                ;;
@@ -275,6 +340,14 @@ case $basic_machine in
                basic_machine=h8300-hitachi
                os=-hms
                ;;
+       h8300xray)                                      # CYGNUS LOCAL
+               basic_machine=h8300-hitachi
+               os=-xray
+               ;;
+       h8500hms)                                       # CYGNUS LOCAL
+               basic_machine=h8500-hitachi
+               os=-hms
+               ;;
        harris)
                basic_machine=m88k-harris
                os=-sysv3
@@ -290,6 +363,22 @@ case $basic_machine in
                basic_machine=m68k-hp
                os=-hpux
                ;;
+        w89k-*)                                                # CYGNUS LOCAL
+                basic_machine=hppa1.1-winbond
+                os=-proelf
+                ;;
+        op50n-*)                                       # CYGNUS LOCAL
+                basic_machine=hppa1.1-oki
+                os=-proelf
+                ;;
+        op60c-*)                                       # CYGNUS LOCAL
+                basic_machine=hppa1.1-oki
+                os=-proelf
+                ;;
+        hppro)                                         # CYGNUS LOCAL
+                basic_machine=hppa1.1-hp
+                os=-proelf
+                ;;
        hp9k2[0-9][0-9] | hp9k31[0-9])
                basic_machine=m68000-hp
                ;;
@@ -302,27 +391,43 @@ case $basic_machine in
        hp9k8[0-9][0-9] | hp8[0-9][0-9])
                basic_machine=hppa1.0-hp
                ;;
+       hppaosf)                                        # CYGNUS LOCAL
+               basic_machine=hppa1.1-hp
+               os=-osf
+               ;;
        i370-ibm* | ibm*)
                basic_machine=i370-ibm
                os=-mvs
                ;;
 # I'm not sure what "Sysv32" means.  Should this be sysv3.2?
-       i[345]86v32)
+       i[3456]86v32)
                basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
                os=-sysv32
                ;;
-       i[345]86v4*)
+       i[3456]86v4*)
                basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
                os=-sysv4
                ;;
-       i[345]86v)
+       i[3456]86v)
                basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
                os=-sysv
                ;;
-       i[345]86sol2)
+       i[3456]86sol2)
                basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
                os=-solaris2
                ;;
+       i386mach)                                       # CYGNUS LOCAL
+               basic_machine=i386-mach
+               os=-mach
+               ;;
+       i386-vsta | vsta)                               # CYGNUS LOCAL
+               basic_machine=i386-unknown
+               os=-vsta
+               ;;
+       i386-go32 | go32)                               # CYGNUS LOCAL
+               basic_machine=i386-unknown
+               os=-go32
+               ;;
        iris | iris4d)
                basic_machine=mips-sgi
                case $os in
@@ -357,10 +462,22 @@ case $basic_machine in
        mips3*)
                basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
                ;;
+       monitor)                                        # CYGNUS LOCAL
+               basic_machine=m68k-rom68k
+               os=-coff
+               ;;
+       msdos)                                          # CYGNUS LOCAL
+               basic_machine=i386-unknown      
+               os=-msdos
+               ;;
        ncr3000)
                basic_machine=i486-ncr
                os=-sysv4
                ;;
+       netbsd386)
+               basic_machine=i386-unknown              # CYGNUS LOCAL
+               os=-netbsd
+               ;;
        news | news700 | news800 | news900)
                basic_machine=m68k-sony
                os=-newsos
@@ -373,6 +490,10 @@ case $basic_machine in
                basic_machine=mips-sony
                os=-newsos
                ;;
+       necv70)                                         # CYGNUS LOCAL
+               basic_machine=v70-nec
+               os=-sysv
+               ;;
        next | m*-next )
                basic_machine=m68k-next
                case $os in
@@ -398,9 +519,21 @@ case $basic_machine in
                basic_machine=i960-intel
                os=-nindy
                ;;
+       mon960)
+               basic_machine=i960-intel
+               os=-mon960
+               ;;
        np1)
                basic_machine=np1-gould
                ;;
+       OSE68000 | ose68000)                            # CYGNUS LOCAL
+               basic_machine=m68000-ericsson
+               os=-ose
+               ;;
+       os68k)                                          # CYGNUS LOCAL
+               basic_machine=m68k-none
+               os=-os68k
+               ;;
        pa-hitachi)
                basic_machine=hppa1.1-hitachi
                os=-hiuxwe2
@@ -418,14 +551,18 @@ case $basic_machine in
         pc532 | pc532-*)
                basic_machine=ns32k-pc532
                ;;
-       pentium | p5 | p6)
-               # We don't have specific support for the Intel Pentium (p6) followon yet, so just call it a Pentium
+       pentium | p5)
                basic_machine=i586-intel
                ;;
-       pentium-* | p5-* | p6-*)
-               # We don't have specific support for the Intel Pentium (p6) followon yet, so just call it a Pentium
+       pentiumpro | p6)
+               basic_machine=i686-intel
+               ;;
+       pentium-* | p5-*)
                basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
                ;;
+       pentiumpro-* | p6-*)
+               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
        k5)
                # We don't have specific support for AMD's K5 yet, so just call it a Pentium
                basic_machine=i586-amd
@@ -452,12 +589,20 @@ case $basic_machine in
        ps2)
                basic_machine=i386-ibm
                ;;
+       rom68k)                                         # CYGNUS LOCAL
+               basic_machine=m68k-rom68k
+               os=-coff
+               ;;
        rm[46]00)
                basic_machine=mips-siemens
                ;;
        rtpc | rtpc-*)
                basic_machine=romp-ibm
                ;;
+       sa29200)                                        # CYGNUS LOCAL
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
        sequent)
                basic_machine=i386-sequent
                ;;
@@ -465,6 +610,10 @@ case $basic_machine in
                basic_machine=sh-hitachi
                os=-hms
                ;;
+       sparclite-wrs)                                  # CYGNUS LOCAL
+               basic_machine=sparclite-wrs
+               os=-vxworks
+               ;;
        sps7)
                basic_machine=m68k-bull
                os=-sysv2
@@ -472,6 +621,13 @@ case $basic_machine in
        spur)
                basic_machine=spur-unknown
                ;;
+       st2000)                                         # CYGNUS LOCAL
+               basic_machine=m68k-tandem
+               ;;
+       stratus)                                        # CYGNUS LOCAL
+               basic_machine=i860-stratus
+               os=-sysv4
+               ;;
        sun2)
                basic_machine=m68000-sun
                ;;
@@ -527,6 +683,10 @@ case $basic_machine in
                basic_machine=a29k-nyu
                os=-sym1
                ;;
+       v810 | necv810)                                 # CYGNUS LOCAL
+               basic_machine=v810-nec
+               os=-none
+               ;;
        vaxv)
                basic_machine=vax-dec
                os=-sysv
@@ -547,6 +707,10 @@ case $basic_machine in
                basic_machine=a29k-wrs
                os=-vxworks
                ;;
+       w65*)                                           # CYGNUS LOCAL
+               basic_machine=w65-wdc
+               os=-none
+               ;;
        xmp)
                basic_machine=xmp-cray
                os=-unicos
@@ -554,6 +718,10 @@ case $basic_machine in
         xps | xps100)
                basic_machine=xps100-honeywell
                ;;
+       z8k-*-coff)                                     # CYGNUS LOCAL
+               basic_machine=z8k-unknown
+               os=-sim
+               ;;
        none)
                basic_machine=none-none
                os=-none
@@ -561,6 +729,15 @@ case $basic_machine in
 
 # Here we handle the default manufacturer of certain CPU types.  It is in
 # some cases the only manufacturer, in others, it is the most popular.
+       w89k)                                           # CYGNUS LOCAL
+               basic_machine=hppa1.1-winbond
+               ;;
+       op50n)                                          # CYGNUS LOCAL
+               basic_machine=hppa1.1-oki
+               ;;
+       op60c)                                          # CYGNUS LOCAL
+               basic_machine=hppa1.1-oki
+               ;;
        mips)
                basic_machine=mips-mips
                ;;
@@ -591,6 +768,12 @@ case $basic_machine in
        orion105)
                basic_machine=clipper-highlevel
                ;;
+       mac | mpw | mac-mpw)                            # CYGNUS LOCAL
+               basic_machine=m68k-apple
+               ;;
+       pmac | pmac-mpw)                                # CYGNUS LOCAL
+               basic_machine=powerpc-apple
+               ;;
        *)
                echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
                exit 1
@@ -632,17 +815,27 @@ case $os in
        # Each alternative MUST END IN A *, to match a version number.
        # -sysv* is not here because it comes later, after sysvr4.
        -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
-             | -vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[345]* \
+             | -vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[3456]* \
              | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
-             | -amigados* | -msdos* | -newsos* | -unicos* | -aos* \
-             | -nindy* | -vxworks* | -ebmon* | -hms* | -mvs* | -clix* \
+             | -amigados* | -msdos* | -moss* | -newsos* | -unicos* | -aos* | -aof* \
+             | -nindy* | -mon960* | -vxworks* | -ebmon* | -hms* | -mvs* | -clix* \
              | -riscos* | -linux* | -uniplus* | -iris* | -rtu* | -xenix* \
              | -hiux* | -386bsd* | -netbsd* | -freebsd* | -riscix* \
              | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \
              | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
-             | -udi* | -eabi* | -lites* )
+             | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+             | -cygwin32* | -pe* | -psos*)
        # Remember, each alternative MUST END IN *, to match a version number.
                ;;
+       # CYGNUS LOCAL
+       -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+             | -windows* | -osx | -abug |  -netware* | -proelf | -os9* \
+             | -macos* | -mpw* | -magic*)
+               ;;
+       -mac*)
+               os=`echo $os | sed -e 's|mac|macos|'`
+               ;;
+       # END CYGNUS LOCAL
        -sunos5*)
                os=`echo $os | sed -e 's|sunos5|solaris2|'`
                ;;
@@ -664,9 +857,15 @@ case $os in
        -acis*)
                os=-aos
                ;;
+       -386bsd)                                        # CYGNUS LOCAL
+               os=-bsd
+               ;;
        -ctix* | -uts*)
                os=-sysv
                ;;
+       -ns2 )
+               os=-nextstep2
+               ;;
        # Preserve the version number of sinix5.
        -sinix5.*)
                os=`echo $os | sed -e 's|sinix|sysv|'`
@@ -692,6 +891,12 @@ case $os in
        # This must come after -sysvr4.
        -sysv*)
                ;;
+       -ose*)                                          # CYGNUS LOCAL
+               os=-ose
+               ;;
+       -es1800*)                                       # CYGNUS LOCAL
+               os=-ose
+               ;;
        -xenix)
                os=-xenix
                ;;
@@ -741,6 +946,12 @@ case $basic_machine in
                # default.
                # os=-sunos4
                ;;
+       m68*-cisco)                                     # CYGNUS LOCAL
+               os=-aout
+               ;;
+       mips*-cisco)                                    # CYGNUS LOCAL
+               os=-elf
+               ;;
        *-tti)  # must be before sparc entry or we get the wrong os.
                os=-sysv3
                ;;
@@ -750,6 +961,15 @@ case $basic_machine in
        *-ibm)
                os=-aix
                ;;
+       *-wec)                                          # CYGNUS LOCAL
+               os=-proelf
+               ;;
+       *-winbond)                                      # CYGNUS LOCAL
+               os=-proelf
+               ;;
+       *-oki)                                          # CYGNUS LOCAL
+               os=-proelf
+               ;;
        *-hp)
                os=-hpux
                ;;
@@ -774,6 +994,9 @@ case $basic_machine in
        m88k-omron*)
                os=-luna
                ;;
+       *-next )
+               os=-nextstep
+               ;;
        *-sequent)
                os=-ptx
                ;;
@@ -807,6 +1030,15 @@ case $basic_machine in
        *-masscomp)
                os=-rtu
                ;;
+       *-rom68k)                                       # CYGNUS LOCAL
+               os=-coff
+               ;;
+       *-*bug)                                         # CYGNUS LOCAL
+               os=-coff
+               ;;
+       *-apple)                                        # CYGNUS LOCAL
+               os=-macos
+               ;;
        *)
                os=-none
                ;;
@@ -825,6 +1057,9 @@ case $basic_machine in
                        -sunos*)
                                vendor=sun
                                ;;
+                       -bosx*)                         # CYGNUS LOCAL
+                               vendor=bull
+                               ;;
                        -lynxos*)
                                vendor=lynx
                                ;;
@@ -858,6 +1093,15 @@ case $basic_machine in
                        -vxworks*)
                                vendor=wrs
                                ;;
+                       -aux*)
+                               vendor=apple
+                               ;;
+                       -hms*)                          # CYGNUS LOCAL
+                               vendor=hitachi
+                               ;;
+                       -mpw* | -macos*)                # CYGNUS LOCAL
+                               vendor=apple
+                               ;;
                esac
                basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
                ;;
index c3f058c..3a57a3c 100644 (file)
@@ -17,7 +17,8 @@ AC_INIT(STARTUP.in)
 #
 # Prepare to generate the following header files
 #
-AC_CONFIG_HEADER(ghc/includes/config.h literate/config.h)
+AC_CONFIG_HEADER(ghc/includes/config.h)
+# and  literate/config.h ???
 # ToDo !!!!!!!!!!!!!!!!
 #
 # No, we don't do `--srcdir'...
@@ -27,15 +28,16 @@ if test x"$srcdir" != 'x.' ; then
 fi
 
 # -------------------------------------------------------------------------
-dnl ** choose what blobs to build (ghc,haggis,happy,nofib,????)
+dnl ** choose what blobs to build (ghc,hslibs,haggis,happy,nofib,????)
 
 # set to the name for the dir if doing it, otherwise empty
 DoingGHC='ghc'
+DoingHsLibs=''
 DoingNoFib=''
 DoingHappy=''
 DoingHaggis=''
+DoingLiterate=''
 # the following are not normally changed
-DoingLiterate='literate'
 DoingMkWorld='mkworld'
 DoingGlaFpUtils='glafp-utils'
 
@@ -48,7 +50,7 @@ AC_ARG_ENABLE(ghc,
 **********************************************************************
 
 First, select *which* of the tools you want to build,
-with --{enable,disable}-{ghc,nofib,happy,haggis}.
+with --{enable,disable}-{ghc,hslibs,nofib,happy,haggis}.
 (The default is: only GHC (Glasgow Haskell compiler).)
 
 Second, you may set one of a few applies-in-all-cases options.
@@ -91,6 +93,26 @@ if test "xxx$DoingGHC" = 'xxx' ; then
 #   ghc_includes_config_h=''
 fi
 
+AC_ARG_ENABLE(hslibs,
+   [--enable-hslibs   build suite of Haskell libraries],
+   [case "$enableval" in
+        yes) DoingHsLibs='hslibs'
+             ;;
+        no)  DoingHsLibs=''
+             ;;
+        *)   echo "I don't understand this option: --enable-hslibs=$enableval"
+             exit 1
+             ;;
+    esac])
+if test "xxx$DoingHsLibs" = 'xxxhslibs' -a \( ! -d hslibs \) ; then
+    DoingHsLibs=''
+    echo 'Doing --disable-hslibs, as there is no hslibs directory'
+fi
+hslibs_mkworld_site_hslibs_jm='hslibs/mkworld/site-hslibs.jm'
+if test "xxx$DoingHsLibs" = 'xxx' ; then
+    hslibs_mkworld_site_hslibs_jm=''
+fi
+
 AC_ARG_ENABLE(nofib,
    [--enable-nofib    build NoFib suite as part of Glasgow FP tools],
    [case "$enableval" in
@@ -128,7 +150,7 @@ if test "xxx$DoingHappy" = 'xxxhappy' -a \( ! -d happy \) ; then
 fi
 
 AC_ARG_ENABLE(haggis,
-   [--disable-haggis  build Haggis GUI toolkit as part of Glasgow FP tools],
+   [--enable-haggis   build Haggis GUI toolkit as part of Glasgow FP tools],
    [case "$enableval" in
         yes) DoingHaggis='haggis'
              ;;
@@ -194,6 +216,7 @@ if test "xxx$DoingGlaFpUtils" = 'xxxglafp-utils' -a \( ! -d glafp-utils \) ; the
 fi
 
 AC_SUBST(DoingGHC)
+AC_SUBST(DoingHsLibs)
 AC_SUBST(DoingNoFib)
 AC_SUBST(DoingHappy)
 AC_SUBST(DoingHaggis)
@@ -207,7 +230,7 @@ dnl ** choose host(/target/build) platform
 # Partly stolen from GCC "configure".
 #
 if test "x$target" = xNONE ; then
-    if test "x$nonopt" != xNONE; then
+    if test "x$nonopt" != xNONE ; then
         target=$nonopt
     else
         # This way of testing the result of a command substitution is
@@ -217,8 +240,7 @@ if test "x$target" = xNONE ; then
         else
             echo 'Config.guess failed to determine the host type.  You need \
 to specify one.' 1>&2
-            if [ -r config.status ]
-            then
+            if test -r config.status ; then
                 tail +2 config.status 1>&2
             fi
             exit 1
@@ -254,7 +276,7 @@ fi
 # We also record the architecture, vendor, and operating system (OS)
 # separately.
 case $HostPlatform in
-alpha-dec-osf1* | alpha-dec-osf2*)
+alpha-dec-osf[[1234]]*)
        HostPlatform=alpha-dec-osf1 # canonicalise for our purposes
        TargetPlatform=alpha-dec-osf1 # this will work for now... (hack)
        BuildPlatform=alpha-dec-osf1 #hack
@@ -272,7 +294,7 @@ hppa1.1-hp-hpux*)
         HostVendor_CPP='hp'
         HostOS_CPP='hpux'
         ;;
-i386-*-linuxaout*)
+i[[3456]]86-*-linuxaout*)
        HostPlatform=i386-unknown-linuxaout # hack again
        TargetPlatform=i386-unknown-linuxaout
        BuildPlatform=i386-unknown-linuxaout
@@ -281,16 +303,7 @@ i386-*-linuxaout*)
         HostVendor_CPP='unknown'
         HostOS_CPP='linuxaout'
         ;;
-i486-*-linuxaout*)
-       HostPlatform=i386-unknown-linuxaout # hack again: NB: name for arch is *i386*!
-       TargetPlatform=i386-unknown-linuxaout
-       BuildPlatform=i386-unknown-linuxaout
-        HostPlatform_CPP='i386_unknown_linuxaout'
-        HostArch_CPP='i386'
-        HostVendor_CPP='unknown'
-        HostOS_CPP='linuxaout'
-        ;;
-i386-*-linux*)
+i[[3456]]86-*-linux*)
        HostPlatform=i386-unknown-linux # hack again
        TargetPlatform=i386-unknown-linux
        BuildPlatform=i386-unknown-linux
@@ -299,40 +312,25 @@ i386-*-linux*)
         HostVendor_CPP='unknown'
         HostOS_CPP='linux'
         ;;
-i486-*-linux*)
-       HostPlatform=i386-unknown-linux # hack again: NB: name for arch is *i386*!
-       TargetPlatform=i386-unknown-linux
-       BuildPlatform=i386-unknown-linux
-        HostPlatform_CPP='i386_unknown_linux'
-        HostArch_CPP='i386'
-        HostVendor_CPP='unknown'
-        HostOS_CPP='linux'
-        ;;
-i386-*-freebsd*)
-        HostPlatform_CPP='i386_unknown_freebsd'
-        HostArch_CPP='i386'
-        HostVendor_CPP='unknown'
-        HostOS_CPP='freebsd'
-        ;;
-i486-*-freebsd*)
+i[[3456]]86-*-freebsd*)
+       HostPlatform=i386-unknown-freebsd # hack again
+       TargetPlatform=i386-unknown-freebsd
+       BuildPlatform=i386-unknown-freebsd
         HostPlatform_CPP='i386_unknown_freebsd'
         HostArch_CPP='i386'
         HostVendor_CPP='unknown'
         HostOS_CPP='freebsd'
         ;;
-i386-*-netbsd*)
+i[[3456]]86-*-netbsd*)
+       HostPlatform=i386-unknown-netbsd # hack again
+       TargetPlatform=i386-unknown-netbsd
+       BuildPlatform=i386-unknown-netbsd
         HostPlatform_CPP='i386_unknown_netbsd'
         HostArch_CPP='i386'
         HostVendor_CPP='unknown'
         HostOS_CPP='netbsd'
         ;;
-i486-*-netbsd*)
-        HostPlatform_CPP='i386_unknown_netbsd'
-        HostArch_CPP='i386'
-        HostVendor_CPP='unknown'
-        HostOS_CPP='netbsd'
-        ;;
-i386-*-solaris2*)
+i[[3456]]86-*-solaris2*)
        HostPlatform=i386-unknown-solaris2 # hack again
        TargetPlatform=i386-unknown-solaris2
        BuildPlatform=i386-unknown-solaris2
@@ -353,7 +351,7 @@ m68k-next-nextstep3)
         HostVendor_CPP='next'
         HostOS_CPP='nextstep3'
         ;;
-i386-next-nextstep3)
+i[[3456]]86-next-nextstep3)
        HostPlatform=i386-next-nextstep3 # hack again
        TargetPlatform=i386-next-nextstep3
        BuildPlatform=i386-next-nextstep3
@@ -617,6 +615,10 @@ if test -z "$YaccCmd"; then
     fi
 fi
 
+dnl ** Find lex command (lex or flex) and library (-ll or -lfl)
+#
+AC_PROG_LEX
+
 #--------------------------------------------------------------
 WithHc='haskell-compiler-unspecified'
 WithHcType='HC_UNSPECIFIED'
@@ -689,14 +691,37 @@ esac
 AC_SUBST(WithHc)
 AC_SUBST(WithHcType)
 
+dnl ** Possibly use something else instead of 'gcc'.
+WhatGccIsCalled=gcc
+AC_ARG_WITH(gcc,
+   [--with-gcc=<gcc command>
+       Use a different command instead of 'gcc' for the GNU C compiler.],
+   [HaveGcc=YES; WhatGccIsCalled="$withval"])
+AC_SUBST(WhatGccIsCalled)
+
+dnl ** Choose which make to use (default 'make -r')
+MakeCmd='make -r'
+AC_ARG_WITH(make,
+   [ 
+--with-make=<make command> 
+       Use an alternate command instead of 'make'.  This is useful
+       when GNU make is required (for instance when the default make
+       supplied by the system won't work, as is the case on FreeBSD
+       and NetBSD).  You probably want to include the '-r' flag with
+       make, to exclude implicit suffix rules.],
+   [MakeCmd="$withval"]) 
+AC_SUBST(MakeCmd)
+
 dnl ** possibly choose a different tmpdir (default /tmp)
 # let the user decide where the best tmpdir is
 # /tmp is the default; /usr/tmp is sometimes a good choice.
 # Very site-specific.
 TmpDir='/tmp'
 AC_ARG_WITH(tmpdir,
-   [--with-tmpdir=<temp directory> Use an alternative directory for
-temporary files (presumably because /tmp is too small).],
+   [
+--with-tmpdir=<temp directory> 
+       Use an alternative directory for temporary files (presumably
+       because /tmp is too small).],
    [TmpDir="$withval"])
 AC_SUBST(TmpDir)
 
@@ -707,8 +732,9 @@ HcMaxHeapWasSet='NO'
 HcMaxHeap='0'
 AC_ARG_WITH(max-heap,
    [
---with-max-heap=<heap size, e.g., 32m> Do all Haskell compilations
-with a heap of this size.  (If you've got it, flaunt it.)],
+--with-max-heap=<heap size, e.g., 32m> 
+       Do all Haskell compilations with a heap of this size.  (If
+       you've got it, flaunt it.)],
    [HcMaxHeapWasSet='YES'
     HcMaxHeap="$withval"])
 AC_SUBST(HcMaxHeapWasSet)
@@ -769,6 +795,9 @@ elif $ArCmd clq conftest.a >/dev/null 2>/dev/null; then
 elif $ArCmd cq conftest.a >/dev/null 2>/dev/null; then
     ArCmd="$ArCmd cq"
     NeedRanLib='YES'
+elif $ArCmd cq conftest.a 2>&1 | grep 'no archive members specified' >/dev/null 2>/dev/null; then
+    ArCmd="$ArCmd cq"
+    NeedRanLib='YES'
 else
     echo "I can't figure out how to use your $ArCmd"
     exit 1
@@ -815,21 +844,6 @@ dnl ** determine the type of signal()
 #
 AC_TYPE_SIGNAL
 #
-dnl ** decide whether or not flex lexers need to be linked with -lfl
-#
-AC_CHECK_LIB(fl,yywrap,
-    FlexLibAvailable='YES',
-    FlexLibAvailable='NO')
-AC_SUBST(FlexLibAvailable)
-#
-dnl ** Decide whether or not lex lexers need to be linked with -ll
-# (Linux, for example, does not have "lex", only "flex")
-#
-AC_CHECK_LIB(l,yywrap,
-    LexLibAvailable='YES',
-    LexLibAvailable='NO')
-AC_SUBST(LexLibAvailable)
-#
 dnl ** check for specific library functions that we are interested in
 #
 AC_CHECK_FUNCS(access ftime getclock getpagesize getrusage gettimeofday mktime mprotect setitimer stat sysconf timelocal times vadvise vfork)
@@ -1047,224 +1061,226 @@ AC_ARG_ENABLE(gc-du,
              ;;
     esac])
 
-dnl  some seds only allow 99 commands, meaning no more
-dnl  than 99 AC_SUBSTs.  AARRGGHH!!
-dnl AC_ARG_ENABLE(user-way-a,
-dnl    [--enable-user-way-a    build for \`user way a' (mostly for implementors)],
-dnl    [case "$enableval" in
-dnl         yes) GhcBuild_a='YES'
-dnl              ;;
-dnl         no)  GhcBuild_a='NO'
-dnl              ;;
-dnl         *)   echo "I don't understand this option: --enable-user-way-a=$enableval"
-dnl              exit 1
-dnl              ;;
-dnl     esac])
-dnl 
-dnl AC_ARG_ENABLE(user-way-b,
-dnl    [--enable-user-way-b    build for \`user way b' (mostly for implementors)],
-dnl    [case "$enableval" in
-dnl         yes) GhcBuild_b='YES'
-dnl              ;;
-dnl         no)  GhcBuild_b='NO'
-dnl              ;;
-dnl         *)   echo "I don't understand this option: --enable-user-way-b=$enableval"
-dnl              exit 1
-dnl              ;;
-dnl     esac])
-dnl 
-dnl AC_ARG_ENABLE(user-way-c,
-dnl    [--enable-user-way-c    build for \`user way c' (mostly for implementors)],
-dnl    [case "$enableval" in
-dnl         yes) GhcBuild_c='YES'
-dnl              ;;
-dnl         no)  GhcBuild_c='NO'
-dnl              ;;
-dnl         *)   echo "I don't understand this option: --enable-user-way-c=$enableval"
-dnl              exit 1
-dnl              ;;
-dnl     esac])
-dnl 
-dnl AC_ARG_ENABLE(user-way-d,
-dnl    [--enable-user-way-d    build for \`user way d' (mostly for implementors)],
-dnl    [case "$enableval" in
-dnl         yes) GhcBuild_d='YES'
-dnl              ;;
-dnl         no)  GhcBuild_d='NO'
-dnl              ;;
-dnl         *)   echo "I don't understand this option: --enable-user-way-d=$enableval"
-dnl              exit 1
-dnl              ;;
-dnl     esac])
-dnl 
-dnl AC_ARG_ENABLE(user-way-e,
-dnl    [--enable-user-way-e    build for \`user way e' (mostly for implementors)],
-dnl    [case "$enableval" in
-dnl         yes) GhcBuild_e='YES'
-dnl              ;;
-dnl         no)  GhcBuild_e='NO'
-dnl              ;;
-dnl         *)   echo "I don't understand this option: --enable-user-way-e=$enableval"
-dnl              exit 1
-dnl              ;;
-dnl     esac])
-dnl 
-dnl AC_ARG_ENABLE(user-way-f,
-dnl    [--enable-user-way-f    build for \`user way f' (mostly for implementors)],
-dnl    [case "$enableval" in
-dnl         yes) GhcBuild_f='YES'
-dnl              ;;
-dnl         no)  GhcBuild_f='NO'
-dnl              ;;
-dnl         *)   echo "I don't understand this option: --enable-user-way-f=$enableval"
-dnl              exit 1
-dnl              ;;
-dnl     esac])
-dnl 
-dnl AC_ARG_ENABLE(user-way-g,
-dnl    [--enable-user-way-g    build for \`user way g' (mostly for implementors)],
-dnl    [case "$enableval" in
-dnl         yes) GhcBuild_g='YES'
-dnl              ;;
-dnl         no)  GhcBuild_g='NO'
-dnl              ;;
-dnl         *)   echo "I don't understand this option: --enable-user-way-g=$enableval"
-dnl              exit 1
-dnl              ;;
-dnl     esac])
-dnl 
-dnl AC_ARG_ENABLE(user-way-h,
-dnl    [--enable-user-way-h    build for \`user way h' (mostly for implementors)],
-dnl    [case "$enableval" in
-dnl         yes) GhcBuild_h='YES'
-dnl              ;;
-dnl         no)  GhcBuild_h='NO'
-dnl              ;;
-dnl         *)   echo "I don't understand this option: --enable-user-way-h=$enableval"
-dnl              exit 1
-dnl              ;;
-dnl     esac])
-dnl 
-dnl AC_ARG_ENABLE(user-way-i,
-dnl    [--enable-user-way-i    build for \`user way i' (mostly for implementors)],
-dnl    [case "$enableval" in
-dnl         yes) GhcBuild_i='YES'
-dnl              ;;
-dnl         no)  GhcBuild_i='NO'
-dnl              ;;
-dnl         *)   echo "I don't understand this option: --enable-user-way-i=$enableval"
-dnl              exit 1
-dnl              ;;
-dnl     esac])
-dnl 
-dnl AC_ARG_ENABLE(user-way-j,
-dnl    [--enable-user-way-j    build for \`user way j' (mostly for implementors)],
-dnl    [case "$enableval" in
-dnl         yes) GhcBuild_j='YES'
-dnl              ;;
-dnl         no)  GhcBuild_j='NO'
-dnl              ;;
-dnl         *)   echo "I don't understand this option: --enable-user-way-j=$enableval"
-dnl              exit 1
-dnl              ;;
-dnl     esac])
-dnl 
-dnl AC_ARG_ENABLE(user-way-k,
-dnl    [--enable-user-way-k    build for \`user way k' (mostly for implementors)],
-dnl    [case "$enableval" in
-dnl         yes) GhcBuild_k='YES'
-dnl              ;;
-dnl         no)  GhcBuild_k='NO'
-dnl              ;;
-dnl         *)   echo "I don't understand this option: --enable-user-way-k=$enableval"
-dnl              exit 1
-dnl              ;;
-dnl     esac])
-dnl 
-dnl AC_ARG_ENABLE(user-way-l,
-dnl    [--enable-user-way-l    build for \`user way l' (mostly for implementors)],
-dnl    [case "$enableval" in
-dnl         yes) GhcBuild_l='YES'
-dnl              ;;
-dnl         no)  GhcBuild_l='NO'
-dnl              ;;
-dnl         *)   echo "I don't understand this option: --enable-user-way-l=$enableval"
-dnl              exit 1
-dnl              ;;
-dnl     esac])
-dnl 
-dnl AC_ARG_ENABLE(user-way-m,
-dnl    [--enable-user-way-m    build for \`user way m' (mostly for implementors)],
-dnl    [case "$enableval" in
-dnl         yes) GhcBuild_m='YES'
-dnl              ;;
-dnl         no)  GhcBuild_m='NO'
-dnl              ;;
-dnl         *)   echo "I don't understand this option: --enable-user-way-m=$enableval"
-dnl              exit 1
-dnl              ;;
-dnl     esac])
-dnl 
-dnl AC_ARG_ENABLE(user-way-n,
-dnl    [--enable-user-way-n    build for \`user way n' (mostly for implementors)],
-dnl    [case "$enableval" in
-dnl         yes) GhcBuild_n='YES'
-dnl              ;;
-dnl         no)  GhcBuild_n='NO'
-dnl              ;;
-dnl         *)   echo "I don't understand this option: --enable-user-way-n=$enableval"
-dnl              exit 1
-dnl              ;;
-dnl     esac])
-dnl 
-dnl AC_ARG_ENABLE(user-way-o,
-dnl    [--enable-user-way-o    build for \`user way o' (mostly for implementors)],
-dnl    [case "$enableval" in
-dnl         yes) GhcBuild_o='YES'
-dnl              ;;
-dnl         no)  GhcBuild_o='NO'
-dnl              ;;
-dnl         *)   echo "I don't understand this option: --enable-user-way-o=$enableval"
-dnl              exit 1
-dnl              ;;
-dnl     esac])
-dnl 
-dnl AC_ARG_ENABLE(user-way-A,
-dnl    [--enable-user-way-A    build for \`user way A' (mostly for implementors)],
-dnl    [case "$enableval" in
-dnl         yes) GhcBuild_A='YES'
-dnl              ;;
-dnl         no)  GhcBuild_A='NO'
-dnl              ;;
-dnl         *)   echo "I don't understand this option: --enable-user-way-A=$enableval"
-dnl              exit 1
-dnl              ;;
-dnl     esac])
-dnl 
-dnl AC_ARG_ENABLE(user-way-B,
-dnl    [--enable-user-way-B    build for \`user way B' (mostly for implementors)],
-dnl    [case "$enableval" in
-dnl         yes) GhcBuild_B='YES'
-dnl              ;;
-dnl         no)  GhcBuild_B='NO'
-dnl              ;;
-dnl         *)   echo "I don't understand this option: --enable-user-way-B=$enableval"
-dnl              exit 1
-dnl              ;;
-dnl     esac])
-dnl 
-AC_SUBST(GhcBuild_normal)
-AC_SUBST(GhcBuild_p)
-AC_SUBST(GhcBuild_t)
-AC_SUBST(GhcBuild_u)
-AC_SUBST(GhcBuild_mc)
-AC_SUBST(GhcBuild_mr)
-AC_SUBST(GhcBuild_mt)
-AC_SUBST(GhcBuild_mp)
-AC_SUBST(GhcBuild_mg)
-AC_SUBST(GhcBuild_2s)
-AC_SUBST(GhcBuild_1s)
-AC_SUBST(GhcBuild_du)
+AC_ARG_ENABLE(user-way-a,
+   [--enable-user-way-a    build for \`user way a' (mostly for implementors)],
+   [case "$enableval" in
+        yes) GhcBuild_a='YES'
+             ;;
+        no)  GhcBuild_a='NO'
+             ;;
+        *)   echo "I don't understand this option: --enable-user-way-a=$enableval"
+             exit 1
+             ;;
+    esac])
+
+AC_ARG_ENABLE(user-way-b,
+   [--enable-user-way-b    build for \`user way b' (mostly for implementors)],
+   [case "$enableval" in
+        yes) GhcBuild_b='YES'
+             ;;
+        no)  GhcBuild_b='NO'
+             ;;
+        *)   echo "I don't understand this option: --enable-user-way-b=$enableval"
+             exit 1
+             ;;
+    esac])
+
+AC_ARG_ENABLE(user-way-c,
+   [--enable-user-way-c    build for \`user way c' (mostly for implementors)],
+   [case "$enableval" in
+        yes) GhcBuild_c='YES'
+             ;;
+        no)  GhcBuild_c='NO'
+             ;;
+        *)   echo "I don't understand this option: --enable-user-way-c=$enableval"
+             exit 1
+             ;;
+    esac])
+
+AC_ARG_ENABLE(user-way-d,
+   [--enable-user-way-d    build for \`user way d' (mostly for implementors)],
+   [case "$enableval" in
+        yes) GhcBuild_d='YES'
+             ;;
+        no)  GhcBuild_d='NO'
+             ;;
+        *)   echo "I don't understand this option: --enable-user-way-d=$enableval"
+             exit 1
+             ;;
+    esac])
+
+AC_ARG_ENABLE(user-way-e,
+   [--enable-user-way-e    build for \`user way e' (mostly for implementors)],
+   [case "$enableval" in
+        yes) GhcBuild_e='YES'
+             ;;
+        no)  GhcBuild_e='NO'
+             ;;
+        *)   echo "I don't understand this option: --enable-user-way-e=$enableval"
+             exit 1
+             ;;
+    esac])
+
+AC_ARG_ENABLE(user-way-f,
+   [--enable-user-way-f    build for \`user way f' (mostly for implementors)],
+   [case "$enableval" in
+        yes) GhcBuild_f='YES'
+             ;;
+        no)  GhcBuild_f='NO'
+             ;;
+        *)   echo "I don't understand this option: --enable-user-way-f=$enableval"
+             exit 1
+             ;;
+    esac])
+
+AC_ARG_ENABLE(user-way-g,
+   [--enable-user-way-g    build for \`user way g' (mostly for implementors)],
+   [case "$enableval" in
+        yes) GhcBuild_g='YES'
+             ;;
+        no)  GhcBuild_g='NO'
+             ;;
+        *)   echo "I don't understand this option: --enable-user-way-g=$enableval"
+             exit 1
+             ;;
+    esac])
+
+AC_ARG_ENABLE(user-way-h,
+   [--enable-user-way-h    build for \`user way h' (mostly for implementors)],
+   [case "$enableval" in
+        yes) GhcBuild_h='YES'
+             ;;
+        no)  GhcBuild_h='NO'
+             ;;
+        *)   echo "I don't understand this option: --enable-user-way-h=$enableval"
+             exit 1
+             ;;
+    esac])
+
+AC_ARG_ENABLE(user-way-i,
+   [--enable-user-way-i    build for \`user way i' (mostly for implementors)],
+   [case "$enableval" in
+        yes) GhcBuild_i='YES'
+             ;;
+        no)  GhcBuild_i='NO'
+             ;;
+        *)   echo "I don't understand this option: --enable-user-way-i=$enableval"
+             exit 1
+             ;;
+    esac])
+
+AC_ARG_ENABLE(user-way-j,
+   [--enable-user-way-j    build for \`user way j' (mostly for implementors)],
+   [case "$enableval" in
+        yes) GhcBuild_j='YES'
+             ;;
+        no)  GhcBuild_j='NO'
+             ;;
+        *)   echo "I don't understand this option: --enable-user-way-j=$enableval"
+             exit 1
+             ;;
+    esac])
+
+AC_ARG_ENABLE(user-way-k,
+   [--enable-user-way-k    build for \`user way k' (mostly for implementors)],
+   [case "$enableval" in
+        yes) GhcBuild_k='YES'
+             ;;
+        no)  GhcBuild_k='NO'
+             ;;
+        *)   echo "I don't understand this option: --enable-user-way-k=$enableval"
+             exit 1
+             ;;
+    esac])
+
+AC_ARG_ENABLE(user-way-l,
+   [--enable-user-way-l    build for \`user way l' (mostly for implementors)],
+   [case "$enableval" in
+        yes) GhcBuild_l='YES'
+             ;;
+        no)  GhcBuild_l='NO'
+             ;;
+        *)   echo "I don't understand this option: --enable-user-way-l=$enableval"
+             exit 1
+             ;;
+    esac])
+
+AC_ARG_ENABLE(user-way-m,
+   [--enable-user-way-m    build for \`user way m' (mostly for implementors)],
+   [case "$enableval" in
+        yes) GhcBuild_m='YES'
+             ;;
+        no)  GhcBuild_m='NO'
+             ;;
+        *)   echo "I don't understand this option: --enable-user-way-m=$enableval"
+             exit 1
+             ;;
+    esac])
+
+AC_ARG_ENABLE(user-way-n,
+   [--enable-user-way-n    build for \`user way n' (mostly for implementors)],
+   [case "$enableval" in
+        yes) GhcBuild_n='YES'
+             ;;
+        no)  GhcBuild_n='NO'
+             ;;
+        *)   echo "I don't understand this option: --enable-user-way-n=$enableval"
+             exit 1
+             ;;
+    esac])
+
+AC_ARG_ENABLE(user-way-o,
+   [--enable-user-way-o    build for \`user way o' (mostly for implementors)],
+   [case "$enableval" in
+        yes) GhcBuild_o='YES'
+             ;;
+        no)  GhcBuild_o='NO'
+             ;;
+        *)   echo "I don't understand this option: --enable-user-way-o=$enableval"
+             exit 1
+             ;;
+    esac])
+
+AC_ARG_ENABLE(user-way-A,
+   [--enable-user-way-A    build for \`user way A' (mostly for implementors)],
+   [case "$enableval" in
+        yes) GhcBuild_A='YES'
+             ;;
+        no)  GhcBuild_A='NO'
+             ;;
+        *)   echo "I don't understand this option: --enable-user-way-A=$enableval"
+             exit 1
+             ;;
+    esac])
+
+AC_ARG_ENABLE(user-way-B,
+   [--enable-user-way-B    build for \`user way B' (mostly for implementors)],
+   [case "$enableval" in
+        yes) GhcBuild_B='YES'
+             ;;
+        no)  GhcBuild_B='NO'
+             ;;
+        *)   echo "I don't understand this option: --enable-user-way-B=$enableval"
+             exit 1
+             ;;
+    esac])
+
+dnl We do not use AC_SUBST to communicate the GhcBuild_* info,
+dnl as some seds (notably OSF) only allow 99 commands (!!!).
+dnl We will do the equivalent by a HACK further down.
+
+dnl AC_SUBST(GhcBuild_normal)
+dnl AC_SUBST(GhcBuild_p)
+dnl AC_SUBST(GhcBuild_t)
+dnl AC_SUBST(GhcBuild_u)
+dnl AC_SUBST(GhcBuild_mc)
+dnl AC_SUBST(GhcBuild_mr)
+dnl AC_SUBST(GhcBuild_mt)
+dnl AC_SUBST(GhcBuild_mp)
+dnl AC_SUBST(GhcBuild_mg)
+dnl AC_SUBST(GhcBuild_2s)
+dnl AC_SUBST(GhcBuild_1s)
+dnl AC_SUBST(GhcBuild_du)
 dnl AC_SUBST(GhcBuild_a)
 dnl AC_SUBST(GhcBuild_b)
 dnl AC_SUBST(GhcBuild_c)
@@ -1291,7 +1307,7 @@ dnl ** which Haskell compiler to bootstrap GHC with?
 # first, the defaults...
 WithGhcHc='haskell-compiler-unspecified'
 WithGhcHcType='HC_UNSPECIFIED'
-GhcBuilderVersion='26'
+GhcBuilderVersion='28'
 
 AC_ARG_WITH(hc-for-ghc,
    [
@@ -1534,9 +1550,100 @@ AC_ARG_ENABLE(ghci,
     esac])
 AC_SUBST(BuildGHCI)
 
+# Here, by HACK means, we dump all the GhcBuild_ info
+# into a file.  See comment above.
+rm -f ghc/mkworld/buildinfo.jm
+echo creating ghc/mkworld/buildinfo.jm
+cat > ghc/mkworld/buildinfo.jm <<EOF
+XCOMM ** DO NOT EDIT! **
+XCOMM This file is obliterated every time 'configure' is run!
+
+EOF
+for xx in normal p t u mc mr mt mp mg 2s 1s du a b c d e f g h i j k l m n o A B ; do
+    eval "yy=\$GhcBuild_$xx"
+    echo "#ifndef GhcBuild_$xx"     >> ghc/mkworld/buildinfo.jm
+    echo "#define GhcBuild_$xx $yy" >> ghc/mkworld/buildinfo.jm
+    echo "#endif"                  >> ghc/mkworld/buildinfo.jm
+done
+
 # here ends a very big if DoingGHC = 'ghc' ...
 fi
 
+# -------------------------------------------------------------------------
+dnl
+dnl * `HsLibs' CONFIGURATION STUFF
+
+if test "xxx$DoingHsLibs" = 'xxxhslibs' ; then
+# a very big "if"!
+
+dnl ** which Haskell compiler to use on hslibs?
+WithHsLibsHc='haskell-compiler-unspecified'
+WithHsLibsHcType='HC_UNSPECIFIED'
+
+AC_ARG_WITH(hc-for-hslibs,
+   [
+*******************************************************************
+** \`HsLibs' HASKELL LIBRARIES OPTIONS:
+
+The Haskell compiler to compile the Haskell Libraries suite; this
+option, if used, overrides --with-hc=<...>:
+
+    --with-hc-for-hslibs=<Haskell compiler>
+          ghc*     => Glasgow Haskell invoked by the name given
+                      and you want to use it un-installed ("in-place").],
+   [case "$withval" in
+        ghc* | glhc* )
+                WithHsLibsHc=$withval
+                ;;
+        in-place )
+                WithHsLibsHc='IN-PLACE'
+                ;;
+        *)      echo "I don't understand this option: --with-hc-for-hslibs=$withval"
+                exit 1
+                ;;
+    esac])
+
+# make sure that what they said makes sense.... set WithHsLibsHcType
+case $WithHsLibsHc in
+    haskell-compiler-unspecified ) # maybe they said something earlier...
+           if test $WithHc = 'haskell-compiler-unspecified' ; then
+               echo "Neither --with-hc nor --with-hc-for-hslibs was properly set"
+               exit 1
+           fi
+           ;;
+    ghc* | glhc* )
+           WithHsLibsHcType='HC_GLASGOW_GHC'
+            AC_CHECK_PROG(have_ghc_hslibs,$WithHsLibsHc,$ac_dir/$ac_word)
+            if test -z "$have_ghc_hslibs"; then
+                echo "Can't find Glasgow Haskell to compile HsLibs with: $WithHsLibsHc"
+               exit 1
+            fi
+            ;;
+    IN-PLACE) WithHsLibsHcType='HC_GLASGOW_GHC'
+           ;;
+esac
+AC_SUBST(WithHsLibsHc)
+AC_SUBST(WithHsLibsHcType)
+
+# Here, by HACK means, we dump all the GhcBuild_ info
+# into a file.  See comment above.
+rm -f hslibs/mkworld/buildinfo.jm
+echo creating hslibs/mkworld/buildinfo.jm
+cat > hslibs/mkworld/buildinfo.jm <<EOF
+XCOMM ** DO NOT EDIT! **
+XCOMM This file is obliterated every time 'configure' is run!
+
+EOF
+dnl Do not really know what to put here:
+dnl for xx in normal p t u mc mr mt mp mg 2s 1s du a b c d e f g h i j k l m n o A B ; do
+dnl     eval "yy=\$GhcBuild_$xx"
+dnl    echo "#ifndef GhcBuild_$xx"     >> ghc/mkworld/buildinfo.jm
+dnl    echo "#define GhcBuild_$xx $yy" >> ghc/mkworld/buildinfo.jm
+dnl    echo "#endif"               >> ghc/mkworld/buildinfo.jm
+dnl done
+
+# here ends a very big if DoingHsLibs = 'hslibs' ...
+fi
 #
 # -------------------------------------------------------------------------
 dnl
@@ -1816,8 +1923,7 @@ fi
 IncludeRealNoFibTests='YES'    # defaults
 IncludeSpectralNoFibTests='YES'
 IncludeImaginaryNoFibTests='YES'
-IncludePENDINGNoFibTests='NO'
-IncludeUNUSEDNoFibTests='NO'
+IncludeSpecialiseNoFibTests='NO'
 IncludeGHC_ONLYNoFibTests='NO'
 IncludePRIVATENoFibTests='NO'
 IncludeParallelNoFibTests='NO'
@@ -1830,15 +1936,13 @@ only if using GHC):
 
 --enable-all-tests    do *all* tests],
    [case "$enableval" in
-        yes) IncludePENDINGNoFibTests='YES'
-            IncludeUNUSEDNoFibTests='YES'
-            IncludeGHC_ONLYNoFibTests='YES'
+        yes) IncludeGHC_ONLYNoFibTests='YES'
+            IncludeSpecialiseNoFibTests='YES'
             IncludePRIVATENoFibTests='YES'
             IncludeParallelNoFibTests='YES'
              ;;
-        no) IncludePENDINGNoFibTests='NO'
-            IncludeUNUSEDNoFibTests='NO'
-            IncludeGHC_ONLYNoFibTests='NO'
+        no)  IncludeGHC_ONLYNoFibTests='NO'
+            IncludeSpecialiseNoFibTests='NO'
             IncludePRIVATENoFibTests='NO'
             IncludeParallelNoFibTests='NO'
 
@@ -1892,38 +1996,26 @@ AC_ARG_ENABLE(real-tests,
              ;;
     esac])
 
-AC_ARG_ENABLE(PENDING-tests,
-   [--enable-PENDING-tests    include PENDING tests],
-   [case "$enableval" in
-        yes) IncludePENDINGNoFibTests='YES'
-             ;;
-        no)  IncludePENDINGNoFibTests='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-PENDING-tests=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(UNUSED-tests,
-   [--enable-UNUSED-tests     include UNUSED tests],
+AC_ARG_ENABLE(GHC-ONLY-tests,
+   [--enable-GHC-ONLY-tests   include GHC_ONLY tests],
    [case "$enableval" in
-        yes) IncludeUNUSEDNoFibTests='YES'
+        yes) IncludeGHC_ONLYNoFibTests='YES'
              ;;
-        no)  IncludeUNUSEDNoFibTests='NO'
+        no)  IncludeGHC_ONLYNoFibTests='NO'
              ;;
-        *)   echo "I don't understand this option: --enable-UNUSED-tests=$enableval"
+        *)   echo "I don't understand this option: --enable-GHC-ONLY-tests=$enableval"
              exit 1
              ;;
     esac])
 
-AC_ARG_ENABLE(GHC-ONLY-tests,
-   [--enable-GHC-ONLY-tests   include GHC_ONLY tests],
+AC_ARG_ENABLE(specialise-tests,
+   [--enable-specialise-tests  include specialisation tests],
    [case "$enableval" in
-        yes) IncludeGHC_ONLYNoFibTests='YES'
+        yes) IncludeSpecialiseNoFibTests='YES'
              ;;
-        no)  IncludeGHC_ONLYNoFibTests='NO'
+        no)  IncludeSpecialiseNoFibTests='NO'
              ;;
-        *)   echo "I don't understand this option: --enable-GHC-ONLY-tests=$enableval"
+        *)   echo "I don't understand this option: --enable-specialise-tests=$enableval"
              exit 1
              ;;
     esac])
@@ -1953,15 +2045,31 @@ AC_ARG_ENABLE(parallel-tests,
              ;;
     esac])
 
-AC_SUBST(IncludeRealNoFibTests)
-AC_SUBST(IncludeSpectralNoFibTests)
-AC_SUBST(IncludeImaginaryNoFibTests)
-AC_SUBST(IncludePENDINGNoFibTests)
-AC_SUBST(IncludeUNUSEDNoFibTests)
-AC_SUBST(IncludeGHC_ONLYNoFibTests)
-AC_SUBST(IncludeSpecialiseNoFibTests)
-AC_SUBST(IncludePRIVATENoFibTests)
-AC_SUBST(IncludeParallelNoFibTests)
+dnl not AC_SUBSTd because of 99-command seds (sigh)
+dnl (See what follows instead)
+dnl AC_SUBST(IncludeRealNoFibTests)
+dnl AC_SUBST(IncludeSpectralNoFibTests)
+dnl AC_SUBST(IncludeImaginaryNoFibTests)
+dnl AC_SUBST(IncludeGHC_ONLYNoFibTests)
+dnl AC_SUBST(IncludeSpecialiseNoFibTests)
+dnl AC_SUBST(IncludePRIVATENoFibTests)
+dnl AC_SUBST(IncludeParallelNoFibTests)
+
+# Here, by HACK means, we dump all the Include*NoFibTests info
+# into a file.  See comment above.
+rm -f nofib/mkworld/buildinfo.jm
+echo creating nofib/mkworld/buildinfo.jm
+cat > nofib/mkworld/buildinfo.jm <<EOF
+XCOMM ** DO NOT EDIT! **
+XCOMM This file is obliterated every time 'configure' is run!
+
+EOF
+for xx in Real Spectral Imaginary GHC_ONLY Specialise PRIVATE Parallel ; do
+    eval "yy=\$Include${xx}NoFibTests"
+    echo "#ifndef Include${xx}NoFibTests"     >> nofib/mkworld/buildinfo.jm
+    echo "#define Include${xx}NoFibTests $yy" >> nofib/mkworld/buildinfo.jm
+    echo "#endif"                            >> nofib/mkworld/buildinfo.jm
+done
 
 # here ends a very big if DoingNoFib = 'nofib' ...
 fi
@@ -1972,7 +2080,7 @@ dnl * extract non-header files with substitution (end)
 #
 AC_SUBST(MkWorldSetup)
 
-AC_OUTPUT(Makefile STARTUP mkworld/site.jm mkworld/platform.h mkworld/config.h $ghc_mkworld_site_ghc_jm $ghc_includes_platform_h $nofib_mkworld_site_nofib_jm)
+AC_OUTPUT(Makefile STARTUP mkworld/site.jm mkworld/platform.h mkworld/config.h $ghc_mkworld_site_ghc_jm $ghc_includes_platform_h $hslibs_mkworld_site_hslibs_jm $nofib_mkworld_site_nofib_jm)
 
 echo '************************************************'
 echo '*** NOW DO: sh < STARTUP'
index e2d68ee..f6bae9d 100644 (file)
@@ -1,7 +1,5 @@
 #define IHaveSubdirs
 
-MsubNeededHere( ./glue_TAGS_files )
-
 /* order in SUBDIRS is not supposed to be important but ...
        "compiler" must be before "lib", because we use
        the compiler just built to compile pieces of "lib".
@@ -38,10 +36,3 @@ SUBDIRS = includes \
 whoami::
        @echo using a \`$(BUILDPLATFORM)\' host to build a Haskell compiler to run on a
        @echo \`$(HOSTPLATFORM)\' host that will generate \`C\' target code
-
-fulltags : ./glue_TAGS_files
-       $(RM) ./TAGS
-       ./glue_TAGS_files `find . -type f -name TAGS -print`
-
-/* this line makes sure perl gets picked up from the right place */
-MsubProgramScriptTarget(PerlCmd,./glue_TAGS_files,./glue_TAGS_files.prl,,)
index 8d0e797..72b7dbf 100644 (file)
@@ -40,7 +40,7 @@ JMAKE_CMD = $(NEWTOP)$(JMAKE) -I$(NEWTOP)$(JMAKESRC) $(BOOTSTRAPCFLAGS) -DTopDir
 Makefile:: $(JMAKE)
 
 $(JMAKE):
-       @(cd $(JMAKESRC); if [ -f Makefile ]; then \
+       @(cd $(JMAKESRC) && if [ -f Makefile ]; then \
        echo "checking $@ in $(JMAKESRC) first..."; $(MAKE) all; else \
        echo "bootstrapping $@ from Makefile.BOOT in $(JMAKESRC) first..."; \
        $(MAKE) -f Makefile.BOOT BOOTSTRAPCFLAGS=$(BOOTSTRAPCFLAGS); fi; \
index 936caf5..916eaba 100644 (file)
@@ -1 +1,2 @@
-The Glamorous Glasgow Haskell Compiler, version 0.27, patchlevel 0
+The Glamorous Glasgow Haskell Compiler, version 2.01, patchlevel 0
+(for Haskell 1.3)
index ccc3edb..ea726df 100644 (file)
@@ -1,6 +1,6 @@
-This is version 0.26 of the Glorious Glasgow Haskell compilation
+This is version 2.01 of the Glorious Glasgow Haskell compilation
 system (GHC).  This is a major public release.  The top-level file
-"ANNOUNCE-0.26" says more.
+"ANNOUNCE-0.28" says more.
 
 Haskell is "the" standard lazy functional programming language [see
 SIGPLAN Notices, May 1992]. Some general merits of GHC are given at
index 799f3e0..9e9510c 100644 (file)
@@ -2,6 +2,7 @@
 
 /* just documents here */
 #define NoAllTargetForSubdirs
+#define NoDependTargetForSubdirs
 #define NoRunTestsTargetForSubdirs
 #define NoInstallTargetForSubdirs
 #define NoTagTargetForSubdirs
index 13df5b5..5cdd189 100644 (file)
@@ -1,5 +1,5 @@
 %
-% $Header: /srv/cvs/cvs.haskell.org/fptools/ghc/docs/install_guide/Attic/installing.lit,v 1.1 1996/01/08 20:25:19 partain Exp $
+% $Header: /srv/cvs/cvs.haskell.org/fptools/ghc/docs/install_guide/Attic/installing.lit,v 1.2 1996/06/27 15:57:32 partain Exp $
 %
 \begin{onlystandalone}
 \documentstyle[11pt,literate]{article}
@@ -12,7 +12,7 @@ University of Glasgow\\
 Glasgow, Scotland\\
 G12 8QQ\\
 \\
-Email: glasgow-haskell-\{request,bugs\}\@dcs.glasgow.ac.uk}
+Email: glasgow-haskell-\{users,bugs\}-request\@dcs.glasgow.ac.uk}
 \maketitle
 \begin{rawlatex}
 \tableofcontents
index 16e4d24..b98df34 100644 (file)
@@ -8,7 +8,7 @@ University of Glasgow\\
 Glasgow, Scotland\\
 G12 8QQ\\
 \\
-Email: glasgow-haskell-\{bugs,request\}\@dcs.glasgow.ac.uk}
+Email: glasgow-haskell-\{users,bugs\}-request\@dcs.glasgow.ac.uk}
 \maketitle
 \begin{rawlatex}
 \tableofcontents
index 3767205..c51193a 100644 (file)
@@ -349,8 +349,8 @@ data StateAndFloat#  s     = StateAndFloat#  (State# s) Float#
 data StateAndDouble# s     = StateAndDouble# (State# s) Double#  
 data StateAndAddr#   s     = StateAndAddr#   (State# s) Addr#
 
-data StateAndStablePtr# s a = StateAndStablePtr# (State# s) (StablePtr# a)
-data StateAndMallocPtr# s   = StateAndMallocPtr# (State# s) MallocPtr#
+data StateAndStablePtr# s a = StateAndStablePtr#  (State# s) (StablePtr# a)
+data StateAndForeignObj# s  = StateAndForeignObj# (State# s) ForeignObj#
 data StateAndSynchVar#  s a = StateAndSynchVar#  (State# s) (SynchVar# a)
 
 data StateAndArray#            s elt = StateAndArray#        (State# s) (Array# elt) 
@@ -461,47 +461,68 @@ deRefStablePointer# :: StablePtr# a -> State# _RealWorld -> StateAndPtr _RealWor
 @
 There is also a C procedure @FreeStablePtr@ which frees a stable pointer.
 
-\subsubsection{``Malloc'' pointers}
+%
+% Rewritten and updated for MallocPtr++ -- 4/96 SOF
+%
+\subsubsection{Foreign objects}
 
-A ``malloc'' pointer is an ordinary pointer from outside the Haskell world
-(i.e., from the C world) where the Haskell world has been told ``Let me
+A \tr{ForeignObj} is a reference to an object outside the Haskell
+world (i.e., from the C world, or a reference to an object on another
+machine completely.), where the Haskell world has been told ``Let me
 know when you're finished with this ...''.
 
-The ``malloc'' pointer type is just a special @Addr#@ ({\em not} parameterised).
+The \tr{ForeignObj} type is just a special @Addr#@ ({\em not} parameterised).
 @
-type MallocPtr#
+type ForeignObj#
 @
-{\em ToDo: say more about this and how it's used...}
 
-The main point is that when Haskell discards a 
-value of type @MallocPtr#@, it calls the procedure @FreeMallocPtr@, which
-must be provided by the C world.  @FreeMallocPtr@ might in turn call
-the GHC-provided procedure @FreeStablePtr@, to deallocate a stable pointer.
-No other GHC runtime system procedures should be called by @FreeMallocPtr@.
+A typical use of \tr{ForeignObj} is in constructing Haskell bindings
+to external libraries. A good example is that of writing a binding to
+an image-processing library (which was actually the main motivation
+for implementing \tr{ForeignObj}'s precursor, \tr{MallocPtr}). The
+images manipulated are not stored in the Haskell heap, either because
+the library insist on allocating them internally or we (sensibly)
+decide to spare the GC from having to heave heavy images around.
 
-(Implementation: a linked list of all @MallocPtr#@s is maintained to allow the
-garbage collector to detect when a @MallocPtr#@ becomes garbage.)
+@
+data Image = Image ForeignObj#
 
-Like @Array@, @MallocPtr#@s are represented by heap objects.
+instance _CCallable Image
+@
 
-{\bf ToDo --- Important:} Ian Poole reports a need for functions to return a list of
-CHPs.  Should we add a @CHeapPtrArray@ type too? or just
-hack something up?
+The \tr{ForeignObj#} type is then used to refer to the externally
+allocated image, and to acheive some type safety, the Haskell binding
+defines the @Image@ data type. So, a value of type \tr{ForeignObj#} is
+used to ``box'' up an external reference into a Haskell heap object
+that we can then indirectly reference:
 
-The only Haskell operation we might want on @MallocPtr#@s is an
-equality test.  However, this is easily implemented if desired:
 @
->      eqCHP x y = (_runST (_ccall_ equal x y) == 1::Int)
+createImage :: (Int,Int) -> PrimIO Image
+@
+
+So far, this looks just like an @Addr#@ type, but \tr{ForeignObj#}
+offers a bit more, namely that we can specify a {\em finalisation
+routine} to invoke when the \tr{ForeignObj#} is discarded by the
+GC. The garbage collector invokes the finalisation routine associated
+with the \tr{ForeignObj#}, saying `` Thanks, I'm through with this
+now..'' For the image-processing library, the finalisation routine could for
+the images free up memory allocated for them. The finalisation routine has
+currently to be written in C (the finalisation routine can in turn call on
+@FreeStablePtr@ to deallocate a stable pointer.).
 
-C>     equal (x, y)
-C>     {
-C>     return (x == y ? 1 : 0);
-C>     }
+Associating a finalisation routine with an external object is done by 
+\tr{makeForeignObj#}:
+
+@
+makeForeignObj# :: Addr# -- foreign reference
+                -> Addr# -- pointer to finalisation routine
+               -> StateAndForeignObj# _RealWorld ForeignObj#
 @
 
-The C world must provide a function @FreeCHeapPointer@ which
-will be called (with a C Heap pointer as argument) when the garbage
-collector releases a CHP.
+(Implementation: a linked list of all @ForeignObj#@s is maintained to allow the
+ garbage collector to detect when a @ForeignObj#@ becomes garbage.)
+
+Like @Array@, @ForeignObj#@s are represented by heap objects.
 
 {\bf ToDo:} Decide whether @FreeCHeapPointer@ is allowed to call on a
 stable pointer. (I sincerely hope not since we will still be in the
@@ -803,14 +824,14 @@ writeCharArray  :: Ix ix => _MutableByteArray s ix -> ix -> Char -> _ST s ()
 
 @
 freezeArray :: Ix ix => _MutableArray s ix elt -> _ST s (Array ix elt)
-freezeCharArray :: Ix ix => _MutableByteArray s ix -> _ST s (_ByteArray ix Char)
+freezeCharArray :: Ix ix => _MutableByteArray s ix -> _ST s (_ByteArray ix)
 ...
 @
 
 We have no need on one-function-per-type for unsafe freezing:
 @
 unsafeFreezeArray :: Ix ix => _MutableArray s ix elt -> _ST s (Array ix elt)  
-unsafeFreezeByteArray :: Ix ix => _MutableByteArray s ix -> _ST s (_ByteArray ix elt)
+unsafeFreezeByteArray :: Ix ix => _MutableByteArray s ix -> _ST s (_ByteArray ix)
 @
 
 Sometimes we want to snaffle the bounds of one of these beasts:
@@ -854,11 +875,13 @@ makeStablePointer :: a -> _StablePtr a
 freeStablePointer :: _StablePtr a -> PrimIO ()
 @
 
-\subsection{``Malloc'' pointers}
+\subsection{Foreign objects}
 
 Again, just boxing up.
 @
-data _MallocPtr = _MallocPtr MallocPtr#
+data _ForeignObj = _ForeignObj ForeignObj#
+
+makeForeignObj :: _Addr -> _Addr -> PrimIO _ForeignObj
 @
 
 \subsection{C calls}
@@ -899,22 +922,22 @@ table summarises (including the standard boxed-primitive types):
 Boxed              Type of transferd   Corresp.     Which is
 Type               Prim. component     C type       *probably*...
 ------             ---------------     ------       -------------
-Char               Char#               StgChar      unsigned char
-Int                Int#                StgInt       long int
-_Word              Word#               StgWord      unsigned long int
-_Addr              Addr#               StgAddr      char *
-Float              Float#              StgFloat     float
-Double             Double#             StgDouble    double
-
-Array              Array#              StgArray     StgPtr
-_ByteArray         ByteArray#          StgByteArray StgPtr
-_MutableArray      MutableArray#       StgArray     StgPtr
-_MutableByteArray   MutableByteArray#  StgByteArray StgPtr
+Char               Char#               StgChar       unsigned char
+Int                Int#                StgInt        long int
+_Word              Word#               StgWord       unsigned long int
+_Addr              Addr#               StgAddr       char *
+Float              Float#              StgFloat      float
+Double             Double#             StgDouble     double
+
+Array              Array#              StgArray      StgPtr
+_ByteArray         ByteArray#          StgByteArray  StgPtr
+_MutableArray      MutableArray#       StgArray      StgPtr
+_MutableByteArray   MutableByteArray#  StgByteArray  StgPtr
 
 _State             State#              nothing!
 
-_StablePtr         StablePtr#          StgStablePtr StgPtr
-_MallocPtr         MallocPtr#          StgMallocPtr StgPtr
+_StablePtr         StablePtr#          StgStablePtr  StgPtr
+_ForeignObj        ForeignObj#         StgForeignObj StgPtr
 @
 
 All of the above are {\em C-returnable} except:
@@ -959,8 +982,10 @@ are stored on the heap.
 
 ... details omitted ...
 
-More importantly, it must construct a C Heap Pointer heap-object after
-a @_ccall_@ which returns a @MallocPtr#@.
+%
+%More importantly, it must construct a C Heap Pointer heap-object after
+%a @_ccall_@ which returns a @MallocPtr#@.
+%
 
 %--------------------------------------------------------
 \section{Non-primitive stuff that must be wired into GHC}
@@ -977,7 +1002,7 @@ data Integer = J# Int# Int# ByteArray#
 
 -- and the other boxed-primitive types:
     Array, _ByteArray, _MutableArray, _MutableByteArray,
-    _StablePtr, _MallocPtr
+    _StablePtr, _ForeignObj
 
 data Bool     = False | True
 data CMP_TAG# = LT# | EQ# | GT#  -- used in derived comparisons
index 4403d20..960d3b7 100644 (file)
@@ -52,7 +52,7 @@ This is a bug just as surely as a ``panic.'' Please report it.
 \item[``Some confusion about a value specialised to a type...''  Huh???]
 (A deeply obscure and unfriendly error message.)
 
-This message crops up when the typechecker is sees a reference in an
+This message crops up when the typechecker sees a reference in an
 interface pragma to a specialisation of an overloaded value
 (function); for example, \tr{elem} specialised for type \tr{[Char]}
 (\tr{String}).  The problem is: it doesn't {\em know} that such a
index 21d8ca6..0f870b4 100644 (file)
@@ -53,6 +53,12 @@ declared in the module. If no group is specified it defaults to the
 module name.
 \end{description}
 
+In addition to the \tr{-prof} option your system might be setup to
+enable you to compile and link with the \tr{-prof-details}
+\index{\tr{-prof-details option}} option instead. This enables
+additional detailed counts to be reported with the \tr{-P} RTS option.
+%-prof-details should also enable age profiling if we get it going again ...
+
 %Alternative profiling semantics have also been implemented. To use
 %these the runtime system and prelude libraries must have been built
 %for the alternative profiling setup. This is done using a particular
index a246b38..868c98c 100644 (file)
@@ -3,7 +3,7 @@
 %
 
 When you run your profiled program with the \tr{-p} RTS option
-\index{\tr{-p<sort> RTS option (profiling)}, you get the following
+\index{\tr{-p<sort> RTS option (profiling)}}, you get the following
 information about your ``cost centres'':
 
 \begin{description}
@@ -19,12 +19,6 @@ different modules.
 How many times this cost-centre was entered; think
 of it as ``I got to the \tr{_scc_} construct this many times...''
 %-------------------------------------------------------------
-\item[\tr{subcc}:]
-How many times this cost-centre ``passed control'' to another
-cost-centre; for example, \tr{scc=4} plus \tr{subscc=8} means
-``This \tr{_scc_} was entered four times, but went out to
-other \tr{_scc_s} eight times.''
-%-------------------------------------------------------------
 \item[\tr{%time}:]
 What part of the time was spent in this cost-centre (see also ``ticks,''
 below).
@@ -32,18 +26,43 @@ below).
 \item[\tr{%alloc}:]
 What part of the memory allocation was done in this cost-centre
 (see also ``bytes,'' below).
+%-------------------------------------------------------------
+\item[\tr{inner}:]
+How many times this cost-centre ``passed control'' to an inner
+cost-centre; for example, \tr{scc=4} plus \tr{subscc=8} means
+``This \tr{_scc_} was entered four times, but went out to
+other \tr{_scc_s} eight times.''
+%-------------------------------------------------------------
+\item[\tr{cafs}:]
+How many CAFs this cost centre evaluated.
+%-------------------------------------------------------------
+\item[\tr{dicts}:]
+How many dictionaries this cost centre evaluated.
+\end{description}
+
+In addition you can use the \tr{-P} RTS option \index{\tr{-P<sort> RTS
+    option (profiling)}} to get the following additional information: 
+\begin{description}
+%-------------------------------------------------------------
+\item[\tr{ticks}:]  The raw number of time ``ticks'' which were
+attributed to this cost-centre; from this, we get the \tr{%time}
+figure mentioned above.
+%-------------------------------------------------------------
+\item[\tr{bytes}:] Number of bytes allocated in the heap while in
+this cost-centre; again, this is the raw number from which we
+get the \tr{%alloc} figure mentioned above.
 \end{description}
 
-If you use the \tr{-P} RTS option
-\index{\tr{-P<sort> RTS option (profiling)}, you will also get the
-following information:
+Finally if you built your program with \tr{-prof-details}
+\index{\tr{-prof-details option}} the \tr{-P} RTS option will also
+produce the following information:
 \begin{description}
 %-------------------------------------------------------------
-\item[\tr{cafcc}:] Two columns, analogous to the \tr{scc} and \tr{subcc}
-columns, except these are for CAF cost-centres: the first column
-is how many times this top-level CAF cost-centre was entered;
-the second column is how many times this cost-centre (CAF or otherwise)
-entered another CAF cost-centre.
+\item[\tr{closures}:]
+How many heap objects were allocated; these objects may be of varying
+size.  If you divide the number of bytes (mentioned below) by this
+number of ``closures'', then you will get the average object size.
+(Not too interesting, but still...)
 %-------------------------------------------------------------
 \item[\tr{thunks}:]
 How many times we entered (evaluated) a thunk---an unevaluated
@@ -60,18 +79,4 @@ How many times we entered (evaluated) a partial application (PAP), i.e.,
 a function applied to fewer arguments than it needs.  For example, \tr{Int}
 addition applied to one argument would be a PAP.  A PAP is really
 just a particular form for a function.
-%-------------------------------------------------------------
-\item[\tr{closures}:]
-How many heap objects were allocated; these objects may be of varying
-size.  If you divide the number of bytes (mentioned below) by this
-number of ``closures'', then you will get the average object size.
-(Not too interesting, but still...)
-%-------------------------------------------------------------
-\item[\tr{ticks}:]  The raw number of time ``ticks'' which were
-attributed to this cost-centre; from this, we get the \tr{%time}
-figure mentioned above.
-%-------------------------------------------------------------
-\item[\tr{bytes}:] Number of bytes allocated in the heap while in
-this cost-centre; again, this is the raw number from which we
-get the \tr{%alloc} figure mentioned above.
 \end{description}
index 022d4e3..12325d5 100644 (file)
@@ -64,10 +64,10 @@ The heap space profile may be broken down by different criteria:
 \item[\tr{-hG}:] cost centre group which produced the closure.
 \item[\tr{-hD}:] closure description --- a string describing the closure.
 \item[\tr{-hY}:] closure type --- a string describing the closure's type.
-\item[\tr{-hT<ints>,<start>}:] the time interval the closure was
-created. \tr{<ints>} specifies the no. of interval bands plotted
-(default 18) and \tr{<start>} the number of seconds after which the
-reported intervals start (default 0.0).
+%\item[\tr{-hT<ints>,<start>}:] the time interval the closure was
+%created. \tr{<ints>} specifies the no. of interval bands plotted
+%(default 18) and \tr{<start>} the number of seconds after which the
+%reported intervals start (default 0.0).
 \end{description}
 By default all live closures in the heap are profiled, but particular
 closures of interest can be selected (see below). 
@@ -107,14 +107,14 @@ Selects closures which are of one of the specified closure kinds.
 Valid closure kinds are \tr{CON} (constructor), \tr{FN} (manifest
 function), \tr{PAP} (partial application), \tr{BH} (black hole) and
 \tr{THK} (thunk).
-\item[\tr{-a<age>}:]
-\index{-a<age> RTS option (profiling)}
-Selects closures which have survived \pl{<age>} complete intervals.
+%\item[\tr{-a<age>}:]
+%\index{-a<age> RTS option (profiling)}
+%Selects closures which have survived \pl{<age>} complete intervals.
 \end{description}
 The space occupied by a closure will be reported in the heap profile
 if the closure satisfies the following logical expression:
 \begin{display}
-([-c] or [-m] or [-g]) and ([-d] or [-y] or [-k]) and [-a]
+([-c] or [-m] or [-g]) and ([-d] or [-y] or [-k]) %and [-a]
 \end{display}
 where a particular option is true if the closure (or its attached cost
 centre) is selected by the option (or the option is not specified).
index 68d4a7e..9f55739 100644 (file)
@@ -8,7 +8,7 @@ University of Glasgow\\
 Glasgow, Scotland\\
 G12 8QQ\\
 \\
-Email: glasgow-haskell-\{bugs,request\}\@dcs.glasgow.ac.uk}
+Email: glasgow-haskell-\{users,bugs\}-request\@dcs.glasgow.ac.uk}
 \maketitle
 \begin{rawlatex}
 \tableofcontents
index 51f63e2..858a12b 100644 (file)
@@ -8,7 +8,7 @@ University of Glasgow\\
 Glasgow, Scotland\\
 G12 8QQ\\
 \\
-Email: glasgow-haskell-\{bugs,request\}\@dcs.glasgow.ac.uk}
+Email: glasgow-haskell-\{bugs,users\}-request\@dcs.glasgow.ac.uk}
 \maketitle
 \begin{rawlatex}
 \tableofcontents
index d007621..6ec326e 100644 (file)
@@ -27,7 +27,9 @@ HCFLAGS = -fhaskell-1.3 -cpp -hi-diffs $(EXTRA_HC_OPTS)
 SRCS = Main.lhs Foo.lhs Bar.lhs
 OBJS = Main.o   Foo.o   Bar.o
 
-.SUFFIXES : .o .lhs
+.SUFFIXES : .o .hi .lhs
+.o.hi:
+       @:
 .lhs.o:
         $(RM) $@
         $(HC) -c $< $(HCFLAGS)
@@ -37,6 +39,14 @@ cool_pgm : $(OBJS)
         $(HC) -o $@ $(HCFLAGS) $(OBJS)
 \end{verbatim}
 
+Note the cheesy \tr{.o.hi} rule: It records the dependency of the
+interface (\tr{.hi}) file on the source.  The rule says a \tr{.hi}
+file can be made from a \tr{.o} file by doing... nothing.  Which is
+true.
+
+(Sophisticated \tr{make} variants may achieve some of the above more
+elegantly.  What we've shown should work with any \tr{make}.)
+
 The only thing lacking in the above \tr{Makefile} is interface-file
 dependencies.  If \tr{Foo.lhs} imports module \tr{Bar} and the
 \tr{Bar} interface changes, then \tr{Foo.lhs} needs to be recompiled.
@@ -64,6 +74,9 @@ effect.  However, a \tr{make} run that does nothing {\em does} mean
 mutually-recursive modules but, again, it may take multiple
 iterations to ``settle.''
 
+To see \tr{mkdependHS}'s command-line flags, give it a duff flag,
+e.g., \tr{mkdependHS -help}.
+
 %************************************************************************
 %*                                                                      *
 \subsection[hstags]{Emacs `TAGS' for Haskell: \tr{hstags}}
index c4fc5e5..912e2df 100644 (file)
@@ -362,13 +362,13 @@ Here is our ``crib sheet'' for converting 1.2 I/O to 1.3.  In most cases,
 it's really easy.
 \begin{enumerate}
 \item
-Change \tr{readChan stdin} to \tr{hGetContents stdin}.
+Change \tr{readChan stdin} to \tr{getContents}.
 \item
 Change \tr{appendChan stdout} to \tr{putStr}, which is equivalent to
 \tr{hPutStr stdout}.
 Change \tr{appendChan stderr} to \tr{hPutStr stderr}.
 \item
-You need to \tr{import LibSystem} if you used @getArgs@, @getEnv@,
+You need to \tr{import System} if you used @getArgs@, @getEnv@,
 or @getProgName@.
 \item
 Assuming continuation-style @Dialogue@ code, change \tr{... exit done $}
@@ -378,6 +378,36 @@ If you had any functions named \tr{(>>)}, \tr{(>>=)}, or \tr{return},
 change them to something else.
 \end{enumerate}
 
+Also:
+1.3 I/O all the way.
+\tr{Dialogue} usually turns into \tr{IO ()}.
+Use of \tr{StatusFile} request: rewrite (no equivalent exists).
+Add \tr{import Ratio} if you use \tr{Rationals} at all.
+Ditto: \tr{import Complex} if you use complex numbers.
+Ditto: \tr{import Array} if you use arrays.  Also: note that
+Arrays now use ordinary pairs, rather than a separate \tr{Assoc} type.
+May be easier to do:
+infix 1 =:
+(=:) a b = (a,b)
+and switch := to =:
+This can happen: \tr{LiteralInt.leStringToInt}; add spaces.
+For \tr{minInt}/\tr{maxInt}, \tr{minChar}/\tr{maxChar} (???)
+use the \tr{Bounded} class methods, \tr{minBound} and \tr{maxBound}.
+Replace class \tr{Text} with \tr{Show}; on rare occasions,
+you may need to do something for \tr{Read}, too.
+The functions \tr{ord} and \tr{chr} have been replaced by
+the class methods \tr{fromEnum} and \tr{toEnum}, respectively.
+The changes, however, can lead to ambiguous overloading.
+Need \tr{import IO} for anything interesting.
+What was called \tr{handle} is now called \tr{catch}.
+New keyword: \tr{do}.
+Other clashes: e.g., \tr{seq}, \tr{fail}.
+\tr{readDec} no longer exists; use ???.
+Type of \tr{fail} changed?
+\tr{(a `op` b) c = ...} is bogus.
+`failWith x' now `fail x'
+`fail x' now `fail (userError x)'
+
 %************************************************************************
 %*                                                                      *
 \subsection[nonio-1-3]{Non-I/O things from the 1.3-DRAFT proposal}
@@ -444,10 +474,10 @@ The error type is called \tr{IOError13}, rather than \tr{IOError}
 so...)  You probably shouldn't be messing with \tr{IOError} much,
 anyway.
 
-Some of the 1.3 I/O code, notably the Extremely Cool \tr{LibPosix}
+Some of the 1.3 I/O code, notably the Extremely Cool \tr{Posix}
 stuff, is relatively untested.  Go for it, but be wary...
-\index{LibPosix bugs}
-\index{bugs, LibPosix}
+\index{Posix library bugs}
+\index{bugs, Posix library}
 
 %************************************************************************
 %*                                                                     *
@@ -470,7 +500,7 @@ required) and put into \tr{Lib*} interfaces (import required).
 
 GHC~0.26 still provides the I/O functions via \tr{Prelude.hi} (no
 import required).  Ignore the ``June draft'' pleadings for
-\tr{import LibIO}, and you'll be fine.
+\tr{import IO}, and you'll be fine.
 
 {\em There is no guarantee that the final 1.3 proposal will look
 anything like the current DRAFT.}  It ain't a standard until the fat
@@ -557,11 +587,11 @@ with \tr{-fhaskell-1.3}...)
 
 To subvert the above process, you need only provide
 a @mainPrimIO :: PrimIO ()@ of your own
-(in a module named \tr{Main}).  Do {\em not} use a \tr{-fhaskell-1.3} flag!
+(in a module named \tr{GHCmain}).  Do {\em not} use a \tr{-fhaskell-1.3} flag!
 
 Here's a little example, stolen from Alastair Reid:
 \begin{verbatim}
-module Main ( mainPrimIO ) where
+module GHCmain ( mainPrimIO ) where
 
 import PreludeGlaST
 
index 97e9100..5070553 100644 (file)
@@ -1,29 +1,19 @@
 /* stuff to have before we get going */
 MsubNeededHere(ghc)
-#if BuildDataParallelHaskell == YES
-MsubNeededHere(dphc)
-#endif
-LitStuffNeededHere(depend)
+UnlitNeededHere(depend)
 InfoStuffNeededHere(docs)
 
 DYN_LOADABLE_BITS = \
-       ghc-asm-sparc.prl \
-       ghc-asm-solaris.prl \
-       ghc-asm-m68k.prl \
        ghc-asm.prl \
-       ghc-asm-alpha.prl \
-       ghc-asm-hppa.prl \
-       ghc-asm-mips.prl \
+       ghc-recomp.prl \
+       ghc-iface.prl \
        ghc-consist.prl \
        ghc-split.prl
 
 /* Literate-pgmming suffix rules used herein */
-LitSuffixRule(.lprl,.prl)
+UnlitSuffixRule(.lprl,.prl)
 
 MsubMakefileDependentProgramScriptTarget(PerlCmd,ghc,ghc.prl,/*no flags*/,/*Makefile*/)
-#if BuildDataParallelHaskell == YES
-MsubMakefileDependentProgramScriptTarget(PerlCmd,dphc,dphc.prl,,/*Makefile*/)
-#endif
 AllTarget( $(DYN_LOADABLE_BITS) )
 
 /* installation is hackish: because we may want to install w/ a diff name */
@@ -36,13 +26,6 @@ install::
        $(MV) $(INSTBINDIR_GHC)/ghc-v-temp-name $(INSTBINDIR_GHC)/$(GHC_DRIVER_INST_NAME)
        $(RM) $(INSTBINDIR_GHC)/ghc-v-temp-name
 
-#if BuildDataParallelHaskell == YES
-InstallMsubbedScriptTarget(PerlCmd,dphc-v-temp-name,dphc.prl,$(INSTBINDIR_GHC))
-install::
-       $(MV) $(INSTBINDIR_GHC)/dphc-v-temp-name $(INSTBINDIR_GHC)/dphc
-       $(RM) $(INSTBINDIR_GHC)/dphc-v-temp-name
-#endif /* DPH */
-
 dyn_loadable_bits : $(DYN_LOADABLE_BITS)
 
 InstallMultNonExecTargets(dyn_loadable_bits, $(DYN_LOADABLE_BITS), $(INSTLIBDIR_GHC))
@@ -60,5 +43,3 @@ ClearTagsFile()
 
 DYN_LOADABLE_LPRLS = $(DYN_LOADABLE_BITS:.prl=.lprl)
 PerlTagsTarget( ghc.lprl $(DYN_LOADABLE_LPRLS) )
-
-LitDocRootTargetWithNamedOutput(driver,lit,driver-standalone)
diff --git a/ghc/driver/driver.lit b/ghc/driver/driver.lit
deleted file mode 100644 (file)
index ca4a876..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-\begin{onlystandalone}
-\documentstyle[11pt,literate,a4wide]{article}
-\begin{document}
-\title{Driver: @ghc@}
-\author{The GRASP team}
-\date{January 1993}
-\maketitle
-\begin{rawlatex}
-\tableofcontents
-\end{rawlatex}
-\end{onlystandalone}
-
-\begin{onlypartofdoc}
-\section[Driver-for-compilation-system]{@ghc@: Driver for the compilation system}
-\downsection
-\end{onlypartofdoc}
-
-\input{ghc.lprl}
-
-\section[Driver-support]{Support code for the @ghc@ driver}
-\downsection
-\input{ghc-asm.lprl}
-\input{ghc-consist.lprl}
-\input{ghc-split.lprl}
-\upsection
-
-\begin{onlypartofdoc}
-\upsection
-\end{onlypartofdoc}
-\begin{onlystandalone}
-\printindex
-\end{document}
-\end{onlystandalone}
diff --git a/ghc/driver/ghc-asm-alpha.lprl b/ghc/driver/ghc-asm-alpha.lprl
deleted file mode 100644 (file)
index 23ee45a..0000000
+++ /dev/null
@@ -1,521 +0,0 @@
-%************************************************************************
-%*                                                                     *
-\section[Driver-asm-fiddling]{Fiddling with assembler files (alpha)}
-%*                                                                     *
-%************************************************************************
-
-Tasks:
-\begin{itemize}
-\item
-Utterly stomp out C functions' prologues and epilogues; i.e., the
-stuff to do with the C stack.
-\item
-Any other required tidying up.
-\end{itemize}
-
-\begin{code}
-sub mangle_asm {
-    local($in_asmf, $out_asmf) = @_;
-
-    # multi-line regexp matching:
-    local($*) = 1;
-    local($i, $c);
-    &init_FUNNY_THINGS();
-
-    open(INASM, "< $in_asmf")
-       || &tidy_up_and_die(1,"$Pgm: failed to open `$in_asmf' (to read)\n");
-    open(OUTASM,"> $out_asmf")
-       || &tidy_up_and_die(1,"$Pgm: failed to open `$out_asmf' (to write)\n");
-
-    # read whole file, divide into "chunks":
-    #  record some info about what we've found...
-
-    @chk = ();         # contents of the chunk
-    $numchks = 0;      # number of them
-    @chkcat = ();      # what category of thing in each chunk
-    @chksymb = ();     # what symbol(base) is defined in this chunk
-    %slowchk = ();     # ditto, its regular "slow" entry code
-    %fastchk = ();     # ditto, fast entry code
-    %closurechk = ();  # ditto, the (static) closure
-    %infochk = ();     # given a symbol base, say what chunk its info tbl is in
-    %vectorchk = ();    # ditto, return vector table
-    %directchk = ();    # ditto, direct return code
-
-    $i = 0;
-    $chkcat[0] = 'misc';
-
-    while (<INASM>) {
-#???   next if /^\.stab.*___stg_split_marker/;
-#???   next if /^\.stab.*ghc.*c_ID/;
-
-       next if /^\s*$/;
-
-       if ( /^\s+/ ) { # most common case first -- a simple line!
-           # duplicated from the bottom
-           $chk[$i] .= $_;
-
-       } elsif ( /\.\.ng:$/ ) { # Local labels not to be confused with new chunks
-           $chk[$i] .= $_;
-
-       } elsif ( /^\$C(\d+):$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'string';
-           $chksymb[$i] = $1;
-
-       } elsif ( /^__stg_split_marker(\d+):$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'splitmarker';
-           $chksymb[$i] = $1;
-
-       } elsif ( /^([A-Za-z0-9_]+)_info:$/ ) {
-           $symb = $1;
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'infotbl';
-           $chksymb[$i] = $symb;
-
-           die "Info table already? $symb; $i\n" if defined($infochk{$symb});
-
-           $infochk{$symb} = $i;
-
-       } elsif ( /^([A-Za-z0-9_]+)_entry:$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'slow';
-           $chksymb[$i] = $1;
-
-           $slowchk{$1} = $i;
-
-       } elsif ( /^([A-Za-z0-9_]+)_fast\d+:$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'fast';
-           $chksymb[$i] = $1;
-
-           $fastchk{$1} = $i;
-
-       } elsif ( /^([A-Za-z0-9_]+)_closure:$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'closure';
-           $chksymb[$i] = $1;
-
-           $closurechk{$1} = $i;
-
-       } elsif ( /^ghc.*c_ID:/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'consist';
-
-       } elsif ( /^(__gnu_compiled_c|gcc2_compiled\.):/ ) {
-           ; # toss it
-
-       } elsif ( /^ErrorIO_call_count:/         # HACK!!!!
-              || /^[A-Za-z0-9_]+\.\d+:$/
-              || /^.*_CAT:/                    # PROF: _entryname_CAT
-              || /^CC_.*_struct:/              # PROF: _CC_ccident_struct
-              || /^.*_done:/                   # PROF: _module_done
-              || /^_module_registered:/        # PROF: _module_registered
-              ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'data';
-           $chksymb[$i] = '';
-
-       } elsif ( /^(ret_|djn_)/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'misc';
-           $chksymb[$i] = '';
-
-       } elsif ( /^vtbl_([A-Za-z0-9_]+):$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'vector';
-           $chksymb[$i] = $1;
-
-           $vectorchk{$1} = $i;
-
-       } elsif ( /^([A-Za-z0-9_]+)DirectReturn:$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'direct';
-           $chksymb[$i] = $1;
-
-           $directchk{$1} = $i;
-
-       } elsif ( /^[A-Za-z0-9_]+_upd:$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'misc';
-           $chksymb[$i] = '';
-
-       } elsif ( /^[A-Za-z0-9_]/ ) {
-           local($thing);
-           chop($thing = $_);
-           print STDERR "Funny global thing?: $_"
-               unless $KNOWN_FUNNY_THING{$thing}
-                   || /^_(PRIn|PRStart).*:/    # pointer reversal GC routines
-                   || /^CC_.*:/                # PROF: _CC_ccident
-                   || /^_reg.*:/;              # PROF: _reg<module>
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'misc';
-           $chksymb[$i] = '';
-
-       } else { # simple line (duplicated at the top)
-           $chk[$i] .= $_;
-       }
-    }
-    $numchks = $#chk + 1;
-
-#    print STDERR "\nCLOSURES:\n";
-#    foreach $s (sort (keys %closurechk)) {
-#      print STDERR "$s:\t\t",$closurechk{$s},"\n";
-#    }
-#    print STDERR "\nINFOS:\n";
-#    foreach $s (sort (keys %infochk)) {
-#      print STDERR "$s:\t\t",$infochk{$s},"\n";
-#    }
-#    print STDERR "SLOWS:\n";
-#    foreach $s (sort (keys %slowchk)) {
-#      print STDERR "$s:\t\t",$slowchk{$s},"\n";
-#    }
-#    print STDERR "\nFASTS:\n";
-#    foreach $s (sort (keys %fastchk)) {
-#      print STDERR "$s:\t\t",$fastchk{$s},"\n";
-#    }
-
-    # the division into chunks is imperfect;
-    # we throw some things over the fence into the next
-    # chunk.
-    #
-    # also, there are things we would like to know
-    # about the whole module before we start spitting
-    # output.
-
-    # NB: we start meddling at chunk 1, not chunk 0
-
-    # the first ".rdata" is quite magical; as of GCC 2.7.x, it
-    # spits a ".quad 0" in after the v first ".rdata"; we
-    # detect this special case (tossing the ".quad 0")!
-    $magic_rdata_seen = 0;
-
-    for ($i = 1; $i < $numchks; $i++) {
-       $c = $chk[$i]; # convenience copy
-
-#      print STDERR "\nCHK $i (BEFORE):\n", $c;
-
-       # pin a funny end-thing on (for easier matching):
-       $c .= 'FUNNY#END#THING';
-
-       if ( ! $magic_rdata_seen && $c =~ /^\s*\.rdata\n\t\.quad 0\n\t\.align \d\n/ ) {
-           $c =~ s/^\s*\.rdata\n\t\.quad 0\n\t\.align (\d)\n/\.rdata\n\t\.align $1\n/;
-           $magic_rdata_seen = 1;
-       }
-
-       # pick some end-things and move them to the next chunk
-
-       while ( $c =~ /^(\s*\.align\s+\d+\n)FUNNY#END#THING/
-            || $c =~ /^(\s*\.(globl|ent)\s+\S+\n)FUNNY#END#THING/
-             || $c =~ /^(\s*\#.*\n)FUNNY#END#THING/
-             || $c =~ /^(\s*\.(file|loc)\s+\S+\s+\S+\n)FUNNY#END#THING/
-            || $c =~ /^(\s*\.text\n|\s*\.r?data\n)FUNNY#END#THING/ ) {
-           $to_move = $1;
-
-            if ( $to_move =~ /^\s*(\#|\.(file|globl|ent|loc))/ && $i < ($numchks - 1) ) {
-               $chk[$i + 1] = $to_move . $chk[$i + 1];
-               # otherwise they're tossed
-           }
-
-           $c =~ s/^.*\nFUNNY#END#THING/FUNNY#END#THING/;
-       }
-
-       if ($c =~ /^\t\.ent\s+(\S+)/) {
-           $ent = $1;
-           # toss all prologue stuff, except for loading gp, and the ..ng address
-           if (($p, $r) = split(/^\t\.prologue/, $c)) {
-# print STDERR "$ent: prologue:\n$p\nrest:\n$r\n";
-               if (($keep, $junk) = split(/\.\.ng:/, $p)) {
-                   $c = $keep . "..ng:\n";
-               } else {
-                   print STDERR "malformed code block ($ent)?\n"
-               }
-           }
-           $c .= "\t.frame \$30,0,\$26,0\n\t.prologue" . $r;
-       }
-
-       $c =~ s/FUNNY#END#THING//;
-       $chk[$i] = $c; # update w/ convenience copy
-
-#      print STDERR "\nCHK $i (AFTER):\n", $c;
-    }
-
-    # print out the header stuff first
-
-    $chk[0] =~ s/^(\t\.file.*)"(ghc\d+\.c)"/\1"$ifile_root.hc"/;
-    print OUTASM $chk[0];
-
-    # print out all the literal strings second
-    for ($i = 1; $i < $numchks; $i++) {
-       if ( $chkcat[$i] eq 'string' ) {
-           print OUTASM "\.rdata\n\t\.align 3\n";
-           print OUTASM $chk[$i];
-           
-           $chkcat[$i] = 'DONE ALREADY';
-       }
-    }
-
-    for ($i = 1; $i < $numchks; $i++) {
-#      print STDERR "$i: cat $chkcat[$i], symb $chksymb[$i]\n";
-
-       next if $chkcat[$i] eq 'DONE ALREADY';
-
-       if ( $chkcat[$i] eq 'misc' ) {
-           print OUTASM "\.text\n\t\.align 3\n";
-           print OUTASM $chk[$i];
-
-       } elsif ( $chkcat[$i] eq 'data' ) {
-           print OUTASM "\.data\n\t\.align 3\n";
-           print OUTASM $chk[$i];
-
-       } elsif ( $chkcat[$i] eq 'consist' ) {
-           if ( $chk[$i] =~ /\.ascii.*\)(hsc|cc) (.*)\\11"\n\t\.ascii\s+"(.*)\\0"/ ) {
-               local($consist) = "$1.$2.$3";
-               $consist =~ s/,/./g;
-               $consist =~ s/\//./g;
-               $consist =~ s/-/_/g;
-               $consist =~ s/[^A-Za-z0-9_.]/ZZ/g; # ToDo: properly?
-               print OUTASM "\.text\n$consist:\n";
-           } else {
-               print STDERR "Couldn't grok consistency: ", $chk[$i];
-           }
-
-       } elsif ( $chkcat[$i] eq 'splitmarker' ) {
-           # we can just re-constitute this one...
-           # ignore the final split marker, to save an empty object module
-           # Use _three_ underscores so that ghc-split doesn't get overly complicated
-           print OUTASM "___stg_split_marker",$chksymb[$i],":\n";
-
-       } elsif ( $chkcat[$i] eq 'closure'
-              || $chkcat[$i] eq 'infotbl'
-              || $chkcat[$i] eq 'slow'
-              || $chkcat[$i] eq 'fast' ) { # do them in that order
-           $symb = $chksymb[$i];
-
-           # CLOSURE
-           if ( defined($closurechk{$symb}) ) {
-               print OUTASM "\.data\n\t\.align 3\n";
-               print OUTASM $chk[$closurechk{$symb}];
-               $chkcat[$closurechk{$symb}] = 'DONE ALREADY';
-           }
-
-           # INFO TABLE
-           if ( defined($infochk{$symb}) ) {
-
-               print OUTASM "\.text\n\t\.align 3\n";
-               print OUTASM &rev_tbl($symb, $chk[$infochk{$symb}], 1);
-               # entry code will be put here!
-
-               # paranoia
-               if ( $chk[$infochk{$symb}] =~ /\.quad\s+([A-Za-z0-9_]+_entry)$/
-                 && $1 ne "${symb}_entry" ) {
-                   print STDERR "!!! entry point???\n",$chk[$infochk{$symb}];
-               }
-
-               $chkcat[$infochk{$symb}] = 'DONE ALREADY';
-           }
-
-           # STD ENTRY POINT
-           if ( defined($slowchk{$symb}) ) {
-
-               # teach it to drop through to the fast entry point:
-               $c = $chk[$slowchk{$symb}];
-               if ( defined($fastchk{$symb}) ) {
-                   $c =~ s/^\tjmp \$31,\(\$27\),0\n\t\.align 4\n\t\.end/\t.align 4\n\t.end/;
-               }
-
-               # NB: no very good way to look for "dangling" references
-               # to fast-entry pt
-
-               print OUTASM "\.text\n\t\.align 3\n";
-               print OUTASM $c;
-               $chkcat[$slowchk{$symb}] = 'DONE ALREADY';
-           }
-           
-           # FAST ENTRY POINT
-           if ( defined($fastchk{$symb}) ) {
-               $c = $chk[$fastchk{$symb}];
-               if ( ! defined($slowchk{$symb}) ) {
-                   print OUTASM "\.text\n\t\.align 3\n";
-               }
-               print OUTASM $c;
-               $chkcat[$fastchk{$symb}] = 'DONE ALREADY';
-           }
-
-       } elsif ( $chkcat[$i] eq 'vector'
-              || $chkcat[$i] eq 'direct' ) { # do them in that order
-           $symb = $chksymb[$i];
-
-           # VECTOR TABLE
-           if ( defined($vectorchk{$symb}) ) {
-               print OUTASM "\.text\n\t\.align 3\n";
-               print OUTASM &rev_tbl($symb, $chk[$vectorchk{$symb}], 0);
-               # direct return code will be put here!
-               $chkcat[$vectorchk{$symb}] = 'DONE ALREADY';
-           }
-
-           # DIRECT RETURN
-           if ( defined($directchk{$symb}) ) {
-               print OUTASM "\.text\n\t\.align 3\n";
-               print OUTASM $chk[$directchk{$symb}];
-               $chkcat[$directchk{$symb}] = 'DONE ALREADY';
-           } else {
-                # The commented nop is for the splitter, to ensure
-                # that no module ends with a label as the very last
-                # thing.  (The linker will adjust the label to point
-                # to the first code word of the next module linked in,
-                # even if alignment constraints cause the label to move!)
-
-               print OUTASM "\t# nop\n";
-           }
-       } else {
-           &tidy_up_and_die(1,"$Pgm: unknown chkcat (ghc-asm alpha)\n$chkcat[$i]\n$chk[$i]\n");
-       }
-    }
-
-    # finished:
-    close(OUTASM) || &tidy_up_and_die(1,"Failed writing to $out_asmf\n");
-    close(INASM)  || &tidy_up_and_die(1,"Failed reading from $in_asmf\n");
-}
-\end{code}
-
-\begin{code}
-sub init_FUNNY_THINGS {
-    %KNOWN_FUNNY_THING = (
-       'CheckHeapCode:', 1,
-       'CommonUnderflow:', 1,
-       'Continue:', 1,
-       'EnterNodeCode:', 1,
-       'ErrorIO_call_count:', 1,
-       'ErrorIO_innards:', 1,
-       'IndUpdRetDir:', 1,
-       'IndUpdRetV0:', 1,
-       'IndUpdRetV1:', 1,
-       'IndUpdRetV2:', 1,
-       'IndUpdRetV3:', 1,
-       'IndUpdRetV4:', 1,
-       'IndUpdRetV5:', 1,
-       'IndUpdRetV6:', 1,
-       'IndUpdRetV7:', 1,
-       'PrimUnderflow:', 1,
-       'StackUnderflowEnterNode:', 1,
-       'StdErrorCode:', 1,
-       'UnderflowVect0:', 1,
-       'UnderflowVect1:', 1,
-       'UnderflowVect2:', 1,
-       'UnderflowVect3:', 1,
-       'UnderflowVect4:', 1,
-       'UnderflowVect5:', 1,
-       'UnderflowVect6:', 1,
-       'UnderflowVect7:', 1,
-       'UpdErr:', 1,
-       'UpdatePAP:', 1,
-       'WorldStateToken:', 1,
-       '_Enter_Internal:', 1,
-       '_PRMarking_MarkNextAStack:', 1,
-       '_PRMarking_MarkNextBStack:', 1,
-       '_PRMarking_MarkNextCAF:', 1,
-       '_PRMarking_MarkNextGA:', 1,
-       '_PRMarking_MarkNextRoot:', 1,
-       '_PRMarking_MarkNextSpark:', 1,
-       '_Scavenge_Forward_Ref:', 1,
-       '__std_entry_error__:', 1,
-       '_startMarkWorld:', 1,
-       'resumeThread:', 1,
-       'startCcRegisteringWorld:', 1,
-       'startEnterFloat:', 1,
-       'startEnterInt:', 1,
-       'startPerformIO:', 1,
-       'startStgWorld:', 1,
-       'stopPerformIO:', 1
-  );
-}
-\end{code}
-
-The following table reversal is used for both info tables and return
-vectors.  In both cases, we remove the first entry from the table,
-reverse the table, put the label at the end, and paste some code
-(that which is normally referred to by the first entry in the table)
-right after the table itself.  (The code pasting is done elsewhere.)
-
-\begin{code}
-sub rev_tbl {
-    local($symb, $tbl, $discard1) = @_;
-
-    local($before) = '';
-    local($label) = '';
-    local(@words) = ();
-    local($after) = '';
-    local(@lines) = split(/\n/, $tbl);
-    local($i);
-
-    for ($i = 0; $i <= $#lines && $lines[$i] !~ /^\t\.quad\s+/; $i++) {
-       $label .= $lines[$i] . "\n",
-           next if $lines[$i] =~ /^[A-Za-z0-9_]+:$/
-                || $lines[$i] =~ /^\t\.globl/;
-
-       $before .= $lines[$i] . "\n"; # otherwise...
-    }
-
-    for ( ; $i <= $#lines && $lines[$i] =~ /^\t\.quad\s+/; $i++) {
-       push(@words, $lines[$i]);
-    }
-    # now throw away the first word (entry code):
-    shift(@words) if $discard1;
-
-    for (; $i <= $#lines; $i++) {
-       $after .= $lines[$i] . "\n";
-    }
-
-    # If we have anonymous text (not part of a procedure), the linker
-    # may complain about missing exception information.  Bleh.
-    if ($label =~ /^([A-Za-z0-9_]+):$/) {
-       $before = "\t.ent $1\n" . $before;
-       $after .= "\t.end $1\n";
-    }
-
-    $tbl = $before . join("\n", (reverse @words)) . "\n" . $label . $after;
-
-#    print STDERR "before=$before\n";
-#    print STDERR "label=$label\n";
-#    print STDERR "words=",(reverse @words),"\n";
-#    print STDERR "after=$after\n";
-
-    $tbl;
-}
-\end{code}
-
-%************************************************************************
-%*                                                                     *
-\subsection[Driver-asm-info]{Collect interesting (static) info from an assembler file}
-%*                                                                     *
-%************************************************************************
-
-How many times is each asm instruction used?
-
-\begin{code}
-%AsmInsn = (); # init
-
-sub dump_asm_insn_counts {
-    local($asmf) = @_;
-
-    open(INASM, "< $asmf")  || &tidy_up_and_die(1,"$Pgm: failed to open `$asmf' (to read)\n");
-    while (<INASM>) {
-       if ( /^\t([a-z][a-z0-9]+)\b/ ) {
-           $AsmInsn{$1} ++;
-       }
-    }
-    close(INASM) || &tidy_up_and_die(1,"Failed reading from $asmf\n");
-
-    # OK, now print what we collected (to stderr)
-    foreach $i (sort (keys %AsmInsn)) {
-       print STDERR "INSN:: $i\t",$AsmInsn{$i},"\n";
-    }
-}
-
-sub dump_asm_globals_info {
-}
-
-# make "require"r happy...
-1;
-\end{code}
diff --git a/ghc/driver/ghc-asm-hppa.lprl b/ghc/driver/ghc-asm-hppa.lprl
deleted file mode 100644 (file)
index 1032a36..0000000
+++ /dev/null
@@ -1,582 +0,0 @@
-%************************************************************************
-%*                                                                     *
-\section[Driver-asm-fiddling]{Fiddling with assembler files (HP-PA)}
-%*                                                                     *
-%************************************************************************
-
-Tasks:
-\begin{itemize}
-\item
-Utterly stomp out C functions' prologues and epilogues; i.e., the
-stuff to do with the C stack.
-\item
-Any other required tidying up.
-\end{itemize}
-
-HP specific notes:
-\begin{itemize}
-\item
-The HP linker is very picky about symbols being in the appropriate
-space (code vs. data).  When we mangle the threaded code to put the
-info tables just prior to the code, they wind up in code space
-rather than data space.  This means that references to *_info from
-un-mangled parts of the RTS (e.g. unthreaded GC code) get
-unresolved symbols.  Solution:  mini-mangler for .c files on HP.  I
-think this should really be triggered in the driver by a new -rts
-option, so that user code doesn't get mangled inappropriately.
-\item
-With reversed tables, jumps are to the _info label rather than to
-the _entry label.  The _info label is just an address in code
-space, rather than an entry point with the descriptive blob we
-talked about yesterday.  As a result, you can't use the call-style
-JMP_ macro.  However, some JMP_ macros take _info labels as targets
-and some take code entry points within the RTS.  The latter won't
-work with the goto-style JMP_ macro.  Sigh.  Solution: Use the goto
-style JMP_ macro, and mangle some more assembly, changing all
-"RP'literal" and "LP'literal" references to "R'literal" and
-"L'literal," so that you get the real address of the code, rather
-than the descriptive blob.  Also change all ".word P%literal"
-entries in info tables and vector tables to just ".word literal,"
-for the same reason.  Advantage: No more ridiculous call sequences.
-\end{itemize}
-
-\begin{code}
-sub mangle_asm {
-    local($in_asmf, $out_asmf) = @_;
-
-    # multi-line regexp matching:
-    local($*) = 1;
-    local($i, $c);
-    &init_FUNNY_THINGS();
-
-    open(INASM, "< $in_asmf")
-       || &tidy_up_and_die(1,"$Pgm: failed to open `$in_asmf' (to read)\n");
-    open(OUTASM,"> $out_asmf")
-       || &tidy_up_and_die(1,"$Pgm: failed to open `$out_asmf' (to write)\n");
-
-    # read whole file, divide into "chunks":
-    #  record some info about what we've found...
-
-    @chk = ();         # contents of the chunk
-    $numchks = 0;      # number of them
-    @chkcat = ();      # what category of thing in each chunk
-    @chksymb = ();     # what symbol(base) is defined in this chunk
-    %slowchk = ();     # ditto, its regular "slow" entry code
-    %fastchk = ();     # ditto, fast entry code
-    %closurechk = ();  # ditto, the (static) closure
-    %infochk = ();     # ditto, normal info tbl
-    %vectorchk = ();    # ditto, return vector table
-    %directchk = ();    # ditto, direct return code
-
-    $i = 0;
-    $chkcat[0] = 'misc';
-
-    while (<INASM>) {
-#???   next if /^\.stab.*___stg_split_marker/;
-#???   next if /^\.stab.*ghc.*c_ID/;
-
-       next if /^;/;
-
-       if ( /^\s+/ ) { # most common case first -- a simple line!
-           # duplicated from the bottom
-           $chk[$i] .= $_;
-
-       } elsif ( /^L\$C(\d+)$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'literal';
-           $chksymb[$i] = $1;
-
-       } elsif ( /^__stg_split_marker(\d+)$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'splitmarker';
-           $chksymb[$i] = $1;
-
-       } elsif ( /^([A-Za-z0-9_]+)_info$/ ) {
-           $symb = $1;
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'infotbl';
-           $chksymb[$i] = $symb;
-
-           die "Info table already? $symb; $i\n" if defined($infochk{$symb});
-
-           $infochk{$symb} = $i;
-
-       } elsif ( /^([A-Za-z0-9_]+)_entry$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'slow';
-           $chksymb[$i] = $1;
-
-           $slowchk{$1} = $i;
-
-       } elsif ( /^([A-Za-z0-9_]+)_fast\d+$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'fast';
-           $chksymb[$i] = $1;
-
-           $fastchk{$1} = $i;
-
-       } elsif ( /^([A-Za-z0-9_]+)_closure$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'closure';
-           $chksymb[$i] = $1;
-
-           $closurechk{$1} = $i;
-
-       } elsif ( /^ghc.*c_ID/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'consist';
-
-       } elsif ( /^(__gnu_compiled_c|gcc2_compiled\.)/ ) {
-           ; # toss it
-
-       } elsif ( /^ErrorIO_call_count/  # HACK!!!!
-              || /^[A-Za-z0-9_]+\.\d+$/
-              || /^.*_CAT/                     # PROF: _entryname_CAT
-              || /^CC_.*_struct/               # PROF: _CC_ccident_struct
-              || /^.*_done/                    # PROF: _module_done
-              || /^_module_registered/         # PROF: _module_registered
-              ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'data';
-           $chksymb[$i] = '';
-
-       } elsif ( /^([A-Za-z0-9_]+)\s+\.comm/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'bss';
-           $chksymb[$i] = $1;
-
-       } elsif ( /^(ret_|djn_)/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'misc';
-           $chksymb[$i] = '';
-
-       } elsif ( /^vtbl_([A-Za-z0-9_]+)$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'vector';
-           $chksymb[$i] = $1;
-
-           $vectorchk{$1} = $i;
-
-       } elsif ( /^([A-Za-z0-9_]+)DirectReturn$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'direct';
-           $chksymb[$i] = $1;
-
-           $directchk{$1} = $i;
-
-       } elsif ( /^[A-Za-z0-9_]+_upd$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'misc';
-           $chksymb[$i] = '';
-
-       } elsif ( /^[A-Za-z0-9_]/ && ! /^L\$\d+$/) {
-           local($thing);
-           chop($thing = $_);
-           print STDERR "Funny global thing?: $_"
-               unless $KNOWN_FUNNY_THING{$thing}
-                   || /^_(PRIn|PRStart)/       # pointer reversal GC routines
-                   || /^CC_.*/                 # PROF: _CC_ccident
-                   || /^_reg.*/;               # PROF: _reg<module>
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'misc';
-           $chksymb[$i] = '';
-
-       } else { # simple line (duplicated at the top)
-           $chk[$i] .= $_;
-       }
-    }
-    $numchks = $#chk + 1;
-
-#    print STDERR "\nCLOSURES:\n";
-#    foreach $s (sort (keys %closurechk)) {
-#      print STDERR "$s:\t\t",$closurechk{$s},"\n";
-#    }
-#    print STDERR "\nNORMAL INFOS:\n";
-#    foreach $s (sort (keys %infochk)) {
-#      print STDERR "$s:\t\t",$infochk{$s},"\n";
-#    }
-#    print STDERR "SLOWS:\n";
-#    foreach $s (sort (keys %slowchk)) {
-#      print STDERR "$s:\t\t",$slowchk{$s},"\n";
-#    }
-#    print STDERR "\nFASTS:\n";
-#    foreach $s (sort (keys %fastchk)) {
-#      print STDERR "$s:\t\t",$fastchk{$s},"\n";
-#    }
-
-    # the division into chunks is imperfect;
-    # we throw some things over the fence into the next
-    # chunk.
-    #
-    # also, there are things we would like to know
-    # about the whole module before we start spitting
-    # output.
-
-    # NB: we start meddling at chunk 1, not chunk 0
-
-    for ($i = 1; $i < $numchks; $i++) {
-       $c = $chk[$i]; # convenience copy
-
-#      print STDERR "\nCHK $i (BEFORE):\n", $c;
-
-       # toss all prologue stuff
-       $c =~ s/^\s+\.ENTRY[^\0]*--- BEGIN ---/\t.ENTRY/;
-
-        # Lie about our .CALLINFO
-        $c =~ s/^\s+\.CALLINFO.*$/\t.CALLINFO NO_CALLS,NO_UNWIND/;
-
-       # Get rid of P'
-
-       $c =~ s/LP'/L'/g;
-       $c =~ s/RP'/R'/g;
-
-#      print STDERR "\nCHK $i (STEP 1):\n", $c;
-
-       # toss all epilogue stuff
-       $c =~ s/^\s+--- END ---[^\0]*\.EXIT/\t.EXIT/;
-
-#      print STDERR "\nCHK $i (STEP 2):\n", $c;
-
-       # Sorry; we moved the _info stuff to the code segment.
-       $c =~ s/_info,DATA/_info,CODE/g;
-
-       # pin a funny end-thing on (for easier matching):
-       $c .= 'FUNNY#END#THING';
-
-       # pick some end-things and move them to the next chunk
-
-#      print STDERR "\nCHK $i (STEP 3):\n", $c;
-       while ($c =~ /^(\s+\.(IMPORT|EXPORT|PARAM).*\n)FUNNY#END#THING/
-             || $c =~ /^(\s+\.align\s+\d+\n)FUNNY#END#THING/
-            || $c =~ /^(\s+\.(SPACE|SUBSPA)\s+\S+\n)FUNNY#END#THING/
-             ||  $c =~ /^(\s*\n)FUNNY#END#THING/ ) {
-           $to_move = $1;
-
-           if ( $i < ($numchks - 1) && ($to_move =~ /^\s+\.(IMPORT|EXPORT)/ 
-                || ($to_move =~ /align/ && $chkcat[$i+1] eq 'literal')) ) {
-               $chk[$i + 1] = $to_move . $chk[$i + 1];
-               # otherwise they're tossed
-           }
-           $c =~ s/^.*\nFUNNY#END#THING/FUNNY#END#THING/;
-       }
-#      print STDERR "\nCHK $i (STEP 4):\n", $c;
-
-       $c =~ s/FUNNY#END#THING//;
-       $chk[$i] = $c; # update w/ convenience copy
-    }
-
-    # print out the header stuff first
-
-    print OUTASM $chk[0];
-
-    # print out all the literals second
-    
-    for ($i = 1; $i < $numchks; $i++) {
-       if ( $chkcat[$i] eq 'literal' ) {
-           print OUTASM "\t.SPACE \$TEXT\$\n\t.SUBSPA \$LIT\$\n";
-           print OUTASM $chk[$i];
-           print OUTASM "; end literal\n"; # for the splitter
-
-           $chkcat[$i] = 'DONE ALREADY';
-       }
-    }
-
-    # print out all the bss third
-    
-    for ($i = 1; $i < $numchks; $i++) {
-       if ( $chkcat[$i] eq 'bss' ) {
-           print OUTASM "\t.SPACE \$PRIVATE\$\n\t.SUBSPA \$BSS\$\n\t.align 4\n";
-           print OUTASM $chk[$i];
-           
-           $chkcat[$i] = 'DONE ALREADY';
-       }
-    }
-
-    for ($i = 1; $i < $numchks; $i++) {
-#      print STDERR "$i: cat $chkcat[$i], symb $chksymb[$i]\n";
-
-       next if $chkcat[$i] eq 'DONE ALREADY';
-
-       if ( $chkcat[$i] eq 'misc' ) {
-           print OUTASM "\t.SPACE \$TEXT\$\n\t.SUBSPA \$CODE\$\n\t\.align 4\n";
-           print OUTASM $chk[$i];
-
-       } elsif ( $chkcat[$i] eq 'data' ) {
-           print OUTASM "\t.SPACE \$PRIVATE\$\n\t.SUBSPA \$DATA\$\n\t\.align 4\n";
-           print OUTASM $chk[$i];
-
-       } elsif ( $chkcat[$i] eq 'consist' ) {
-           if ( $chk[$i] =~ /\.STRING.*\)(hsc|cc) (.*)\\x09(.*)\\x00/ ) {
-               local($consist) = "$1.$2.$3";
-               $consist =~ s/,/./g;
-               $consist =~ s/\//./g;
-               $consist =~ s/-/_/g;
-               $consist =~ s/[^A-Za-z0-9_.]/ZZ/g; # ToDo: properly?
-               print OUTASM "\t.SPACE \$TEXT\$\n\t.SUBSPA \$LIT\$\n$consist\n";
-           } else {
-               print STDERR "Couldn't grok consistency: ", $chk[$i];
-           }
-
-       } elsif ( $chkcat[$i] eq 'splitmarker' ) {
-           # we can just re-constitute this one...
-           # ignore the final split marker, to save an empty object module
-           # Use _three_ underscores so that ghc-split doesn't get overly complicated
-           print OUTASM "___stg_split_marker$chksymb[$i]\n";
-
-       } elsif ( $chkcat[$i] eq 'closure'
-              || $chkcat[$i] eq 'infotbl'
-              || $chkcat[$i] eq 'slow'
-              || $chkcat[$i] eq 'fast' ) { # do them in that order
-           $symb = $chksymb[$i];
-
-           # CLOSURE
-           if ( defined($closurechk{$symb}) ) {
-               print OUTASM "\t.SPACE \$PRIVATE\$\n\t.SUBSPA \$DATA\$\n\t\.align 4\n";
-               print OUTASM $chk[$closurechk{$symb}];
-               $chkcat[$closurechk{$symb}] = 'DONE ALREADY';
-           }
-
-           # INFO TABLE
-           if ( defined($infochk{$symb}) ) {
-               print OUTASM "\t.SPACE \$TEXT\$\n\t.SUBSPA \$CODE\$\n\t\.align 4\n";
-               print OUTASM &rev_tbl($symb, $chk[$infochk{$symb}], 1);
-               # entry code will be put here!
-
-               # paranoia
-               if ( $chk[$infochk{$symb}] =~ /\.word\s+([A-Za-z0-9_]+_entry)$/
-                 && $1 ne "${symb}_entry" ) {
-                   print STDERR "!!! entry point???\n",$chk[$infochk{$symb}];
-               }
-
-               $chkcat[$infochk{$symb}] = 'DONE ALREADY';
-           }
-
-           # STD ENTRY POINT
-           if ( defined($slowchk{$symb}) ) {
-
-               # teach it to drop through to the fast entry point:
-               $c = $chk[$slowchk{$symb}];
-               if ( defined($fastchk{$symb}) ) {
-                   $c =~ s/^\s+ldil.*\n\s+ldo.*\n\s+bv.*\n(.*\n)?\s+\.EXIT/$1\t.EXIT/;
-               }
-
-               # ToDo: ???? any good way to look for "dangling" references
-               # to fast-entry pt ???
-
-               print OUTASM "\t.SPACE \$TEXT\$\n\t.SUBSPA \$CODE\$\n\t\.align 4\n";
-               print OUTASM $c;
-               $chkcat[$slowchk{$symb}] = 'DONE ALREADY';
-           }
-           
-           # FAST ENTRY POINT
-           if ( defined($fastchk{$symb}) ) {
-               $c = $chk[$fastchk{$symb}];
-               if ( ! defined($slowchk{$symb}) ) {
-                   print OUTASM "\t.SPACE \$TEXT\$\n\t.SUBSPA \$CODE\$\n\t\.align 4\n";
-               }
-               print OUTASM $c;
-               $chkcat[$fastchk{$symb}] = 'DONE ALREADY';
-           }
-
-       } elsif ( $chkcat[$i] eq 'vector'
-              || $chkcat[$i] eq 'direct' ) { # do them in that order
-           $symb = $chksymb[$i];
-
-           # VECTOR TABLE
-           if ( defined($vectorchk{$symb}) ) {
-               print OUTASM "\t.SPACE \$TEXT\$\n\t.SUBSPA \$CODE\$\n\t\.align 4\n";
-               print OUTASM &rev_tbl($symb, $chk[$vectorchk{$symb}], 0);
-               # direct return code will be put here!
-               $chkcat[$vectorchk{$symb}] = 'DONE ALREADY';
-           }
-
-           # DIRECT RETURN
-           if ( defined($directchk{$symb}) ) {
-               print OUTASM "\t.SPACE \$TEXT\$\n\t.SUBSPA \$CODE\$\n\t\.align 4\n";
-               print OUTASM $chk[$directchk{$symb}];
-               $chkcat[$directchk{$symb}] = 'DONE ALREADY';
-           }
-       } else {
-           &tidy_up_and_die(1,"$Pgm: unknown chkcat (ghc-asm hppa)\n$chkcat[$i]\n$chk[$i]\n");
-       }
-    }
-
-    # finished:
-    close(OUTASM) || &tidy_up_and_die(1,"Failed writing to $out_asmf\n");
-    close(INASM)  || &tidy_up_and_die(1,"Failed reading from $in_asmf\n");
-}
-\end{code}
-
-The HP is a major nuisance.  The threaded code mangler moved info tables
-from data space to code space, but unthreaded code in the RTS still has
-references to info tables in data space.  Since the HP linker is very precise
-about where symbols live, we need to patch the references in the unthreaded
-RTS as well.
-
-\begin{code}
-
-sub mini_mangle_asm {
-    local($in_asmf, $out_asmf) = @_;
-
-    open(INASM, "< $in_asmf")
-       || &tidy_up_and_die(1,"$Pgm: failed to open `$in_asmf' (to read)\n");
-    open(OUTASM,"> $out_asmf")
-       || &tidy_up_and_die(1,"$Pgm: failed to open `$out_asmf' (to write)\n");
-
-    while (<INASM>) {
-       s/_info,DATA/_info,CODE/;   # Move _info references to code space
-       s/P%_PR/_PR/;
-       print OUTASM;
-    }
-
-    # finished:
-    close(OUTASM) || &tidy_up_and_die(1,"Failed writing to $out_asmf\n");
-    close(INASM)  || &tidy_up_and_die(1,"Failed reading from $in_asmf\n");
-}
-
-\end{code}
-
-\begin{code}
-sub init_FUNNY_THINGS {
-    %KNOWN_FUNNY_THING = (
-       'CheckHeapCode', 1,
-       'CommonUnderflow', 1,
-       'Continue', 1,
-       'EnterNodeCode', 1,
-       'ErrorIO_call_count', 1,
-       'ErrorIO_innards', 1,
-       'IndUpdRetDir', 1,
-       'IndUpdRetV0', 1,
-       'IndUpdRetV1', 1,
-       'IndUpdRetV2', 1,
-       'IndUpdRetV3', 1,
-       'IndUpdRetV4', 1,
-       'IndUpdRetV5', 1,
-       'IndUpdRetV6', 1,
-       'IndUpdRetV7', 1,
-       'PrimUnderflow', 1,
-       'StackUnderflowEnterNode', 1,
-       'StdErrorCode', 1,
-       'UnderflowVect0', 1,
-       'UnderflowVect1', 1,
-       'UnderflowVect2', 1,
-       'UnderflowVect3', 1,
-       'UnderflowVect4', 1,
-       'UnderflowVect5', 1,
-       'UnderflowVect6', 1,
-       'UnderflowVect7', 1,
-       'UpdErr', 1,
-       'UpdatePAP', 1,
-       'WorldStateToken', 1,
-       '_Enter_Internal', 1,
-       '_PRMarking_MarkNextAStack', 1,
-       '_PRMarking_MarkNextBStack', 1,
-       '_PRMarking_MarkNextCAF', 1,
-       '_PRMarking_MarkNextGA', 1,
-       '_PRMarking_MarkNextRoot', 1,
-       '_PRMarking_MarkNextSpark', 1,
-       '_Scavenge_Forward_Ref', 1,
-       '__std_entry_error__', 1,
-       '_startMarkWorld', 1,
-       'resumeThread', 1,
-       'startCcRegisteringWorld', 1,
-       'startEnterFloat', 1,
-       'startEnterInt', 1,
-       'startPerformIO', 1,
-       'startStgWorld', 1,
-       'stopPerformIO', 1
-    );
-}
-\end{code}
-
-The following table reversal is used for both info tables and return
-vectors.  In both cases, we remove the first entry from the table,
-reverse the table, put the label at the end, and paste some code
-(that which is normally referred to by the first entry in the table)
-right after the table itself.  (The code pasting is done elsewhere.)
-
-\begin{code}
-sub rev_tbl {
-    local($symb, $tbl, $discard1) = @_;
-
-    local($before) = '';
-    local($label) = '';
-    local(@imports) = ();
-    local(@words) = ();
-    local($after) = '';
-    local(@lines) = split(/\n/, $tbl);
-    local($i);
-
-    for ($i = 0; $i <= $#lines && $lines[$i] !~ /^\s+\.word\s+/; $i++) {
-       $label .= $lines[$i] . "\n",
-           next if $lines[$i] =~ /^[A-Za-z0-9_]+$/
-                || $lines[$i] =~ /^\s+\.EXPORT/;
-
-       $before .= $lines[$i] . "\n"; # otherwise...
-    }
-
-    for ( ; $i <= $#lines && $lines[$i] =~ /^\s+\.(word|IMPORT)/; $i++) {
-       if ($lines[$i] =~ /^\s+\.IMPORT/) {
-           push(@imports, $lines[$i]);
-       } else {
-           # We don't use HP's ``function pointers''
-            # We just use labels in code space, like normal people
-           $lines[$i] =~ s/P%//;
-           push(@words, $lines[$i]);
-       }
-    }
-    # now throw away the first word (entry code):
-    if ($discard1) {
-       shift(@words);
-    }
-
-    for (; $i <= $#lines; $i++) {
-       $after .= $lines[$i] . "\n";
-    }
-
-    $tbl = $before . join("\n", @imports) . "\n" .
-           join("\n", (reverse @words)) . "\n" . $label . $after;
-
-#    print STDERR "before=$before\n";
-#    print STDERR "label=$label\n";
-#    print STDERR "words=",(reverse @words),"\n";
-#    print STDERR "after=$after\n";
-
-    $tbl;
-}
-\end{code}
-
-%************************************************************************
-%*                                                                     *
-\subsection[Driver-asm-info]{Collect interesting (static) info from an assembler file}
-%*                                                                     *
-%************************************************************************
-
-How many times is each asm instruction used?
-
-\begin{code}
-%AsmInsn = (); # init
-
-sub dump_asm_insn_counts {
-    local($asmf) = @_;
-
-    open(INASM, "< $asmf")  || &tidy_up_and_die(1,"$Pgm: failed to open `$asmf' (to read)\n");
-    while (<INASM>) {
-       if ( /^\t([a-z][a-z0-9]+)\b/ ) {
-           $AsmInsn{$1} ++;
-       }
-    }
-    close(INASM) || &tidy_up_and_die(1,"Failed reading from $asmf\n");
-
-    # OK, now print what we collected (to stderr)
-    foreach $i (sort (keys %AsmInsn)) {
-       print STDERR "INSN:: $i\t",$AsmInsn{$i},"\n";
-    }
-}
-
-sub dump_asm_globals_info {
-}
-
-# make "require"r happy...
-1;
-\end{code}
diff --git a/ghc/driver/ghc-asm-m68k.lprl b/ghc/driver/ghc-asm-m68k.lprl
deleted file mode 100644 (file)
index e3a1431..0000000
+++ /dev/null
@@ -1,486 +0,0 @@
-%************************************************************************
-%*                                                                     *
-\section[Driver-asm-fiddling]{Fiddling with assembler files (m68k)}
-%*                                                                     *
-%************************************************************************
-
-Tasks:
-\begin{itemize}
-\item
-Utterly stomp out C functions' prologues and epilogues; i.e., the
-stuff to do with the C stack.
-\item
-Any other required tidying up.
-\end{itemize}
-
-\begin{code}
-sub mangle_asm {
-    local($in_asmf, $out_asmf) = @_;
-
-    # multi-line regexp matching:
-    local($*) = 1;
-    local($i, $c);
-    &init_FUNNY_THINGS();
-
-    open(INASM, "< $in_asmf")
-       || &tidy_up_and_die(1,"$Pgm: failed to open `$in_asmf' (to read)\n");
-    open(OUTASM,"> $out_asmf")
-       || &tidy_up_and_die(1,"$Pgm: failed to open `$out_asmf' (to write)\n");
-
-    # read whole file, divide into "chunks":
-    #  record some info about what we've found...
-
-    @chk = ();         # contents of the chunk
-    $numchks = 0;      # number of them
-    @chkcat = ();      # what category of thing in each chunk
-    @chksymb = ();     # what symbol(base) is defined in this chunk
-    %slowchk = ();     # ditto, its regular "slow" entry code
-    %fastchk = ();     # ditto, fast entry code
-    %closurechk = ();  # ditto, the (static) closure
-    %infochk = ();     # given a symbol base, say what chunk its info tbl is in
-    %vectorchk = ();    # ditto, return vector table
-    %directchk = ();    # ditto, direct return code
-
-    $i = 0;
-    $chkcat[0] = 'misc';
-
-    while (<INASM>) {
-       next if /^\.stab.*___stg_split_marker/;
-       next if /^\.stab.*ghc.*c_ID/;
-       next if /^#(NO_)?APP/;
-
-       if ( /^\s+/ ) { # most common case first -- a simple line!
-           # duplicated from the bottom
-
-           $chk[$i] .= $_;
-
-       } elsif ( /^LC(\d+):$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'string';
-           $chksymb[$i] = $1;
-
-       } elsif ( /^___stg_split_marker(\d+):$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'splitmarker';
-           $chksymb[$i] = $1;
-
-       } elsif ( /^_([A-Za-z0-9_]+)_info:$/ ) {
-           $symb = $1;
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'infotbl';
-           $chksymb[$i] = $symb;
-
-           die "Info table already? $symb; $i\n" if defined($infochk{$symb});
-
-           $infochk{$symb} = $i;
-
-       } elsif ( /^_([A-Za-z0-9_]+)_entry:$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'slow';
-           $chksymb[$i] = $1;
-
-           $slowchk{$1} = $i;
-
-       } elsif ( /^_([A-Za-z0-9_]+)_fast\d+:$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'fast';
-           $chksymb[$i] = $1;
-
-           $fastchk{$1} = $i;
-
-       } elsif ( /^_([A-Za-z0-9_]+)_closure:$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'closure';
-           $chksymb[$i] = $1;
-
-           $closurechk{$1} = $i;
-
-       } elsif ( /^_ghc.*c_ID:/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'consist';
-
-       } elsif ( /^(___gnu_compiled_c|gcc2_compiled\.):/ ) {
-           ; # toss it
-
-       } elsif ( /^_ErrorIO_call_count:/        # HACK!!!!
-              || /^_[A-Za-z0-9_]+\.\d+:$/
-              || /^_.*_CAT:/                   # PROF: _entryname_CAT
-              || /^_CC_.*_struct:/             # PROF: _CC_ccident_struct
-              || /^_.*_done:/                  # PROF: _module_done
-              || /^__module_registered:/       # PROF: _module_registered
-              ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'data';
-           $chksymb[$i] = '';
-
-       } elsif ( /^_(ret_|djn_)/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'misc';
-           $chksymb[$i] = '';
-
-       } elsif ( /^_vtbl_([A-Za-z0-9_]+):$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'vector';
-           $chksymb[$i] = $1;
-
-           $vectorchk{$1} = $i;
-
-       } elsif ( /^_([A-Za-z0-9_]+)DirectReturn:$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'direct';
-           $chksymb[$i] = $1;
-
-           $directchk{$1} = $i;
-
-       } elsif ( /^_[A-Za-z0-9_]+_upd:$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'misc';
-           $chksymb[$i] = '';
-
-       } elsif ( /^_[A-Za-z0-9_]/ ) {
-           local($thing);
-           chop($thing = $_);
-           print STDERR "Funny global thing?: $_"
-               unless $KNOWN_FUNNY_THING{$thing}
-                   || /^__(PRIn|PRStart).*:/   # pointer reversal GC routines
-                   || /^_CC_.*:/               # PROF: _CC_ccident
-                   || /^__reg.*:/;             # PROF: __reg<module>
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'misc';
-           $chksymb[$i] = '';
-
-       } else { # simple line (duplicated at the top)
-
-           $chk[$i] .= $_;
-       }
-    }
-    $numchks = $#chk + 1;
-
-    # the division into chunks is imperfect;
-    # we throw some things over the fence into the next
-    # chunk.
-    #
-    # also, there are things we would like to know
-    # about the whole module before we start spitting
-    # output.
-
-    # NB: we start meddling at chunk 1, not chunk 0
-
-    for ($i = 1; $i < $numchks; $i++) {
-       $c = $chk[$i]; # convenience copy
-
-#      print STDERR "\nCHK $i (BEFORE) (",$chkcat[$i],"):\n", $c;
-
-       # toss all prologue stuff;
-       # be slightly paranoid to make sure there's
-       # nothing surprising in there
-       if ( $c =~ /--- BEGIN ---/ ) {
-           if (($p, $r) = split(/--- BEGIN ---/, $c)) {
-               $p =~ s/^\tlink a6,#-?\d.*\n//;
-               $p =~ s/^\tmovel d2,sp\@-\n//;
-               $p =~ s/^\tmovel d5,sp\@-\n//; # SMmark.* only?
-               $p =~ s/^\tmoveml \#0x[0-9a-f]+,sp\@-\n//; # SMmark.* only?
-               die "Prologue junk?: $p\n" if $p =~ /^\t[^\.]/;
-
-               # glue together what's left
-               $c = $p . $r;
-           }
-       }
-
-       # toss all epilogue stuff; again, paranoidly
-       if ( $c =~ /--- END ---/ ) {
-           if (($r, $e) = split(/--- END ---/, $c)) {
-               $e =~ s/^\tunlk a6\n//;
-               $e =~ s/^\trts\n//;
-               die "Epilogue junk?: $e\n" if $e =~ /^\t[^\.]/;
-
-               # glue together what's left
-               $c = $r . $e;
-           }
-       }
-
-       # toss all calls to __DISCARD__
-       $c =~ s/^\tjbsr ___DISCARD__\n//g;
-
-       # toss stack adjustment after DoSparks
-       $c =~ s/^(\tjbsr _DoSparks\n)\taddqw #8,sp/$1/g;
-
-       # pin a funny end-thing on (for easier matching):
-       $c .= 'FUNNY#END#THING';
-
-       # pick some end-things and move them to the next chunk
-
-       while ( $c =~ /^\s*(\.align\s+\d+\n|\.proc\s+\d+\n|\.const\n|\.cstring\n|\.globl\s+\S+\n|\.text\n|\.data\n|\.even\n|\.stab[^n].*\n)FUNNY#END#THING/ ) {
-           $to_move = $1;
-
-           if ( $to_move =~ /\.(globl|proc|stab)/ && $i < ($numchks - 1) ) {
-               $chk[$i + 1] = $to_move . $chk[$i + 1];
-               # otherwise they're tossed
-           }
-
-           $c =~ s/^.*\nFUNNY#END#THING/FUNNY#END#THING/;
-       }
-
-       $c =~ s/FUNNY#END#THING//;
-       $chk[$i] = $c; # update w/ convenience copy
-    }
-
-    # print out all the literal strings first
-    for ($i = 0; $i < $numchks; $i++) {
-       if ( $chkcat[$i] eq 'string' ) {
-           print OUTASM "\.text\n\t\.even\n";
-           print OUTASM $chk[$i];
-           
-           $chkcat[$i] = 'DONE ALREADY';
-       }
-    }
-
-    for ($i = 0; $i < $numchks; $i++) {
-#      print STDERR "$i: cat $chkcat[$i], symb $chksymb[$i]\n";
-
-       next if $chkcat[$i] eq 'DONE ALREADY';
-
-       if ( $chkcat[$i] eq 'misc' ) {
-           print OUTASM "\.text\n\t\.even\n";
-           print OUTASM $chk[$i];
-
-       } elsif ( $chkcat[$i] eq 'data' ) {
-           print OUTASM "\.data\n\t\.even\n";
-           print OUTASM $chk[$i];
-
-       } elsif ( $chkcat[$i] eq 'consist' ) {
-           if ( $chk[$i] =~ /\.ascii.*\)(hsc|cc) (.*)\\11"\n\t\.ascii\s+"(.*)\\0"/ ) {
-               local($consist) = "$1.$2.$3";
-               $consist =~ s/,/./g;
-               $consist =~ s/\//./g;
-               $consist =~ s/-/_/g;
-               $consist =~ s/[^A-Za-z0-9_.]/ZZ/g; # ToDo: properly?
-               print OUTASM "\.text\n$consist:\n";
-           } else {
-               print STDERR "Couldn't grok consistency: ", $chk[$i];
-           }
-
-       } elsif ( $chkcat[$i] eq 'splitmarker' ) {
-           # we can just re-constitute this one...
-           print OUTASM "___stg_split_marker",$chksymb[$i],":\n";
-
-       } elsif ( $chkcat[$i] eq 'closure'
-              || $chkcat[$i] eq 'infotbl'
-              || $chkcat[$i] eq 'slow'
-              || $chkcat[$i] eq 'fast' ) { # do them in that order
-           $symb = $chksymb[$i];
-
-           # CLOSURE
-           if ( defined($closurechk{$symb}) ) {
-               print OUTASM "\.data\n\t\.even\n";
-               print OUTASM $chk[$closurechk{$symb}];
-               $chkcat[$closurechk{$symb}] = 'DONE ALREADY';
-           }
-
-           # INFO TABLE
-           if ( defined($infochk{$symb}) ) {
-
-               print OUTASM "\.text\n\t\.even\n";
-               print OUTASM &rev_tbl($symb, $chk[$infochk{$symb}], 1);
-               # entry code will be put here!
-
-               # paranoia
-               if ( $chk[$infochk{$symb}] =~ /\.long\s+([A-Za-z0-9_]+_entry)$/
-                 && $1 ne "_${symb}_entry" ) {
-                   print STDERR "!!! entry point???\n",$chk[$infochk{$symb}];
-               }
-
-               $chkcat[$infochk{$symb}] = 'DONE ALREADY';
-           }
-
-           # STD ENTRY POINT
-           if ( defined($slowchk{$symb}) ) {
-
-               # teach it to drop through to the fast entry point:
-               $c = $chk[$slowchk{$symb}];
-
-               if ( defined($fastchk{$symb}) ) {
-                   $c =~ s/^\tjmp _${symb}_fast\d+.*\n\tnop\n//;
-                   $c =~ s/^\tjmp _${symb}_fast\d+.*\n//;
-               }
-
-               print STDERR "still has jump to fast entry point:\n$c"
-                   if $c =~ /_${symb}_fast/; # NB: paranoia
-
-               print OUTASM "\.text\n\t\.even\n";
-               print OUTASM $c;
-               $chkcat[$slowchk{$symb}] = 'DONE ALREADY';
-           }
-           
-           # FAST ENTRY POINT
-           if ( defined($fastchk{$symb}) ) {
-               print OUTASM "\.text\n\t\.even\n";
-               print OUTASM $chk[$fastchk{$symb}];
-               $chkcat[$fastchk{$symb}] = 'DONE ALREADY';
-           }
-
-       } elsif ( $chkcat[$i] eq 'vector'
-              || $chkcat[$i] eq 'direct' ) { # do them in that order
-           $symb = $chksymb[$i];
-
-           # VECTOR TABLE
-           if ( defined($vectorchk{$symb}) ) {
-               print OUTASM "\.text\n\t\.even\n";
-               print OUTASM &rev_tbl($symb, $chk[$vectorchk{$symb}], 0);
-               # direct return code will be put here!
-               $chkcat[$vectorchk{$symb}] = 'DONE ALREADY';
-           }
-
-           # DIRECT RETURN
-           if ( defined($directchk{$symb}) ) {
-               print OUTASM "\.text\n\t\.even\n";
-               print OUTASM $chk[$directchk{$symb}];
-               $chkcat[$directchk{$symb}] = 'DONE ALREADY';
-           }
-           
-       } else {
-           &tidy_up_and_die(1,"$Pgm: unknown chkcat (ghc-asm m68k)\n$chkcat[$i]\n$chk[$i]\n");
-       }
-    }
-
-    # finished:
-    close(OUTASM) || &tidy_up_and_die(1,"Failed writing to $out_asmf\n");
-    close(INASM)  || &tidy_up_and_die(1,"Failed reading from $in_asmf\n");
-}
-\end{code}
-
-\begin{code}
-sub init_FUNNY_THINGS {
-    %KNOWN_FUNNY_THING = (
-       '_CheckHeapCode:', 1,
-       '_CommonUnderflow:', 1,
-       '_Continue:', 1,
-       '_EnterNodeCode:', 1,
-       '_ErrorIO_call_count:', 1,
-       '_ErrorIO_innards:', 1,
-       '_IndUpdRetDir:', 1,
-       '_IndUpdRetV0:', 1,
-       '_IndUpdRetV1:', 1,
-       '_IndUpdRetV2:', 1,
-       '_IndUpdRetV3:', 1,
-       '_IndUpdRetV4:', 1,
-       '_IndUpdRetV5:', 1,
-       '_IndUpdRetV6:', 1,
-       '_IndUpdRetV7:', 1,
-       '_PrimUnderflow:', 1,
-       '_StackUnderflowEnterNode:', 1,
-       '_StdErrorCode:', 1,
-       '_UnderflowVect0:', 1,
-       '_UnderflowVect1:', 1,
-       '_UnderflowVect2:', 1,
-       '_UnderflowVect3:', 1,
-       '_UnderflowVect4:', 1,
-       '_UnderflowVect5:', 1,
-       '_UnderflowVect6:', 1,
-       '_UnderflowVect7:', 1,
-       '_UpdErr:', 1,
-       '_UpdatePAP:', 1,
-       '_WorldStateToken:', 1,
-       '__Enter_Internal:', 1,
-       '__PRMarking_MarkNextAStack:', 1,
-       '__PRMarking_MarkNextBStack:', 1,
-       '__PRMarking_MarkNextCAF:', 1,
-       '__PRMarking_MarkNextGA:', 1,
-       '__PRMarking_MarkNextRoot:', 1,
-       '__PRMarking_MarkNextSpark:', 1,
-       '__Scavenge_Forward_Ref:', 1,
-       '___std_entry_error__:', 1,
-       '__startMarkWorld:', 1,
-       '_resumeThread:', 1,
-       '_startCcRegisteringWorld:', 1,
-       '_startEnterFloat:', 1,
-       '_startEnterInt:', 1,
-       '_startPerformIO:', 1,
-       '_startStgWorld:', 1,
-       '_stopPerformIO:', 1
-    );
-}
-\end{code}
-
-The following table reversal is used for both info tables and return
-vectors.  In both cases, we remove the first entry from the table,
-reverse the table, put the label at the end, and paste some code
-(that which is normally referred to by the first entry in the table)
-right after the table itself.  (The code pasting is done elsewhere.)
-
-\begin{code}
-sub rev_tbl {
-    local($symb, $tbl, $discard1) = @_;
-
-    local($before) = '';
-    local($label) = '';
-    local(@words) = ();
-    local($after) = '';
-    local(@lines) = split(/\n/, $tbl);
-    local($i);
-
-    for ($i = 0; $i <= $#lines && $lines[$i] !~ /^\t\.long\s+/; $i++) {
-       $label .= $lines[$i] . "\n",
-           next if $lines[$i] =~ /^[A-Za-z0-9_]+_info:$/
-                || $lines[$i] =~ /^\.globl/
-                || $lines[$i] =~ /^_vtbl_\S+:$/;
-
-       $before .= $lines[$i] . "\n"; # otherwise...
-    }
-
-    for ( ; $i <= $#lines && $lines[$i] =~ /^\t\.long\s+/; $i++) {
-       push(@words, $lines[$i]);
-    }
-    # now throw away the first word (entry code):
-    shift(@words) if $discard1;
-
-    for (; $i <= $#lines; $i++) {
-       $after .= $lines[$i] . "\n";
-    }
-
-    $tbl = $before . join("\n", (reverse @words)) . "\n" . $label . $after;
-
-#   print STDERR "before=$before\n";
-#   print STDERR "label=$label\n";
-#   print STDERR "words=",(reverse @words),"\n";
-#   print STDERR "after=$after\n";
-
-    $tbl;
-}
-\end{code}
-
-%************************************************************************
-%*                                                                     *
-\subsection[Driver-asm-info]{Collect interesting (static) info from an assembler file}
-%*                                                                     *
-%************************************************************************
-
-How many times is each asm instruction used?
-
-\begin{code}
-%AsmInsn = (); # init
-
-sub dump_asm_insn_counts {
-    local($asmf) = @_;
-
-    open(INASM, "< $asmf")  || &tidy_up_and_die(1,"$Pgm: failed to open `$asmf' (to read)\n");
-    while (<INASM>) {
-       if ( /^\t([a-z][a-z0-9]+)\b/ ) {
-           $AsmInsn{$1} ++;
-       }
-    }
-    close(INASM) || &tidy_up_and_die(1,"Failed reading from $asmf\n");
-
-    # OK, now print what we collected (to stderr)
-    foreach $i (sort (keys %AsmInsn)) {
-       print STDERR "INSN:: $i\t",$AsmInsn{$i},"\n";
-    }
-}
-
-sub dump_asm_globals_info {
-}
-
-# make "require"r happy...
-1;
-
-\end{code}
diff --git a/ghc/driver/ghc-asm-mips.lprl b/ghc/driver/ghc-asm-mips.lprl
deleted file mode 100644 (file)
index 3c210cb..0000000
+++ /dev/null
@@ -1,529 +0,0 @@
-%************************************************************************
-%*                                                                     *
-\section[Driver-asm-fiddling]{Fiddling with assembler files (SGI MIPS box)}
-%*                                                                     *
-%************************************************************************
-
-\begin{code}
-sub mangle_asm {
-    local($in_asmf, $out_asmf) = @_;
-
-    # multi-line regexp matching:
-    local($*) = 1;
-    local($i, $c);
-    &init_FUNNY_THINGS();
-
-    open(INASM, "< $in_asmf")
-       || &tidy_up_and_die(1,"$Pgm: failed to open `$in_asmf' (to read)\n");
-    open(OUTASM,"> $out_asmf")
-       || &tidy_up_and_die(1,"$Pgm: failed to open `$out_asmf' (to write)\n");
-
-    # read whole file, divide into "chunks":
-    #  record some info about what we've found...
-
-    @chk = ();         # contents of the chunk
-    $numchks = 0;      # number of them
-    @chkcat = ();      # what category of thing in each chunk
-    @chksymb = ();     # what symbol(base) is defined in this chunk
-    %slowchk = ();     # ditto, its regular "slow" entry code
-    %fastchk = ();     # ditto, fast entry code
-    %closurechk = ();  # ditto, the (static) closure
-    %infochk = ();     # given a symbol base, say what chunk its info tbl is in
-    %vectorchk = ();    # ditto, return vector table
-    %directchk = ();    # ditto, direct return code
-    $EXTERN_DECLS = '';        # .globl <foo> .text
-
-    $i = 0;
-    $chkcat[0] = 'misc';
-
-    while (<INASM>) {
-
-       next if /^$/; # blank line
-       next if /^\s*#(NO_)?APP/;
-       next if /^\t\.file\t/;
-       next if /^ # /;
-
-       if ( /^\t\.(globl \S+ \.text|comm\t)/ ) {
-           $EXTERN_DECLS .= $_ unless /(__DISCARD__|\b(PK_|ASSIGN_)(FLT|DBL)\b)/;
-
-       } elsif ( /^\s+/ ) { # most common case first -- a simple line!
-           # duplicated from the bottom
-           $chk[$i] .= $_;
-
-       # NB: all the rest start with a non-space
-
-       } elsif ( /^\d+:/ ) { # a funny-looking very-local label
-           $chk[$i] .= $_;
-
-       } elsif ( /^\$LC(\d+):$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'string';
-           $chksymb[$i] = $1;
-
-       } elsif ( /^__stg_split_marker(\d+):$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'splitmarker';
-           $chksymb[$i] = $1;
-
-       } elsif ( /^([A-Za-z0-9_]+)_info:$/ ) {
-           $symb = $1;
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'infotbl';
-           $chksymb[$i] = $symb;
-
-           die "Info table already? $symb; $i\n" if defined($infochk{$symb});
-
-           $infochk{$symb} = $i;
-
-       } elsif ( /^([A-Za-z0-9_]+)_entry:$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'slow';
-           $chksymb[$i] = $1;
-
-           $slowchk{$1} = $i;
-
-       } elsif ( /^([A-Za-z0-9_]+)_fast\d+:$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'fast';
-           $chksymb[$i] = $1;
-
-           $fastchk{$1} = $i;
-
-       } elsif ( /^([A-Za-z0-9_]+)_closure:$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'closure';
-           $chksymb[$i] = $1;
-
-           $closurechk{$1} = $i;
-
-       } elsif ( /^ghc.*c_ID:/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'consist';
-
-       } elsif ( /^(__gnu_compiled_c|gcc2_compiled\.):/ ) {
-           ; # toss it
-
-       } elsif ( /^ErrorIO_call_count:/         # HACK!!!!
-              || /^[A-Za-z0-9_]+\.\d+:$/
-              || /^.*_CAT:/                    # PROF: _entryname_CAT
-              || /^CC_.*_struct:/              # PROF: _CC_ccident_struct
-              || /^.*_done:/                   # PROF: _module_done
-              || /^_module_registered:/        # PROF: _module_registered
-              ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'data';
-           $chksymb[$i] = '';
-
-       } elsif ( /^(ret_|djn_)/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'misc';
-           $chksymb[$i] = '';
-
-       } elsif ( /^vtbl_([A-Za-z0-9_]+):$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'vector';
-           $chksymb[$i] = $1;
-
-           $vectorchk{$1} = $i;
-
-       } elsif ( /^([A-Za-z0-9_]+)DirectReturn:$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'direct';
-           $chksymb[$i] = $1;
-
-           $directchk{$1} = $i;
-
-       } elsif ( /^[A-Za-z0-9_]+_upd:$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'misc';
-           $chksymb[$i] = '';
-
-       } elsif ( /^[A-Za-z0-9_]/ ) {
-           local($thing);
-           chop($thing = $_);
-           print STDERR "Funny global thing? ($.): $_"
-               unless $KNOWN_FUNNY_THING{$thing}
-                   || /^_(PRIn|PRStart).*:/    # pointer reversal GC routines
-                   || /^CC_.*:/                # PROF: _CC_ccident
-                   || /^_reg.*:/;              # PROF: _reg<module>
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'misc';
-           $chksymb[$i] = '';
-
-       } else { # simple line (duplicated at the top)
-           $chk[$i] .= $_;
-       }
-    }
-    $numchks = $#chk + 1;
-
-#    print STDERR "\nCLOSURES:\n";
-#    foreach $s (sort (keys %closurechk)) {
-#      print STDERR "$s:\t\t",$closurechk{$s},"\n";
-#    }
-#    print STDERR "\nINFOS:\n";
-#    foreach $s (sort (keys %infochk)) {
-#      print STDERR "$s:\t\t",$infochk{$s},"\n";
-#    }
-#    print STDERR "SLOWS:\n";
-#    foreach $s (sort (keys %slowchk)) {
-#      print STDERR "$s:\t\t",$slowchk{$s},"\n";
-#    }
-#    print STDERR "\nFASTS:\n";
-#    foreach $s (sort (keys %fastchk)) {
-#      print STDERR "$s:\t\t",$fastchk{$s},"\n";
-#    }
-
-    # the division into chunks is imperfect;
-    # we throw some things over the fence into the next
-    # chunk.
-    #
-    # also, there are things we would like to know
-    # about the whole module before we start spitting
-    # output.
-
-    # NB: we start meddling at chunk 1, not chunk 0
-
-    for ($i = 1; $i < $numchks; $i++) {
-       $c = $chk[$i]; # convenience copy
-
-#      print STDERR "\nCHK $i (BEFORE):\n", $c;
-
-       # pin a funny end-thing on (for easier matching):
-       $c .= 'FUNNY#END#THING';
-
-       # pick some end-things and move them to the next chunk
-
-       while ( $c =~ /^(\s*\.align\s+\d+\n)FUNNY#END#THING/
-            || $c =~ /^(\s*\.(globl|ent)\s+\S+\n)FUNNY#END#THING/
-            || $c =~ /^(\s*\.text\n|\s*\.r?data\n)FUNNY#END#THING/ ) {
-           $to_move = $1;
-
-           if ( $to_move =~ /\.(globl|ent)/ && $i < ($numchks - 1) ) {
-               $chk[$i + 1] = $to_move . $chk[$i + 1];
-               # otherwise they're tossed
-           }
-
-           $c =~ s/^.*\nFUNNY#END#THING/FUNNY#END#THING/;
-       }
-
-       # toss all prologue stuff;
-       # be slightly paranoid to make sure there's
-       # nothing surprising in there
-       if ( $c =~ /--- BEGIN ---/ ) {
-           if (($p, $r) = split(/--- BEGIN ---/, $c)) {
-               # the .frame/.mask/.fmask that we use is the same
-               # as that produced by GCC for miniInterpret; this
-               # gives GDB some chance of figuring out what happened
-               $FRAME = "\t.frame\t\$sp,2168,\$31\n\t.mask\t0x90000000,-4\n\t.fmask\t0x00000000,0\n";
-               $p =~ s/^\t\.(frame).*\n/__FRAME__/g;
-               $p =~ s/^\t\.(mask|fmask).*\n//g;
-               $p =~ s/^\t\.cprestore.*\n/\t\.cprestore 416\n/; # 16 + 100 4-byte args
-               $p =~ s/^\tsubu\t\$sp,\$sp,\d+\n//;
-               $p =~ s/^\tsw\t\$31,\d+\(\$sp\)\n//;
-               $p =~ s/^\tsw\t\$fp,\d+\(\$sp\)\n//;
-               $p =~ s/^\tsw\t\$28,\d+\(\$sp\)\n//;
-               $p =~ s/__FRAME__/$FRAME/;
-               die "Prologue junk?: $p\n" if $p =~ /^\t[^\.]/;
-
-               # glue together what's left
-               $c = $p . $r;
-               $c =~ s/\n\t\n/\n/; # junk blank line
-           }
-       }
-
-       # toss all epilogue stuff; again, paranoidly;
-       # first, this basic sequence may occur "--- END ---" or not
-       $c =~ s/^\tlw\t\$31,\d+\(\$sp\)\n\taddu\t\$sp,\$sp,\d+\n\tj\t\$31\n\t\.end/\t\.end/;
-
-       if ( $c =~ /--- END ---/ ) {
-           if (($r, $e) = split(/--- END ---/, $c)) {
-               $e =~ s/^\tlw\t\$31,\d+\(\$sp\)\n//;
-               $e =~ s/^\tlw\t\$fp,\d+\(\$sp\)\n//;
-               $e =~ s/^\taddu\t\$sp,\$sp,\d+\n//;
-               $e =~ s/^\tj\t\$31\n//;
-               die "Epilogue junk?: $e\n" if $e =~ /^\t[^\.]/;
-
-               # glue together what's left
-               $c = $r . $e;
-               $c =~ s/\n\t\n/\n/; # junk blank line
-           }
-       }
-
-       # toss all calls to __DISCARD__
-       $c =~ s/^\tjal\t__DISCARD__\n//g;
-       # that may leave some gratuitous asm macros around
-       # (no harm done; but we get rid of them to be tidier)
-       $c =~ s/^\t\.set\tnoreorder\n\t\.set\tnomacro\n\taddu\t(\S+)\n\t\.set\tmacro\n\t\.set\treorder\n/\taddu\t$1\n/;
-
-       $c =~ s/FUNNY#END#THING//;
-       $chk[$i] = $c; # update w/ convenience copy
-
-       print STDERR "NB: Contains magic stuff!\n$c\n" if $c =~ /^\t[^\.].*(\$28)\b/;
-
-#      print STDERR "\nCHK $i (AFTER):\n", $c;
-
-    }
-
-    # print out the header stuff first
-    $chk[0] = "\t\.file\t1 \"$ifile_root.hc\"\n" . $chk[0];
-
-    # get rid of horrible "<dollar>Revision: .*$" strings
-    local(@lines0) = split(/\n/, $chk[0]);
-    local($z) = 0;
-    while ( $z <= $#lines0 ) {
-       if ( $lines0[$z] =~ /^\t\.byte\t0x24,0x52,0x65,0x76,0x69,0x73,0x69,0x6f$/ ) {
-           undef($lines0[$z]);
-           $z++;
-           while ( $z <= $#lines0 ) {
-               undef($lines0[$z]);
-               last if $lines0[$z] =~ /[,\t]0x0$/;
-               $z++;
-           }
-       }
-       $z++;
-    }
-    $chk[0] = join("\n", @lines0);
-    $chk[0] =~ s/\n\n+/\n/;
-    print OUTASM $chk[0];
-
-    # print out all the literal strings second
-    for ($i = 1; $i < $numchks; $i++) {
-       if ( $chkcat[$i] eq 'string' ) {
-           print OUTASM "\t\.rdata\n\t\.align 2\n";
-           print OUTASM $chk[$i];
-           
-           $chkcat[$i] = 'DONE ALREADY';
-       }
-    }
-
-    for ($i = 1; $i < $numchks; $i++) {
-#      print STDERR "$i: cat $chkcat[$i], symb $chksymb[$i]\n";
-
-       next if $chkcat[$i] eq 'DONE ALREADY';
-
-       if ( $chkcat[$i] eq 'misc' ) {
-           print OUTASM "\t\.text\n\t\.align 2\n";
-           print OUTASM $chk[$i];
-
-       } elsif ( $chkcat[$i] eq 'data' ) {
-           print OUTASM "\t\.data\n\t\.align 2\n";
-           print OUTASM $chk[$i];
-
-       } elsif ( $chkcat[$i] eq 'consist' ) {
-#? consistency string is just a v
-#? horrible bunch of .bytes,
-#? which I am too lazy to sort out (WDP 95/05)
-#?         if ( $chk[$i] =~ /\.ascii.*\)(hsc|cc) (.*)\\11"\n\t\.ascii\s+"(.*)\\0"/ ) {
-#?             local($consist) = "$1.$2.$3";
-#?             $consist =~ s/,/./g;
-#?             $consist =~ s/\//./g;
-#?             $consist =~ s/-/_/g;
-#?             $consist =~ s/[^A-Za-z0-9_.]/ZZ/g; # ToDo: properly?
-#?             print OUTASM "\t\.text\n$consist:\n";
-#?         } else {
-#?             print STDERR "Couldn't grok consistency: ", $chk[$i];
-#?         }
-
-       } elsif ( $chkcat[$i] eq 'splitmarker' ) {
-           # we can just re-constitute this one...
-           # ignore the final split marker, to save an empty object module
-           # Use _three_ underscores so that ghc-split doesn't get overly complicated
-           print OUTASM "___stg_split_marker",$chksymb[$i],":\n";
-
-       } elsif ( $chkcat[$i] eq 'closure'
-              || $chkcat[$i] eq 'infotbl'
-              || $chkcat[$i] eq 'slow'
-              || $chkcat[$i] eq 'fast' ) { # do them in that order
-           $symb = $chksymb[$i];
-
-           # CLOSURE
-           if ( defined($closurechk{$symb}) ) {
-               print OUTASM "\t\.data\n\t\.align 2\n";
-               print OUTASM $chk[$closurechk{$symb}];
-               $chkcat[$closurechk{$symb}] = 'DONE ALREADY';
-           }
-
-           # INFO TABLE
-           if ( defined($infochk{$symb}) ) {
-
-               print OUTASM "\t\.text\n\t\.align 2\n";
-               print OUTASM &rev_tbl($symb, $chk[$infochk{$symb}], 1);
-               # entry code will be put here!
-
-               # paranoia
-               if ( $chk[$infochk{$symb}] =~ /\.word\s+([A-Za-z0-9_]+_entry)$/
-                 && $1 ne "${symb}_entry" ) {
-                   print STDERR "!!! entry point???\n",$chk[$infochk{$symb}];
-               }
-
-               $chkcat[$infochk{$symb}] = 'DONE ALREADY';
-           }
-
-           # STD ENTRY POINT
-           if ( defined($slowchk{$symb}) ) {
-
-               # teach it to drop through to the fast entry point:
-               $c = $chk[$slowchk{$symb}];
-
-               if ( defined($fastchk{$symb}) ) {
-                   $c =~ s/^\tjmp \$31,\(\$27\),0\n\t\.align 4\n\t\.end/\t.align 4\n\t.end/;
-               }
-
-               # ToDo??? any good way to look for "dangling" references
-               # to fast-entry pt ???
-
-               print OUTASM "\t\.text\n\t\.align 2\n";
-               print OUTASM $c;
-               $chkcat[$slowchk{$symb}] = 'DONE ALREADY';
-           }
-           
-           # FAST ENTRY POINT
-           if ( defined($fastchk{$symb}) ) {
-               $c = $chk[$fastchk{$symb}];
-               if ( ! defined($slowchk{$symb}) ) {
-                   print OUTASM "\t\.text\n\t\.align 2\n";
-               }
-               print OUTASM $c;
-               $chkcat[$fastchk{$symb}] = 'DONE ALREADY';
-           }
-
-       } elsif ( $chkcat[$i] eq 'vector'
-              || $chkcat[$i] eq 'direct' ) { # do them in that order
-           $symb = $chksymb[$i];
-
-           # VECTOR TABLE
-           if ( defined($vectorchk{$symb}) ) {
-               print OUTASM "\t\.text\n\t\.align 2\n";
-               print OUTASM &rev_tbl($symb, $chk[$vectorchk{$symb}], 0);
-               # direct return code will be put here!
-               $chkcat[$vectorchk{$symb}] = 'DONE ALREADY';
-           }
-
-           # DIRECT RETURN
-           if ( defined($directchk{$symb}) ) {
-               print OUTASM "\t\.text\n\t\.align 2\n";
-               print OUTASM $chk[$directchk{$symb}];
-               $chkcat[$directchk{$symb}] = 'DONE ALREADY';
-           } else {
-                # The commented nop is for the splitter, to ensure
-                # that no module ends with a label as the very last
-                # thing.  (The linker will adjust the label to point
-                # to the first code word of the next module linked in,
-                # even if alignment constraints cause the label to move!)
-
-               print OUTASM "\t# nop\n";
-           }
-       } else {
-           &tidy_up_and_die(1,"$Pgm: unknown chkcat (ghc-asm alpha)\n$chkcat[$i]\n$chk[$i]\n");
-       }
-    }
-
-    print OUTASM $EXTERN_DECLS;
-
-    # finished:
-    close(OUTASM) || &tidy_up_and_die(1,"Failed writing to $out_asmf\n");
-    close(INASM)  || &tidy_up_and_die(1,"Failed reading from $in_asmf\n");
-}
-\end{code}
-
-\begin{code}
-sub init_FUNNY_THINGS {
-    %KNOWN_FUNNY_THING = (
-       'CheckHeapCode:', 1,
-       'CommonUnderflow:', 1,
-       'Continue:', 1,
-       'EnterNodeCode:', 1,
-       'ErrorIO_call_count:', 1,
-       'ErrorIO_innards:', 1,
-       'IndUpdRetDir:', 1,
-       'IndUpdRetV0:', 1,
-       'IndUpdRetV1:', 1,
-       'IndUpdRetV2:', 1,
-       'IndUpdRetV3:', 1,
-       'IndUpdRetV4:', 1,
-       'IndUpdRetV5:', 1,
-       'IndUpdRetV6:', 1,
-       'IndUpdRetV7:', 1,
-       'PrimUnderflow:', 1,
-       'StackUnderflowEnterNode:', 1,
-       'StdErrorCode:', 1,
-       'UnderflowVect0:', 1,
-       'UnderflowVect1:', 1,
-       'UnderflowVect2:', 1,
-       'UnderflowVect3:', 1,
-       'UnderflowVect4:', 1,
-       'UnderflowVect5:', 1,
-       'UnderflowVect6:', 1,
-       'UnderflowVect7:', 1,
-       'UpdErr:', 1,
-       'UpdatePAP:', 1,
-       'WorldStateToken:', 1,
-       '_Enter_Internal:', 1,
-       '_PRMarking_MarkNextAStack:', 1,
-       '_PRMarking_MarkNextBStack:', 1,
-       '_PRMarking_MarkNextCAF:', 1,
-       '_PRMarking_MarkNextGA:', 1,
-       '_PRMarking_MarkNextRoot:', 1,
-       '_PRMarking_MarkNextSpark:', 1,
-       '_Scavenge_Forward_Ref:', 1,
-       '__std_entry_error__:', 1,
-       '_startMarkWorld:', 1,
-       'resumeThread:', 1,
-       'startCcRegisteringWorld:', 1,
-       'startEnterFloat:', 1,
-       'startEnterInt:', 1,
-       'startPerformIO:', 1,
-       'startStgWorld:', 1,
-       'stopPerformIO:', 1
-  );
-}
-\end{code}
-
-The following table reversal is used for both info tables and return
-vectors.  In both cases, we remove the first entry from the table,
-reverse the table, put the label at the end, and paste some code
-(that which is normally referred to by the first entry in the table)
-right after the table itself.  (The code pasting is done elsewhere.)
-
-\begin{code}
-sub rev_tbl {
-    local($symb, $tbl, $discard1) = @_;
-
-    local($before) = '';
-    local($label) = '';
-    local(@words) = ();
-    local($after) = '';
-    local(@lines) = split(/\n/, $tbl);
-    local($i);
-
-    for ($i = 0; $i <= $#lines && $lines[$i] !~ /^\t\.word\s+/; $i++) {
-       $label .= $lines[$i] . "\n",
-           next if $lines[$i] =~ /^[A-Za-z0-9_]+:$/
-                || $lines[$i] =~ /^\t\.globl/;
-
-       $before .= $lines[$i] . "\n"; # otherwise...
-    }
-
-    for ( ; $i <= $#lines && $lines[$i] =~ /^\t\.word\s+/; $i++) {
-       push(@words, $lines[$i]);
-    }
-    # now throw away the first word (entry code):
-    shift(@words) if $discard1;
-
-    for (; $i <= $#lines; $i++) {
-       $after .= $lines[$i] . "\n";
-    }
-
-    $tbl = $before . join("\n", (reverse @words)) . "\n" . $label . $after;
-
-#    print STDERR "before=$before\n";
-#    print STDERR "label=$label\n";
-#    print STDERR "words=",(reverse @words),"\n";
-#    print STDERR "after=$after\n";
-
-    $tbl;
-}
-
-# make "require"r happy...
-1;
-\end{code}
diff --git a/ghc/driver/ghc-asm-sgi.prl b/ghc/driver/ghc-asm-sgi.prl
deleted file mode 100644 (file)
index 2bb357b..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-# line 10 "ghc-asm-sgi.lprl"
-sub mangle_asm {
-
-    local($in_asmf, $out_asmf) = @_;
-    local($fun_code);
-
-    # multi-line regexp matching:
-    local($*) = 1;
-    local($i, $c);
-    &init_FUNNY_THINGS();
-
-    open(INASM, "< $in_asmf")
-       || &tidy_up_and_die(1,"$Pgm: failed to open `$in_asmf' (to read)\n");
-    open(OUTASM,"> $out_asmf")
-       || &tidy_up_and_die(1,"$Pgm: failed to open `$out_asmf' (to write)\n");
-
-    # just copy through now...
-    while (<INASM>) {
-       print OUTASM $_;
-    }
-
-    close(OUTASM) || &tidy_up_and_die(1,"Failed writing to $out_asmf\n");
-    close(INASM)  || &tidy_up_and_die(1,"Failed reading from $in_asmf\n");
-}
-# line 36 "ghc-asm-sgi.lprl"
-sub init_FUNNY_THINGS {
-    print STDERR "SGI: init_FUNNY_THINGS\n";
-}
-# line 48 "ghc-asm-sgi.lprl"
-sub rev_tbl {
-    local($symb, $tbl, $discard1) = @_;
-
-    local($before) = '';
-    local($label) = '';
-    local(@words) = ();
-    local($after) = '';
-    local(@lines) = split(/\n/, $tbl);
-    local($i);
-
-    for ($i = 0; $i <= $#lines && $lines[$i] !~ /^\t\.word\s+/; $i++) {
-       $label .= $lines[$i] . "\n",
-           next if $lines[$i] =~ /^[A-Za-z0-9_]+:$/
-                || $lines[$i] =~ /^\t\.global/;
-
-       $before .= $lines[$i] . "\n"; # otherwise...
-    }
-
-    for ( ; $i <= $#lines && $lines[$i] =~ /^\t\.word\s+/; $i++) {
-       push(@words, $lines[$i]);
-    }
-    # now throw away the first word (entry code):
-    shift(@words) if $discard1;
-
-    for (; $i <= $#lines; $i++) {
-       $after .= $lines[$i] . "\n";
-    }
-
-    $tbl = $before . join("\n", (reverse @words)) . "\n" . $label . $after;
-
-#    print STDERR "before=$before\n";
-#    print STDERR "label=$label\n";
-#    print STDERR "words=",(reverse @words),"\n";
-#    print STDERR "after=$after\n";
-
-    $tbl;
-}
-# line 88 "ghc-asm-sgi.lprl"
-# make "require"r happy...
-1;
diff --git a/ghc/driver/ghc-asm-solaris.lprl b/ghc/driver/ghc-asm-solaris.lprl
deleted file mode 100644 (file)
index 6359c66..0000000
+++ /dev/null
@@ -1,498 +0,0 @@
-%************************************************************************
-%*                                                                     *
-\section[Driver-asm-fiddling]{Fiddling with assembler files (SPARC)}
-%*                                                                     *
-%************************************************************************
-
-Tasks:
-\begin{itemize}
-\item
-Utterly stomp out C functions' prologues and epilogues; i.e., the
-stuff to do with the C stack.
-\item
-(SPARC) [Related] Utterly stomp out the changing of register windows.
-\item
-Any other required tidying up.
-\end{itemize}
-
-\begin{code}
-sub mangle_asm {
-    local($in_asmf, $out_asmf) = @_;
-
-    # multi-line regexp matching:
-    local($*) = 1;
-    local($i, $c);
-    &init_FUNNY_THINGS();
-
-    open(INASM, "< $in_asmf")
-       || &tidy_up_and_die(1,"$Pgm: failed to open `$in_asmf' (to read)\n");
-    open(OUTASM,"> $out_asmf")
-       || &tidy_up_and_die(1,"$Pgm: failed to open `$out_asmf' (to write)\n");
-
-    # read whole file, divide into "chunks":
-    #  record some info about what we've found...
-
-    @chk = ();         # contents of the chunk
-    $numchks = 0;      # number of them
-    @chkcat = ();      # what category of thing in each chunk
-    @chksymb = ();     # what symbol(base) is defined in this chunk
-    %slowchk = ();     # ditto, its regular "slow" entry code
-    %fastchk = ();     # ditto, fast entry code
-    %closurechk = ();  # ditto, the (static) closure
-    %infochk = ();     # given a symbol base, say what chunk its info tbl is in
-    %vectorchk = ();    # ditto, return vector table
-    %directchk = ();    # ditto, direct return code
-
-    $i = 0;
-    $chkcat[0] = 'misc';
-
-    while (<INASM>) {
-
-       if ( /^\s+/ ) { # most common case first -- a simple line!
-           # duplicated from the bottom
-
-           $chk[$i] .= $_;
-
-       } elsif ( /^\.LLC(\d+):$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'string';
-           $chksymb[$i] = $1;
-
-       } elsif ( /^__stg_split_marker(\d+):$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'splitmarker';
-           $chksymb[$i] = $1;
-
-       } elsif ( /^([A-Za-z0-9_]+)_info:$/ ) {
-           $symb = $1;
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'infotbl';
-           $chksymb[$i] = $symb;
-
-           die "Info table already? $symb; $i\n" if defined($infochk{$symb});
-
-           $infochk{$symb} = $i;
-
-       } elsif ( /^([A-Za-z0-9_]+)_entry:$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'slow';
-           $chksymb[$i] = $1;
-
-           $slowchk{$1} = $i;
-
-       } elsif ( /^([A-Za-z0-9_]+)_fast\d+:$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'fast';
-           $chksymb[$i] = $1;
-
-           $fastchk{$1} = $i;
-
-       } elsif ( /^([A-Za-z0-9_]+)_closure:$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'closure';
-           $chksymb[$i] = $1;
-
-           $closurechk{$1} = $i;
-
-       } elsif ( /^ghc.*c_ID:/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'consist';
-
-       } elsif ( /^(__gnu_compiled_c|gcc2_compiled\.):/ ) {
-           ; # toss it
-
-       } elsif ( /^ErrorIO_call_count:/         # HACK!!!!
-              || /^[A-Za-z0-9_]+\.\d+:$/
-              || /_CAT:/                       # PROF: _entryname_CAT
-              || /^CC_.*_struct:/              # PROF: _CC_ccident_struct
-              || /_done:/                      # PROF: _module_done
-              || /^_module_registered:/        # PROF: _module_registered
-              ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'data';
-           $chksymb[$i] = '';
-
-       } elsif ( /^(ret_|djn_)/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'misc';
-           $chksymb[$i] = '';
-
-       } elsif ( /^vtbl_([A-Za-z0-9_]+):$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'vector';
-           $chksymb[$i] = $1;
-
-           $vectorchk{$1} = $i;
-
-       } elsif ( /^([A-Za-z0-9_]+)DirectReturn:$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'direct';
-           $chksymb[$i] = $1;
-
-           $directchk{$1} = $i;
-
-       } elsif ( /^[A-Za-z0-9_]+_upd:$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'misc';
-           $chksymb[$i] = '';
-
-       } elsif ( /^[A-Za-z0-9_]/ ) {
-           local($thing);
-           chop($thing = $_);
-           print STDERR "Funny global thing?: $_"
-               unless $KNOWN_FUNNY_THING{$thing}
-                   || /^_(PRIn|PRStart).*:/    # pointer reversal GC routines
-                   || /^CC_.*:/                # PROF: _CC_ccident
-                   || /^_reg.*:/;              # PROF: __reg<module>
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'misc';
-           $chksymb[$i] = '';
-
-       } else { # simple line (duplicated at the top)
-
-           $chk[$i] .= $_;
-       }
-    }
-    $numchks = $#chk + 1;
-
-#    print STDERR "\nCLOSURES:\n";
-#    foreach $s (sort (keys %closurechk)) {
-#      print STDERR "$s:\t\t",$closurechk{$s},"\n";
-#    }
-#    print STDERR "\nINFOS:\n";
-#    foreach $s (sort (keys %infochk)) {
-#      print STDERR "$s:\t\t",$infochk{$s},"\n";
-#    }
-#    print STDERR "SLOWS:\n";
-#    foreach $s (sort (keys %slowchk)) {
-#      print STDERR "$s:\t\t",$slowchk{$s},"\n";
-#    }
-#    print STDERR "\nFASTS:\n";
-#    foreach $s (sort (keys %fastchk)) {
-#      print STDERR "$s:\t\t",$fastchk{$s},"\n";
-#    }
-
-    # the division into chunks is imperfect;
-    # we throw some things over the fence into the next
-    # chunk.
-    #
-    # also, there are things we would like to know
-    # about the whole module before we start spitting
-    # output.
-
-    # NB: we start meddling at chunk 1, not chunk 0
-
-    for ($i = 1; $i < $numchks; $i++) {
-       $c = $chk[$i]; # convenience copy
-
-#      print STDERR "\nCHK $i (BEFORE):\n", $c;
-
-       # toss all reg-window stuff (save/restore/ret[l] s):
-       $c =~ s/^\t(save .*|restore|ret|retl)\n//g;
-       # throw away PROLOGUE comments
-       $c =~ s/^\t!#PROLOGUE# 0\n\t!#PROLOGUE# 1\n//;
-
-       # pin a funny end-thing on (for easier matching):
-       $c .= 'FUNNY#END#THING';
-
-       # pick some end-things and move them to the next chunk
-
-       while ( $c =~ /^(\s+\.align\s+\d+\n|\s+\.proc\s+\d+\n|\s+\.global\s+\S+\n|\.text\n|\.data\n|\.stab.*\n|\.section.*\n|\s+\.type.*\n|\s+\.size.*\n)FUNNY#END#THING/ ) {
-           $to_move = $1;
-
-           if ( $to_move =~ /\.(global|proc|stab)/ && $i < ($numchks - 1) ) {
-               $chk[$i + 1] = $to_move . $chk[$i + 1];
-               # otherwise they're tossed
-           }
-
-           $c =~ s/^.*\nFUNNY#END#THING/FUNNY#END#THING/;
-       }
-
-       $c =~ s/FUNNY#END#THING//;
-       $chk[$i] = $c; # update w/ convenience copy
-    }
-
-    # print out all the literal strings first
-    for ($i = 0; $i < $numchks; $i++) {
-       if ( $chkcat[$i] eq 'string' ) {
-           print OUTASM "\.text\n\t\.align 8\n";
-           print OUTASM $chk[$i];
-           
-           $chkcat[$i] = 'DONE ALREADY';
-       }
-    }
-
-    for ($i = 1; $i < $numchks; $i++) {
-#      print STDERR "$i: cat $chkcat[$i], symb $chksymb[$i]\n";
-
-       next if $chkcat[$i] eq 'DONE ALREADY';
-
-       if ( $chkcat[$i] eq 'misc' ) {
-           print OUTASM "\.text\n\t\.align 4\n";
-           print OUTASM $chk[$i];
-
-       } elsif ( $chkcat[$i] eq 'data' ) {
-           print OUTASM "\.data\n\t\.align 8\n";
-           print OUTASM $chk[$i];
-
-       } elsif ( $chkcat[$i] eq 'consist' ) {
-           if ( $chk[$i] =~ /\.asciz.*\)(hsc|cc) (.*)\\t(.*)"/ ) {
-               local($consist) = "$1.$2.$3";
-               $consist =~ s/,/./g;
-               $consist =~ s/\//./g;
-               $consist =~ s/-/_/g;
-               $consist =~ s/[^A-Za-z0-9_.]/ZZ/g; # ToDo: properly?
-               print OUTASM "\.text\n$consist:\n";
-           } else {
-               print STDERR "Couldn't grok consistency: ", $chk[$i];
-           }
-
-       } elsif ( $chkcat[$i] eq 'splitmarker' ) {
-           # we can just re-constitute this one...
-           print OUTASM "___stg_split_marker",$chksymb[$i],":\n";
-
-       } elsif ( $chkcat[$i] eq 'closure'
-              || $chkcat[$i] eq 'infotbl'
-              || $chkcat[$i] eq 'slow'
-              || $chkcat[$i] eq 'fast' ) { # do them in that order
-           $symb = $chksymb[$i];
-
-           # CLOSURE
-           if ( defined($closurechk{$symb}) ) {
-               print OUTASM "\.data\n\t\.align 4\n";
-               print OUTASM $chk[$closurechk{$symb}];
-               $chkcat[$closurechk{$symb}] = 'DONE ALREADY';
-           }
-
-           # INFO TABLE
-           if ( defined($infochk{$symb}) ) {
-
-               print OUTASM "\.text\n\t\.align 4\n";
-               print OUTASM &rev_tbl($symb, $chk[$infochk{$symb}], 1);
-               # entry code will be put here!
-
-               # paranoia
-               if ( $chk[$infochk{$symb}] =~ /\.word\s+([A-Za-z0-9_]+_entry)$/
-                 && $1 ne "${symb}_entry" ) {
-                   print STDERR "!!! entry point???\n",$chk[$infochk{$symb}];
-               }
-
-               $chkcat[$infochk{$symb}] = 'DONE ALREADY';
-           }
-
-           # STD ENTRY POINT
-           if ( defined($slowchk{$symb}) ) {
-
-               # teach it to drop through to the fast entry point:
-               $c = $chk[$slowchk{$symb}];
-
-               if ( defined($fastchk{$symb}) ) {
-                   $c =~ s/^\tcall ${symb}_fast\d+,.*\n\tnop\n//;
-                   $c =~ s/^\tcall ${symb}_fast\d+,.*\n(\t[a-z].*\n)/\1/;
-               }
-
-               print STDERR "still has jump to fast entry point:\n$c"
-                   if $c =~ /${symb}_fast/; # NB: paranoia
-
-               print OUTASM "\.text\n\t\.align 4\n";
-               print OUTASM $c;
-               $chkcat[$slowchk{$symb}] = 'DONE ALREADY';
-           }
-           
-           # FAST ENTRY POINT
-           if ( defined($fastchk{$symb}) ) {
-               print OUTASM "\.text\n\t\.align 4\n";
-               print OUTASM $chk[$fastchk{$symb}];
-               $chkcat[$fastchk{$symb}] = 'DONE ALREADY';
-           }
-
-       } elsif ( $chkcat[$i] eq 'vector'
-              || $chkcat[$i] eq 'direct' ) { # do them in that order
-           $symb = $chksymb[$i];
-
-           # VECTOR TABLE
-           if ( defined($vectorchk{$symb}) ) {
-               print OUTASM "\.text\n\t\.align 4\n";
-               print OUTASM &rev_tbl($symb, $chk[$vectorchk{$symb}], 0);
-               # direct return code will be put here!
-               $chkcat[$vectorchk{$symb}] = 'DONE ALREADY';
-           }
-
-           # DIRECT RETURN
-           if ( defined($directchk{$symb}) ) {
-               print OUTASM "\.text\n\t\.align 4\n";
-               print OUTASM $chk[$directchk{$symb}];
-               $chkcat[$directchk{$symb}] = 'DONE ALREADY';
-           }
-           
-       } else {
-           &tidy_up_and_die(1,"$Pgm: unknown chkcat (ghc-asm SPARC)\n$chkcat[$i]\n$chk[$i]\n");
-       }
-    }
-
-    # finished:
-    close(OUTASM) || &tidy_up_and_die(1,"Failed writing to $out_asmf\n");
-    close(INASM)  || &tidy_up_and_die(1,"Failed reading from $in_asmf\n");
-}
-\end{code}
-
-\begin{code}
-sub init_FUNNY_THINGS {
-    %KNOWN_FUNNY_THING = (
-       'CheckHeapCode:', 1,
-       'CommonUnderflow:', 1,
-       'Continue:', 1,
-       'EnterNodeCode:', 1,
-       'ErrorIO_call_count:', 1,
-       'ErrorIO_innards:', 1,
-       'IndUpdRetDir:', 1,
-       'IndUpdRetV0:', 1,
-       'IndUpdRetV1:', 1,
-       'IndUpdRetV2:', 1,
-       'IndUpdRetV3:', 1,
-       'IndUpdRetV4:', 1,
-       'IndUpdRetV5:', 1,
-       'IndUpdRetV6:', 1,
-       'IndUpdRetV7:', 1,
-       'PrimUnderflow:', 1,
-       'StackUnderflowEnterNode:', 1,
-       'StdErrorCode:', 1,
-       'UnderflowVect0:', 1,
-       'UnderflowVect1:', 1,
-       'UnderflowVect2:', 1,
-       'UnderflowVect3:', 1,
-       'UnderflowVect4:', 1,
-       'UnderflowVect5:', 1,
-       'UnderflowVect6:', 1,
-       'UnderflowVect7:', 1,
-       'UpdErr:', 1,
-       'UpdatePAP:', 1,
-       'WorldStateToken:', 1,
-       '_Enter_Internal:', 1,
-       '_PRMarking_MarkNextAStack:', 1,
-       '_PRMarking_MarkNextBStack:', 1,
-       '_PRMarking_MarkNextCAF:', 1,
-       '_PRMarking_MarkNextGA:', 1,
-       '_PRMarking_MarkNextRoot:', 1,
-       '_PRMarking_MarkNextSpark:', 1,
-       '_Scavenge_Forward_Ref:', 1,
-       '__std_entry_error__:', 1,
-       '_startMarkWorld:', 1,
-       'resumeThread:', 1,
-       'startCcRegisteringWorld:', 1,
-       'startEnterFloat:', 1,
-       'startEnterInt:', 1,
-       'startPerformIO:', 1,
-       'startStgWorld:', 1,
-       'stopPerformIO:', 1
-    );
-}
-\end{code}
-
-The following table reversal is used for both info tables and return
-vectors.  In both cases, we remove the first entry from the table,
-reverse the table, put the label at the end, and paste some code
-(that which is normally referred to by the first entry in the table)
-right after the table itself.  (The code pasting is done elsewhere.)
-
-\begin{code}
-sub rev_tbl {
-    local($symb, $tbl, $discard1) = @_;
-
-    local($before) = '';
-    local($label) = '';
-    local(@words) = ();
-    local($after) = '';
-    local(@lines) = split(/\n/, $tbl);
-    local($i);
-
-    for ($i = 0; $i <= $#lines && $lines[$i] !~ /^\t\.word\s+/; $i++) {
-       $label .= $lines[$i] . "\n",
-           next if $lines[$i] =~ /^[A-Za-z0-9_]+:$/
-                || $lines[$i] =~ /^\t\.global/;
-
-       $before .= $lines[$i] . "\n"; # otherwise...
-    }
-
-    for ( ; $i <= $#lines && $lines[$i] =~ /^\t\.word\s+/; $i++) {
-       push(@words, $lines[$i]);
-    }
-    # now throw away the first word (entry code):
-    shift(@words) if $discard1;
-
-    for (; $i <= $#lines; $i++) {
-       $after .= $lines[$i] . "\n";
-    }
-
-    $tbl = $before . join("\n", (reverse @words)) . "\n" . $label . $after;
-
-#    print STDERR "before=$before\n";
-#    print STDERR "label=$label\n";
-#    print STDERR "words=",(reverse @words),"\n";
-#    print STDERR "after=$after\n";
-
-    $tbl;
-}
-\end{code}
-
-%************************************************************************
-%*                                                                     *
-\subsection[Driver-asm-info]{Collect interesting (static) info from an assembler file}
-%*                                                                     *
-%************************************************************************
-
-How many times is each asm instruction used?
-
-\begin{code}
-%AsmInsn = (); # init
-
-sub dump_asm_insn_counts {
-    local($asmf) = @_;
-
-    open(INASM, "< $asmf")  || &tidy_up_and_die(1,"$Pgm: failed to open `$asmf' (to read)\n");
-    while (<INASM>) {
-       if ( /^\t([a-z][a-z0-9]+)\b/ ) {
-           $AsmInsn{$1} ++;
-       }
-    }
-    close(INASM) || &tidy_up_and_die(1,"Failed reading from $asmf\n");
-
-    # OK, now print what we collected (to stderr)
-    foreach $i (sort (keys %AsmInsn)) {
-       print STDERR "INSN:: $i\t",$AsmInsn{$i},"\n";
-    }
-}
-\end{code}
-
-How many times is each ``global variable'' used in a \tr{sethi}
-instruction (SPARC)?  This can give some guidance about what should be
-put in machine registers...
-
-\begin{code}
-%SethiGlobal = (); # init
-
-sub dump_asm_globals_info {
-    local($asmf) = @_;
-
-    local($globl);
-
-    open(INASM, "< $asmf")  || &tidy_up_and_die(1,"$Pgm: failed to open `$asmf' (to read)\n");
-    while (<INASM>) {
-       if ( /^\tsethi \%hi\(_([_A-Za-z0-9]+)/ ) {
-           $globl = $1;
-           next if $globl =~ /(ds|fail|stg|tpl|vtbl)_[0-9]+/;
-
-           $SethiGlobal{$globl} ++;
-       }
-    }
-    close(INASM) || &tidy_up_and_die(1,"Failed reading from $asmf\n");
-
-    # OK, now print what we collected (to stderr)
-    foreach $i (sort (keys %SethiGlobal)) {
-       print STDERR "GLOBAL:: $i\t",$SethiGlobal{$i},"\n";
-    }
-}
-
-# make "require"r happy...
-1;
-\end{code}
diff --git a/ghc/driver/ghc-asm-sparc.lprl b/ghc/driver/ghc-asm-sparc.lprl
deleted file mode 100644 (file)
index ffe91ae..0000000
+++ /dev/null
@@ -1,487 +0,0 @@
-%************************************************************************
-%*                                                                     *
-\section[Driver-asm-fiddling]{Fiddling with assembler files (SPARC)}
-%*                                                                     *
-%************************************************************************
-
-Tasks:
-\begin{itemize}
-\item
-Utterly stomp out C functions' prologues and epilogues; i.e., the
-stuff to do with the C stack.
-\item
-(SPARC) [Related] Utterly stomp out the changing of register windows.
-\item
-Any other required tidying up.
-\end{itemize}
-
-\begin{code}
-sub mangle_asm {
-    local($in_asmf, $out_asmf) = @_;
-
-    # multi-line regexp matching:
-    local($*) = 1;
-    local($i, $c);
-    &init_FUNNY_THINGS();
-
-    open(INASM, "< $in_asmf")
-       || &tidy_up_and_die(1,"$Pgm: failed to open `$in_asmf' (to read)\n");
-    open(OUTASM,"> $out_asmf")
-       || &tidy_up_and_die(1,"$Pgm: failed to open `$out_asmf' (to write)\n");
-
-    # read whole file, divide into "chunks":
-    #  record some info about what we've found...
-
-    @chk = ();         # contents of the chunk
-    $numchks = 0;      # number of them
-    @chkcat = ();      # what category of thing in each chunk
-    @chksymb = ();     # what symbol(base) is defined in this chunk
-    %slowchk = ();     # ditto, its regular "slow" entry code
-    %fastchk = ();     # ditto, fast entry code
-    %closurechk = ();  # ditto, the (static) closure
-    %infochk = ();     # given a symbol base, say what chunk its info tbl is in
-    %vectorchk = ();    # ditto, return vector table
-    %directchk = ();    # ditto, direct return code
-
-    $i = 0;
-    $chkcat[0] = 'misc';
-
-    while (<INASM>) {
-       next if /^\.stab.*___stg_split_marker/;
-       next if /^\.stab.*ghc.*c_ID/;
-
-       if ( /^\s+/ ) { # most common case first -- a simple line!
-           # duplicated from the bottom
-
-           $chk[$i] .= $_;
-
-       } elsif ( /^LC(\d+):$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'string';
-           $chksymb[$i] = $1;
-
-       } elsif ( /^___stg_split_marker(\d+):$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'splitmarker';
-           $chksymb[$i] = $1;
-
-       } elsif ( /^_([A-Za-z0-9_]+)_info:$/ ) {
-           $symb = $1;
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'infotbl';
-           $chksymb[$i] = $symb;
-
-           die "Info table already? $symb; $i\n" if defined($infochk{$symb});
-
-           $infochk{$symb} = $i;
-
-       } elsif ( /^_([A-Za-z0-9_]+)_entry:$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'slow';
-           $chksymb[$i] = $1;
-
-           $slowchk{$1} = $i;
-
-       } elsif ( /^_([A-Za-z0-9_]+)_fast\d+:$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'fast';
-           $chksymb[$i] = $1;
-
-           $fastchk{$1} = $i;
-
-       } elsif ( /^_([A-Za-z0-9_]+)_closure:$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'closure';
-           $chksymb[$i] = $1;
-
-           $closurechk{$1} = $i;
-
-       } elsif ( /^_ghc.*c_ID:/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'consist';
-
-       } elsif ( /^(___gnu_compiled_c|gcc2_compiled\.):/ ) {
-           ; # toss it
-
-       } elsif ( /^_ErrorIO_call_count:/        # HACK!!!!
-              || /^_[A-Za-z0-9_]+\.\d+:$/
-              || /^_.*_CAT:/                   # PROF: _entryname_CAT
-              || /^_CC_.*_struct:/             # PROF: _CC_ccident_struct
-              || /^_.*_done:/                  # PROF: _module_done
-              || /^__module_registered:/       # PROF: _module_registered
-              ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'data';
-           $chksymb[$i] = '';
-
-       } elsif ( /^_(ret_|djn_)/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'misc';
-           $chksymb[$i] = '';
-
-       } elsif ( /^_vtbl_([A-Za-z0-9_]+):$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'vector';
-           $chksymb[$i] = $1;
-
-           $vectorchk{$1} = $i;
-
-       } elsif ( /^_([A-Za-z0-9_]+)DirectReturn:$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'direct';
-           $chksymb[$i] = $1;
-
-           $directchk{$1} = $i;
-
-       } elsif ( /^_[A-Za-z0-9_]+_upd:$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'misc';
-           $chksymb[$i] = '';
-
-       } elsif ( /^_[A-Za-z0-9_]/ ) {
-           local($thing);
-           chop($thing = $_);
-           print STDERR "Funny global thing?: $_"
-               unless $KNOWN_FUNNY_THING{$thing}
-                   || /^__(PRIn|PRStart).*:/   # pointer reversal GC routines
-                   || /^_CC_.*:/               # PROF: _CC_ccident
-                   || /^__reg.*:/;             # PROF: __reg<module>
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'misc';
-           $chksymb[$i] = '';
-
-       } else { # simple line (duplicated at the top)
-
-           $chk[$i] .= $_;
-       }
-    }
-    $numchks = $#chk + 1;
-
-    # the division into chunks is imperfect;
-    # we throw some things over the fence into the next
-    # chunk.
-    #
-    # also, there are things we would like to know
-    # about the whole module before we start spitting
-    # output.
-
-    # NB: we start meddling at chunk 1, not chunk 0
-
-    for ($i = 1; $i < $numchks; $i++) {
-       $c = $chk[$i]; # convenience copy
-
-#      print STDERR "\nCHK $i (BEFORE):\n", $c;
-
-       # toss all reg-window stuff (save/restore/ret[l] s):
-       $c =~ s/^\t(save .*|restore|ret|retl)\n//g;
-       # throw away PROLOGUE comments
-       $c =~ s/^\t!#PROLOGUE# 0\n\t!#PROLOGUE# 1\n//;
-
-       # pin a funny end-thing on (for easier matching):
-       $c .= 'FUNNY#END#THING';
-
-       # pick some end-things and move them to the next chunk
-
-       while ( $c =~ /^(\s+\.align\s+\d+\n|\s+\.proc\s+\d+\n|\s+\.global\s+\S+\n|\.text\n|\.data\n|\.stab.*\n)FUNNY#END#THING/ ) {
-           $to_move = $1;
-
-           if ( $to_move =~ /\.(global|proc|stab)/ && $i < ($numchks - 1) ) {
-               $chk[$i + 1] = $to_move . $chk[$i + 1];
-               # otherwise they're tossed
-           }
-
-           $c =~ s/^.*\nFUNNY#END#THING/FUNNY#END#THING/;
-       }
-
-       $c =~ s/FUNNY#END#THING//;
-       $chk[$i] = $c; # update w/ convenience copy
-
-#      print STDERR "\nCHK $i (AFTER):\n", $c;
-    }
-
-    # print out all the literal strings first
-    for ($i = 0; $i < $numchks; $i++) {
-       if ( $chkcat[$i] eq 'string' ) {
-           print OUTASM "\.text\n\t\.align 8\n";
-           print OUTASM $chk[$i];
-           
-           $chkcat[$i] = 'DONE ALREADY';
-       }
-    }
-
-    for ($i = 0; $i < $numchks; $i++) {
-#      print STDERR "$i: cat $chkcat[$i], symb $chksymb[$i]\n";
-
-       next if $chkcat[$i] eq 'DONE ALREADY';
-
-       if ( $chkcat[$i] eq 'misc' ) {
-           print OUTASM "\.text\n\t\.align 4\n";
-           print OUTASM $chk[$i];
-
-       } elsif ( $chkcat[$i] eq 'data' ) {
-           print OUTASM "\.data\n\t\.align 8\n";
-           print OUTASM $chk[$i];
-
-       } elsif ( $chkcat[$i] eq 'consist' ) {
-           if ( $chk[$i] =~ /\.ascii.*\)(hsc|cc) (.*)\\11"\n\t\.ascii\s+"(.*)\\0"/ ) {
-               local($consist) = "$1.$2.$3";
-               $consist =~ s/,/./g;
-               $consist =~ s/\//./g;
-               $consist =~ s/-/_/g;
-               $consist =~ s/[^A-Za-z0-9_.]/ZZ/g; # ToDo: properly?
-               print OUTASM "\.text\n$consist:\n";
-           } else {
-               print STDERR "Couldn't grok consistency: ", $chk[$i];
-           }
-
-       } elsif ( $chkcat[$i] eq 'splitmarker' ) {
-           # we can just re-constitute this one...
-           print OUTASM "___stg_split_marker",$chksymb[$i],":\n";
-
-       } elsif ( $chkcat[$i] eq 'closure'
-              || $chkcat[$i] eq 'infotbl'
-              || $chkcat[$i] eq 'slow'
-              || $chkcat[$i] eq 'fast' ) { # do them in that order
-           $symb = $chksymb[$i];
-
-#      print STDERR "$i: cat $chkcat[$i], symb $symb ",defined($closurechk{$symb}),":",defined($infochk{$symb}),":",defined($slowchk{$symb}),":",defined($fastchk{$symb}),"\n";
-
-           # CLOSURE
-           if ( defined($closurechk{$symb}) ) {
-               print OUTASM "\.data\n\t\.align 4\n";
-               print OUTASM $chk[$closurechk{$symb}];
-               $chkcat[$closurechk{$symb}] = 'DONE ALREADY';
-           }
-
-           # INFO TABLE
-           if ( defined($infochk{$symb}) ) {
-
-               print OUTASM "\.text\n\t\.align 4\n";
-               print OUTASM &rev_tbl($symb, $chk[$infochk{$symb}], 1);
-               # entry code will follow, here!
-
-               # paranoia
-               if ( $chk[$infochk{$symb}] =~ /\.word\s+([A-Za-z0-9_]+_entry)$/
-                 && $1 ne "_${symb}_entry" ) {
-                   print STDERR "!!! entry point???\n",$chk[$infochk{$symb}];
-               }
-
-               $chkcat[$infochk{$symb}] = 'DONE ALREADY';
-           }
-
-           # STD ENTRY POINT
-           if ( defined($slowchk{$symb}) ) {
-
-               # teach it to drop through to the fast entry point:
-               $c = $chk[$slowchk{$symb}];
-
-               if ( defined($fastchk{$symb}) ) {
-                   $c =~ s/^\tcall _${symb}_fast\d+,.*\n\tnop\n//;
-                   $c =~ s/^\tcall _${symb}_fast\d+,.*\n(\t[a-z].*\n)/\1/;
-               }
-
-               print STDERR "still has jump to fast entry point:\n$c"
-                   if $c =~ /_${symb}_fast/; # NB: paranoia
-
-               print OUTASM "\.text\n\t\.align 4\n";
-               print OUTASM $c;
-               $chkcat[$slowchk{$symb}] = 'DONE ALREADY';
-           }
-           
-           # FAST ENTRY POINT
-           if ( defined($fastchk{$symb}) ) {
-               print OUTASM "\.text\n\t\.align 4\n";
-               print OUTASM $chk[$fastchk{$symb}];
-               $chkcat[$fastchk{$symb}] = 'DONE ALREADY';
-           }
-
-       } elsif ( $chkcat[$i] eq 'vector'
-              || $chkcat[$i] eq 'direct' ) { # do them in that order
-           $symb = $chksymb[$i];
-
-           # VECTOR TABLE
-           if ( defined($vectorchk{$symb}) ) {
-               print OUTASM "\.text\n\t\.align 4\n";
-               print OUTASM &rev_tbl($symb, $chk[$vectorchk{$symb}], 0);
-               # direct return code will be put here!
-               $chkcat[$vectorchk{$symb}] = 'DONE ALREADY';
-           }
-
-           # DIRECT RETURN
-           if ( defined($directchk{$symb}) ) {
-               print OUTASM "\.text\n\t\.align 4\n";
-               print OUTASM $chk[$directchk{$symb}];
-               $chkcat[$directchk{$symb}] = 'DONE ALREADY';
-           }
-           
-       } else {
-           &tidy_up_and_die(1,"$Pgm: unknown chkcat (ghc-asm SPARC)\n$chkcat[$i]\n$chk[$i]\n");
-       }
-    }
-
-    # finished:
-    close(OUTASM) || &tidy_up_and_die(1,"Failed writing to $out_asmf\n");
-    close(INASM)  || &tidy_up_and_die(1,"Failed reading from $in_asmf\n");
-}
-\end{code}
-
-\begin{code}
-sub init_FUNNY_THINGS {
-    %KNOWN_FUNNY_THING = (
-       '_CheckHeapCode:', 1,
-       '_CommonUnderflow:', 1,
-       '_Continue:', 1,
-       '_EnterNodeCode:', 1,
-       '_ErrorIO_call_count:', 1,
-       '_ErrorIO_innards:', 1,
-       '_IndUpdRetDir:', 1,
-       '_IndUpdRetV0:', 1,
-       '_IndUpdRetV1:', 1,
-       '_IndUpdRetV2:', 1,
-       '_IndUpdRetV3:', 1,
-       '_IndUpdRetV4:', 1,
-       '_IndUpdRetV5:', 1,
-       '_IndUpdRetV6:', 1,
-       '_IndUpdRetV7:', 1,
-       '_PrimUnderflow:', 1,
-       '_StackUnderflowEnterNode:', 1,
-       '_StdErrorCode:', 1,
-       '_UnderflowVect0:', 1,
-       '_UnderflowVect1:', 1,
-       '_UnderflowVect2:', 1,
-       '_UnderflowVect3:', 1,
-       '_UnderflowVect4:', 1,
-       '_UnderflowVect5:', 1,
-       '_UnderflowVect6:', 1,
-       '_UnderflowVect7:', 1,
-       '_UpdErr:', 1,
-       '_UpdatePAP:', 1,
-       '_WorldStateToken:', 1,
-       '__Enter_Internal:', 1,
-       '__PRMarking_MarkNextAStack:', 1,
-       '__PRMarking_MarkNextBStack:', 1,
-       '__PRMarking_MarkNextCAF:', 1,
-       '__PRMarking_MarkNextGA:', 1,
-       '__PRMarking_MarkNextRoot:', 1,
-       '__PRMarking_MarkNextSpark:', 1,
-       '__Scavenge_Forward_Ref:', 1,
-       '___std_entry_error__:', 1,
-       '__startMarkWorld:', 1,
-       '_resumeThread:', 1,
-       '_startCcRegisteringWorld:', 1,
-       '_startEnterFloat:', 1,
-       '_startEnterInt:', 1,
-       '_startPerformIO:', 1,
-       '_startStgWorld:', 1,
-       '_stopPerformIO:', 1
-    );
-}
-\end{code}
-
-The following table reversal is used for both info tables and return
-vectors.  In both cases, we remove the first entry from the table,
-reverse the table, put the label at the end, and paste some code
-(that which is normally referred to by the first entry in the table)
-right after the table itself.  (The code pasting is done elsewhere.)
-
-\begin{code}
-sub rev_tbl {
-    local($symb, $tbl, $discard1) = @_;
-
-    local($before) = '';
-    local($label) = '';
-    local(@words) = ();
-    local($after) = '';
-    local(@lines) = split(/\n/, $tbl);
-    local($i);
-
-    for ($i = 0; $i <= $#lines && $lines[$i] !~ /^\t\.word\s+/; $i++) {
-       $label .= $lines[$i] . "\n",
-           next if $lines[$i] =~ /^[A-Za-z0-9_]+:$/
-                || $lines[$i] =~ /^\t\.global/;
-
-       $before .= $lines[$i] . "\n"; # otherwise...
-    }
-
-    for ( ; $i <= $#lines && $lines[$i] =~ /^\t\.word\s+/; $i++) {
-       push(@words, $lines[$i]);
-    }
-    # now throw away the first word (entry code):
-    shift(@words) if $discard1;
-
-    for (; $i <= $#lines; $i++) {
-       $after .= $lines[$i] . "\n";
-    }
-
-    $tbl = $before . join("\n", (reverse @words)) . "\n" . $label . $after;
-
-#    print STDERR "before=$before\n";
-#    print STDERR "label=$label\n";
-#    print STDERR "words=",(reverse @words),"\n";
-#    print STDERR "after=$after\n";
-
-    $tbl;
-}
-\end{code}
-
-%************************************************************************
-%*                                                                     *
-\subsection[Driver-asm-info]{Collect interesting (static) info from an assembler file}
-%*                                                                     *
-%************************************************************************
-
-How many times is each asm instruction used?
-
-\begin{code}
-%AsmInsn = (); # init
-
-sub dump_asm_insn_counts {
-    local($asmf) = @_;
-
-    open(INASM, "< $asmf")  || &tidy_up_and_die(1,"$Pgm: failed to open `$asmf' (to read)\n");
-    while (<INASM>) {
-       if ( /^\t([a-z][a-z0-9]+)\b/ ) {
-           $AsmInsn{$1} ++;
-       }
-    }
-    close(INASM) || &tidy_up_and_die(1,"Failed reading from $asmf\n");
-
-    # OK, now print what we collected (to stderr)
-    foreach $i (sort (keys %AsmInsn)) {
-       print STDERR "INSN:: $i\t",$AsmInsn{$i},"\n";
-    }
-}
-\end{code}
-
-How many times is each ``global variable'' used in a \tr{sethi}
-instruction (SPARC)?  This can give some guidance about what should be
-put in machine registers...
-
-\begin{code}
-%SethiGlobal = (); # init
-
-sub dump_asm_globals_info {
-    local($asmf) = @_;
-
-    local($globl);
-
-    open(INASM, "< $asmf")  || &tidy_up_and_die(1,"$Pgm: failed to open `$asmf' (to read)\n");
-    while (<INASM>) {
-       if ( /^\tsethi \%hi\(_([_A-Za-z0-9]+)/ ) {
-           $globl = $1;
-           next if $globl =~ /(ds|fail|stg|tpl|vtbl)_[0-9]+/;
-
-           $SethiGlobal{$globl} ++;
-       }
-    }
-    close(INASM) || &tidy_up_and_die(1,"Failed reading from $asmf\n");
-
-    # OK, now print what we collected (to stderr)
-    foreach $i (sort (keys %SethiGlobal)) {
-       print STDERR "GLOBAL:: $i\t",$SethiGlobal{$i},"\n";
-    }
-}
-
-# make "require"r happy...
-1;
-\end{code}
index 4a4834c..0907b09 100644 (file)
@@ -13,6 +13,33 @@ stuff to do with the C stack.
 Any other required tidying up.
 \end{itemize}
 
+HPPA specific notes:
+\begin{itemize}
+\item
+The HP linker is very picky about symbols being in the appropriate
+space (code vs. data).  When we mangle the threaded code to put the
+info tables just prior to the code, they wind up in code space
+rather than data space.  This means that references to *_info from
+un-mangled parts of the RTS (e.g. unthreaded GC code) get
+unresolved symbols.  Solution:  mini-mangler for .c files on HP.  I
+think this should really be triggered in the driver by a new -rts
+option, so that user code doesn't get mangled inappropriately.
+\item
+With reversed tables, jumps are to the _info label rather than to
+the _entry label.  The _info label is just an address in code
+space, rather than an entry point with the descriptive blob we
+talked about yesterday.  As a result, you can't use the call-style
+JMP_ macro.  However, some JMP_ macros take _info labels as targets
+and some take code entry points within the RTS.  The latter won't
+work with the goto-style JMP_ macro.  Sigh.  Solution: Use the goto
+style JMP_ macro, and mangle some more assembly, changing all
+"RP'literal" and "LP'literal" references to "R'literal" and
+"L'literal," so that you get the real address of the code, rather
+than the descriptive blob.  Also change all ".word P%literal"
+entries in info tables and vector tables to just ".word literal,"
+for the same reason.  Advantage: No more ridiculous call sequences.
+\end{itemize}
+
 %************************************************************************
 %*                                                                     *
 \subsection{Constants for various architectures}
@@ -22,7 +49,62 @@ Any other required tidying up.
 \begin{code}
 sub init_TARGET_STUFF {
 
-    if ( $TargetPlatform =~ /^i386-.*-linuxaout/ ) {
+    #--------------------------------------------------------#
+    if ( $TargetPlatform =~ /^alpha-.*-.*/ ) {
+
+    $T_STABBY      = 0; # 1 iff .stab things (usually if a.out format)
+    $T_US          = ''; # _ if symbols have an underscore on the front
+    $T_DO_GC       = 'PerformGC_wrapper';
+    $T_PRE_APP     = 'DONT THINK THIS APPLIES'; # regexp that says what comes before APP/NO_APP
+    $T_CONST_LBL    = '^\$C(\d+):$'; # regexp for what such a lbl looks like
+    $T_POST_LBL            = ':';
+
+    $T_MOVE_DIRVS   = '^(\s*(\.align\s+\d+|\.(globl|ent)\s+\S+|\#.*|\.(file|loc)\s+\S+\s+\S+|\.text|\.r?data)\n)';
+    $T_COPY_DIRVS   = '^\s*(\#|\.(file|globl|ent|loc))';
+
+    $T_hsc_cc_PAT   = '\.ascii.*\)(hsc|cc) (.*)\\\\11"\n\t\.ascii\s+"(.*)\\\\0"';
+    $T_DOT_WORD            = '\.quad';
+    $T_DOT_GLOBAL   = "\t\.globl";
+    $T_HDR_literal  = "\.rdata\n\t\.align 3\n";
+    $T_HDR_misc            = "\.text\n\t\.align 3\n";
+    $T_HDR_data            = "\.data\n\t\.align 3\n";
+    $T_HDR_consist  = "\.text\n";
+    $T_HDR_closure  = "\.data\n\t\.align 3\n";
+    $T_HDR_info            = "\.text\n\t\.align 3\n";
+    $T_HDR_entry    = "\.text\n\t\.align 3\n";
+    $T_HDR_fast            = "\.text\n\t\.align 3\n";
+    $T_HDR_vector   = "\.text\n\t\.align 3\n";
+    $T_HDR_direct   = "\.text\n\t\.align 3\n";
+
+    #--------------------------------------------------------#
+    } elsif ( $TargetPlatform =~ /^hppa/ ) {
+
+    $T_STABBY      = 0; # 1 iff .stab things (usually if a.out format)
+    $T_US          = ''; # _ if symbols have an underscore on the front
+    $T_DO_GC       = 'PerformGC_wrapper';
+    $T_PRE_APP     = 'DONT THINK THIS APPLIES'; # regexp that says what comes before APP/NO_APP
+    $T_CONST_LBL    = '^L\$C(\d+)$'; # regexp for what such a lbl looks like
+    $T_POST_LBL            = '';
+
+    $T_MOVE_DIRVS   = '^((\s+\.(IMPORT|EXPORT|PARAM).*|\s+\.align\s+\d+|\s+\.(SPACE|SUBSPA)\s+\S+|\s*)\n)';
+    $T_COPY_DIRVS   = '^\s+\.(IMPORT|EXPORT)';
+
+    $T_hsc_cc_PAT   = '\.STRING.*\)(hsc|cc) (.*)\\\\x09(.*)\\\\x00';
+    $T_DOT_WORD            = '\.word';
+    $T_DOT_GLOBAL   = '\s+\.EXPORT';
+    $T_HDR_literal  = "\t.SPACE \$TEXT\$\n\t.SUBSPA \$LIT\$\n";
+    $T_HDR_misc            = "\t.SPACE \$TEXT\$\n\t.SUBSPA \$CODE\$\n\t\.align 4\n";
+    $T_HDR_data            = "\t.SPACE \$PRIVATE\$\n\t.SUBSPA \$DATA\$\n\t\.align 4\n";
+    $T_HDR_consist  = "\t.SPACE \$TEXT\$\n\t.SUBSPA \$LIT\$\n";
+    $T_HDR_closure  = "\t.SPACE \$PRIVATE\$\n\t.SUBSPA \$DATA\$\n\t\.align 4\n";
+    $T_HDR_info            = "\t.SPACE \$TEXT\$\n\t.SUBSPA \$CODE\$\n\t\.align 4\n";
+    $T_HDR_entry    = "\t.SPACE \$TEXT\$\n\t.SUBSPA \$CODE\$\n\t\.align 4\n";
+    $T_HDR_fast            = "\t.SPACE \$TEXT\$\n\t.SUBSPA \$CODE\$\n\t\.align 4\n";
+    $T_HDR_vector   = "\t.SPACE \$TEXT\$\n\t.SUBSPA \$CODE\$\n\t\.align 4\n";
+    $T_HDR_direct   = "\t.SPACE \$TEXT\$\n\t.SUBSPA \$CODE\$\n\t\.align 4\n";
+
+    #--------------------------------------------------------#
+    } elsif ( $TargetPlatform =~ /^i386-.*-(linuxaout|freebsd)/ ) {
 
     $T_STABBY      = 1; # 1 iff .stab things (usually if a.out format)
     $T_US          = '_'; # _ if symbols have an underscore on the front
@@ -30,26 +112,28 @@ sub init_TARGET_STUFF {
     $T_PRE_APP     = '^#'; # regexp that says what comes before APP/NO_APP
     $T_CONST_LBL    = '^LC(\d+):$';
     $T_POST_LBL            = ':';
-    $T_PRE_LLBL_PAT = 'L';
-    $T_PRE_LLBL            = 'L';
+    $T_X86_PRE_LLBL_PAT = 'L';
+    $T_X86_PRE_LLBL        = 'L';
     $T_X86_BADJMP   = '^\tjmp [^L\*]';
 
-    $T_MOVE_DIRVS   = '^\s*(\.align\s+\d+(,0x90)?\n|\.globl\s+\S+\n|\.text\n|\.data\n|\.stab[^n].*\n)';
+    $T_MOVE_DIRVS   = '^(\s*(\.align\s+\d+(,0x90)?|\.globl\s+\S+|\.text|\.data|\.stab[^n].*|\.type\s+.*|\.size\s+.*)\n)';
     $T_COPY_DIRVS   = '\.(globl|stab)';
     $T_hsc_cc_PAT   = '\.ascii.*\)(hsc|cc) (.*)\\\\11"\n\t\.ascii\s+"(.*)\\\\0"';
     $T_DOT_WORD            = '\.long';
-    $T_HDR_string   = "\.text\n\t\.align 4\n"; # .align 4 is 486-cache friendly
-    $T_HDR_misc            = "\.text\n\t\.align 4\n";
+    $T_DOT_GLOBAL   = '\.globl';
+    $T_HDR_literal  = "\.text\n\t\.align 2\n"; # .align 4 is 486-cache friendly
+    $T_HDR_misc            = "\.text\n\t\.align 2,0x90\n";
     $T_HDR_data            = "\.data\n\t\.align 2\n"; # ToDo: change align??
     $T_HDR_consist  = "\.text\n";
     $T_HDR_closure  = "\.data\n\t\.align 2\n"; # ToDo: change align?
-    $T_HDR_info            = "\.text\n\t\.align 4\n"; # NB: requires padding
+    $T_HDR_info            = "\.text\n\t\.align 2\n"; # NB: requires padding
     $T_HDR_entry    = "\.text\n"; # no .align so we're right next to _info (arguably wrong...?)
-    $T_HDR_fast            = "\.text\n\t\.align 4\n";
-    $T_HDR_vector   = "\.text\n\t\.align 4\n"; # NB: requires padding
-    $T_HDR_direct   = "\.text\n\t\.align 4\n";
+    $T_HDR_fast            = "\.text\n\t\.align 2,0x90\n";
+    $T_HDR_vector   = "\.text\n\t\.align 2\n"; # NB: requires padding
+    $T_HDR_direct   = "\.text\n\t\.align 2,0x90\n";
 
-    } elsif ( $TargetPlatform =~ /^i386-.*-solaris2/ ) {
+    #--------------------------------------------------------#
+    } elsif ( $TargetPlatform =~ /^i386-.*-(solaris2|linux)$/ ) {
 
     $T_STABBY      = 0; # 1 iff .stab things (usually if a.out format)
     $T_US          = ''; # _ if symbols have an underscore on the front
@@ -57,16 +141,17 @@ sub init_TARGET_STUFF {
     $T_PRE_APP     = '/'; # regexp that says what comes before APP/NO_APP
     $T_CONST_LBL    = '^\.LC(\d+):$'; # regexp for what such a lbl looks like
     $T_POST_LBL            = ':';
-    $T_PRE_LLBL_PAT = '\.L';
-    $T_PRE_LLBL            = '.L';
+    $T_X86_PRE_LLBL_PAT = '\.L';
+    $T_X86_PRE_LLBL        = '.L';
     $T_X86_BADJMP   = '^\tjmp [^\.\*]';
 
-    $T_MOVE_DIRVS   = '^\s*(\.align\s+\d+(,0x90)?\n|\.globl\s+\S+\n|\.text\n|\.data\n|\.section\s+.*\n|\.type\s+.*\n|\.Lfe.*\n\t\.size\s+.*\n|\.size\s+.*\n|\.ident.*\n)';
+    $T_MOVE_DIRVS   = '^(\s*(\.align\s+\d+(,0x90)?|\.globl\s+\S+|\.text|\.data|\.section\s+.*|\.type\s+.*|\.Lfe.*\n\t\.size\s+.*|\.size\s+.*|\.ident.*)\n)';
     $T_COPY_DIRVS   = '\.(globl)';
 
     $T_hsc_cc_PAT   = '\.string.*\)(hsc|cc) (.*)\\\\t(.*)"';
     $T_DOT_WORD            = '\.long';
-    $T_HDR_string   = "\.section\t\.rodata\n"; # or just use .text??? (WDP 95/11)
+    $T_DOT_GLOBAL   = '\.globl';
+    $T_HDR_literal  = "\.section\t\.rodata\n"; # or just use .text??? (WDP 95/11)
     $T_HDR_misc            = "\.text\n\t\.align 16\n";
     $T_HDR_data            = "\.data\n\t\.align 4\n"; # ToDo: change align??
     $T_HDR_consist  = "\.text\n";
@@ -77,6 +162,61 @@ sub init_TARGET_STUFF {
     $T_HDR_vector   = "\.text\n\t\.align 16\n"; # NB: requires padding
     $T_HDR_direct   = "\.text\n\t\.align 16\n";
 
+    #--------------------------------------------------------#
+    } elsif ( $TargetPlatform =~ /^m68k-.*-sunos4/ ) {
+
+    $T_STABBY      = 1; # 1 iff .stab things (usually if a.out format)
+    $T_US          = '_'; # _ if symbols have an underscore on the front
+    $T_DO_GC       = '_PerformGC_wrapper';
+    $T_PRE_APP     = '^# MAY NOT APPLY'; # regexp that says what comes before APP/NO_APP
+    $T_CONST_LBL    = '^LC(\d+):$';
+    $T_POST_LBL            = ':';
+
+    $T_MOVE_DIRVS   = '(\s*(\.align\s+\d+|\.proc\s+\d+|\.const|\.cstring|\.globl\s+\S+|\.text|\.data|\.even|\.stab[^n].*)\n)';
+    $T_COPY_DIRVS   = '\.(globl|proc|stab)';
+    $T_hsc_cc_PAT   = '\.ascii.*\)(hsc|cc) (.*)\\\\11"\n\t\.ascii\s+"(.*)\\\\0"';
+
+    $T_DOT_WORD            = '\.long';
+    $T_DOT_GLOBAL   = '\.globl';
+    $T_HDR_literal  = "\.text\n\t\.even\n";
+    $T_HDR_misc            = "\.text\n\t\.even\n";
+    $T_HDR_data            = "\.data\n\t\.even\n";
+    $T_HDR_consist  = "\.text\n";
+    $T_HDR_closure  = "\.data\n\t\.even\n";
+    $T_HDR_info            = "\.text\n\t\.even\n";
+    $T_HDR_entry    = "\.text\n\t\.even\n";
+    $T_HDR_fast            = "\.text\n\t\.even\n";
+    $T_HDR_vector   = "\.text\n\t\.even\n";
+    $T_HDR_direct   = "\.text\n\t\.even\n";
+
+    #--------------------------------------------------------#
+    } elsif ( $TargetPlatform =~ /^mips-.*/ ) {
+
+    $T_STABBY      = 0; # 1 iff .stab things (usually if a.out format)
+    $T_US          = ''; # _ if symbols have an underscore on the front
+    $T_DO_GC       = 'PerformGC_wrapper';
+    $T_PRE_APP     = '^\s*#'; # regexp that says what comes before APP/NO_APP
+    $T_CONST_LBL    = '^\$LC(\d+):$'; # regexp for what such a lbl looks like
+    $T_POST_LBL            = ':';
+
+    $T_MOVE_DIRVS   = '(\s*(\.align\s+\d+|\.(globl|ent)\s+\S+|\.text|\.r?data)\n)';
+    $T_COPY_DIRVS   = '\.(globl|ent)';
+
+    $T_hsc_cc_PAT   = 'I WAS TOO LAZY TO DO THIS BIT (WDP 95/05)';
+    $T_DOT_WORD            = '\.word';
+    $T_DOT_GLOBAL   = '\t\.globl';
+    $T_HDR_literal  = "\t\.rdata\n\t\.align 2\n";
+    $T_HDR_misc            = "\t\.text\n\t\.align 2\n";
+    $T_HDR_data            = "\t\.data\n\t\.align 2\n";
+    $T_HDR_consist  = 'TOO LAZY TO DO THIS TOO';
+    $T_HDR_closure  = "\t\.data\n\t\.align 2\n";
+    $T_HDR_info            = "\t\.text\n\t\.align 2\n";
+    $T_HDR_entry    = "\t\.text\n\t\.align 2\n";
+    $T_HDR_fast            = "\t\.text\n\t\.align 2\n";
+    $T_HDR_vector   = "\t\.text\n\t\.align 2\n";
+    $T_HDR_direct   = "\t\.text\n\t\.align 2\n";
+
+    #--------------------------------------------------------#
     } elsif ( $TargetPlatform =~ /^powerpc-.*/ ) {
 
     $T_STABBY      = 0; # 1 iff .stab things (usually if a.out format)
@@ -85,16 +225,14 @@ sub init_TARGET_STUFF {
     $T_PRE_APP     = 'NOT APPLICABLE'; # regexp that says what comes before APP/NO_APP
     $T_CONST_LBL    = '^LC\.\.(\d+):$'; # regexp for what such a lbl looks like
     $T_POST_LBL            = ':';
-    $T_PRE_LLBL_PAT = '\.L';
-    $T_PRE_LLBL            = '.L';
-    $T_X86_BADJMP   = 'NOT APPLICABLE';
 
-    $T_MOVE_DIRVS   = '^\s*(\.align\s+\d+(,0x90)?\n|\.globl\s+\S+\n|\.text\n|\.data\n|\.section\s+.*\n|\.type\s+.*\n|\.Lfe.*\n\t\.size\s+.*\n|\.size\s+.*\n|\.ident.*\n)';
+    $T_MOVE_DIRVS   = '^(\s*(\.align\s+\d+(,0x90)?|\.globl\s+\S+|\.text|\.data|\.section\s+.*|\.type\s+.*|\.Lfe.*\n\t\.size\s+.*|\.size\s+.*|\.ident.*)\n)';
     $T_COPY_DIRVS   = '\.(globl)';
 
     $T_hsc_cc_PAT   = '\.string.*\)(hsc|cc) (.*)\\\\t(.*)"';
     $T_DOT_WORD            = '\.long';
-    $T_HDR_string   = "\.section\t\.rodata\n"; # or just use .text??? (WDP 95/11)
+    $T_DOT_GLOBAL   = '\.globl';
+    $T_HDR_literal  = "\.section\t\.rodata\n"; # or just use .text??? (WDP 95/11)
     $T_HDR_misc            = "\.text\n\t\.align 16\n";
     $T_HDR_data            = "\.data\n\t\.align 4\n"; # ToDo: change align??
     $T_HDR_consist  = "\.text\n";
@@ -104,6 +242,65 @@ sub init_TARGET_STUFF {
     $T_HDR_fast            = "\.text\n\t\.align 16\n";
     $T_HDR_vector   = "\.text\n\t\.align 16\n"; # NB: requires padding
     $T_HDR_direct   = "\.text\n\t\.align 16\n";
+
+    #--------------------------------------------------------#
+    } elsif ( $TargetPlatform =~ /^sparc-.*-solaris2/ ) {
+
+    $T_STABBY      = 0; # 1 iff .stab things (usually if a.out format)
+    $T_US          = ''; # _ if symbols have an underscore on the front
+    $T_DO_GC       = 'PerformGC_wrapper';
+    $T_PRE_APP     = 'DOES NOT SEEM TO APPLY'; # regexp that says what comes before APP/NO_APP
+    $T_CONST_LBL    = '^\.LLC(\d+):$'; # regexp for what such a lbl looks like
+    $T_POST_LBL            = ':';
+
+    $T_MOVE_DIRVS   = '^((\s+\.align\s+\d+|\s+\.proc\s+\d+|\s+\.global\s+\S+|\.text|\.data|\.stab.*|\.section.*|\s+\.type.*|\s+\.size.*)\n)';
+    $T_COPY_DIRVS   = '\.(global|proc|stab)';
+
+    $T_hsc_cc_PAT   = '\.asciz.*\)(hsc|cc) (.*)\\\\t(.*)"';
+    $T_DOT_WORD            = '\.word';
+    $T_DOT_GLOBAL   = '\.global';
+    $T_HDR_literal  = "\.text\n\t\.align 8\n";
+    $T_HDR_misc            = "\.text\n\t\.align 4\n";
+    $T_HDR_data            = "\.data\n\t\.align 8\n";
+    $T_HDR_consist  = "\.text\n";
+    $T_HDR_closure  = "\.data\n\t\.align 4\n";
+    $T_HDR_info            = "\.text\n\t\.align 4\n";
+    $T_HDR_entry    = "\.text\n\t\.align 4\n";
+    $T_HDR_fast            = "\.text\n\t\.align 4\n";
+    $T_HDR_vector   = "\.text\n\t\.align 4\n";
+    $T_HDR_direct   = "\.text\n\t\.align 4\n";
+
+    #--------------------------------------------------------#
+    } elsif ( $TargetPlatform =~ /^sparc-.*-sunos4/ ) {
+
+    $T_STABBY      = 1; # 1 iff .stab things (usually if a.out format)
+    $T_US          = '_'; # _ if symbols have an underscore on the front
+    $T_DO_GC       = '_PerformGC_wrapper';
+    $T_PRE_APP     = '^# DOES NOT SEEM TO APPLY'; # regexp that says what comes before APP/NO_APP
+    $T_CONST_LBL    = '^LC(\d+):$';
+    $T_POST_LBL            = ':';
+
+    $T_MOVE_DIRVS   = '^((\s+\.align\s+\d+|\s+\.proc\s+\d+|\s+\.global\s+\S+|\.text|\.data|\.stab.*)\n)';
+    $T_COPY_DIRVS   = '\.(global|proc|stab)';
+    $T_hsc_cc_PAT   = '\.ascii.*\)(hsc|cc) (.*)\\\\11"\n\t\.ascii\s+"(.*)\\\\0"';
+
+    $T_DOT_WORD            = '\.word';
+    $T_DOT_GLOBAL   = '^\t\.global';
+    $T_HDR_literal  = "\.text\n\t\.align 8\n";
+    $T_HDR_misc            = "\.text\n\t\.align 4\n";
+    $T_HDR_data            = "\.data\n\t\.align 8\n";
+    $T_HDR_consist  = "\.text\n";
+    $T_HDR_closure  = "\.data\n\t\.align 4\n";
+    $T_HDR_info            = "\.text\n\t\.align 4\n";
+    $T_HDR_entry    = "\.text\n\t\.align 4\n";
+    $T_HDR_fast            = "\.text\n\t\.align 4\n";
+    $T_HDR_vector   = "\.text\n\t\.align 4\n";
+    $T_HDR_direct   = "\.text\n\t\.align 4\n";
+
+    #--------------------------------------------------------#
+    } else {
+       print STDERR "$Pgm: don't know how to mangle assembly language for: $TargetPlatform\n";
+       exit 1;
     }
 
 if ( 0 ) {
@@ -113,15 +310,16 @@ print STDERR "T_DO_GC: $T_DO_GC\n";
 print STDERR "T_PRE_APP: $T_PRE_APP\n";
 print STDERR "T_CONST_LBL: $T_CONST_LBL\n";
 print STDERR "T_POST_LBL: $T_POST_LBL\n";
-print STDERR "T_PRE_LLBL_PAT: $T_PRE_LLBL_PAT\n";
-print STDERR "T_PRE_LLBL: $T_PRE_LLBL\n";
-print STDERR "T_X86_BADJMP: $T_X86_BADJMP\n";
-
+if ( $TargetPlatform =~ /^i386-/ ) {
+    print STDERR "T_X86_PRE_LLBL_PAT: $T_X86_PRE_LLBL_PAT\n";
+    print STDERR "T_X86_PRE_LLBL: $T_X86_PRE_LLBL\n";
+    print STDERR "T_X86_BADJMP: $T_X86_BADJMP\n";
+}
 print STDERR "T_MOVE_DIRVS: $T_MOVE_DIRVS\n";
 print STDERR "T_COPY_DIRVS: $T_COPY_DIRVS\n";
 print STDERR "T_hsc_cc_PAT: $T_hsc_cc_PAT\n";
 print STDERR "T_DOT_WORD: $T_DOT_WORD\n";
-print STDERR "T_HDR_string: $T_HDR_string\n";
+print STDERR "T_HDR_literal: $T_HDR_literal\n";
 print STDERR "T_HDR_misc: $T_HDR_misc\n";
 print STDERR "T_HDR_data: $T_HDR_data\n";
 print STDERR "T_HDR_consist: $T_HDR_consist\n";
@@ -170,34 +368,52 @@ sub mangle_asm {
     %infochk = ();     # given a symbol base, say what chunk its info tbl is in
     %vectorchk = ();    # ditto, return vector table
     %directchk = ();    # ditto, direct return code
+    $EXTERN_DECLS = '';        # .globl <foo> .text (MIPS only)
 
-    $i = 0;
-    $chkcat[0] = 'misc';
+    $i = 0; $chkcat[0] = 'misc'; $chk[0] = '';
 
     while (<INASM>) {
        next if $T_STABBY && /^\.stab.*${T_US}__stg_split_marker/o;
        next if $T_STABBY && /^\.stab.*ghc.*c_ID/;
        next if /${T_PRE_APP}(NO_)?APP/o;
 
-       if ( /^\s+/ ) { # most common case first -- a simple line!
+       next if /^;/ && $TargetPlatform =~ /^hppa/;
+
+       next if /(^$|^\t\.file\t|^ # )/ && $TargetPlatform =~ /^mips-/;
+
+       if ( $TargetPlatform =~ /^mips-/ 
+         && /^\t\.(globl \S+ \.text|comm\t)/ ) {
+           $EXTERN_DECLS .= $_ unless /(__DISCARD__|\b(PK_|ASSIGN_)(FLT|DBL)\b)/;
+  
+       } elsif ( /^\s+/ ) { # most common case first -- a simple line!
            # duplicated from the bottom
 
            $chk[$i] .= $_;
 
+       } elsif ( /\.\.ng:$/ && $TargetPlatform =~ /^alpha-/ ) {
+           # Alphas: Local labels not to be confused with new chunks
+           $chk[$i] .= $_;
+  
+       # NB: all the rest start with a non-space
+
+       } elsif ( $TargetPlatform =~ /^mips-/
+              && /^\d+:/ ) { # a funny-looking very-local label
+           $chk[$i] .= $_;
+
        } elsif ( /$T_CONST_LBL/o ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'string';
+           $chk[++$i]   = $_;
+           $chkcat[$i]  = 'literal';
            $chksymb[$i] = $1;
 
        } elsif ( /^${T_US}__stg_split_marker(\d+)${T_POST_LBL}$/o ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'splitmarker';
+           $chk[++$i]   = $_;
+           $chkcat[$i]  = 'splitmarker';
            $chksymb[$i] = $1;
 
        } elsif ( /^${T_US}([A-Za-z0-9_]+)_info${T_POST_LBL}$/o ) {
            $symb = $1;
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'infotbl';
+           $chk[++$i]   = $_;
+           $chkcat[$i]  = 'infotbl';
            $chksymb[$i] = $symb;
 
            die "Info table already? $symb; $i\n" if defined($infochk{$symb});
@@ -205,31 +421,31 @@ sub mangle_asm {
            $infochk{$symb} = $i;
 
        } elsif ( /^${T_US}([A-Za-z0-9_]+)_entry${T_POST_LBL}$/o ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'slow';
+           $chk[++$i]   = $_;
+           $chkcat[$i]  = 'slow';
            $chksymb[$i] = $1;
 
            $slowchk{$1} = $i;
 
        } elsif ( /^${T_US}([A-Za-z0-9_]+)_fast\d+${T_POST_LBL}$/o ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'fast';
+           $chk[++$i]   = $_;
+           $chkcat[$i]  = 'fast';
            $chksymb[$i] = $1;
 
            $fastchk{$1} = $i;
 
        } elsif ( /^${T_US}([A-Za-z0-9_]+)_closure${T_POST_LBL}$/o ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'closure';
+           $chk[++$i]   = $_;
+           $chkcat[$i]  = 'closure';
            $chksymb[$i] = $1;
 
            $closurechk{$1} = $i;
 
        } elsif ( /^${T_US}ghc.*c_ID${T_POST_LBL}/o ) {
-           $chk[++$i] .= $_;
+           $chk[++$i]  = $_;
            $chkcat[$i] = 'consist';
 
-       } elsif ( /^(___gnu_compiled_c|gcc2_compiled\.)${T_POST_LBL}/o ) {
+       } elsif ( /^(${T_US}__gnu_compiled_c|gcc2_compiled\.)${T_POST_LBL}/o ) {
            ; # toss it
 
        } elsif ( /^${T_US}ErrorIO_call_count${T_POST_LBL}$/o   # HACK!!!!
@@ -239,32 +455,37 @@ sub mangle_asm {
               || /^${T_US}.*_done${T_POST_LBL}$/o              # PROF: _module_done
               || /^${T_US}_module_registered${T_POST_LBL}$/o   # PROF: _module_registered
               ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'data';
+           $chk[++$i]   = $_;
+           $chkcat[$i]  = 'data';
            $chksymb[$i] = '';
 
+       } elsif ( /^([A-Za-z0-9_]+)\s+\.comm/ && $TargetPlatform =~ /^hppa/ ) {
+           $chk[++$i]   = $_;
+           $chkcat[$i]  = 'bss';
+           $chksymb[$i] = $1;
+
        } elsif ( /^${T_US}(ret_|djn_)/o ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'misc';
+           $chk[++$i]   = $_;
+           $chkcat[$i]  = 'misc';
            $chksymb[$i] = '';
 
        } elsif ( /^${T_US}vtbl_([A-Za-z0-9_]+)${T_POST_LBL}$/o ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'vector';
+           $chk[++$i]   = $_;
+           $chkcat[$i]  = 'vector';
            $chksymb[$i] = $1;
 
            $vectorchk{$1} = $i;
 
        } elsif ( /^${T_US}([A-Za-z0-9_]+)DirectReturn${T_POST_LBL}$/o ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'direct';
+           $chk[++$i]   = $_;
+           $chkcat[$i]  = 'direct';
            $chksymb[$i] = $1;
 
            $directchk{$1} = $i;
 
        } elsif ( /^${T_US}[A-Za-z0-9_]+_upd${T_POST_LBL}$/o ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'misc';
+           $chk[++$i]   = $_;
+           $chkcat[$i]  = 'misc';
            $chksymb[$i] = '';
 
        } elsif ( $TargetPlatform =~ /^i386-.*-solaris2/
@@ -278,20 +499,22 @@ sub mangle_asm {
            # Haskell, make a call to your own C wrapper, then
            # put that C wrapper (which calls one of these) in a
            # plain .c file.  WDP 95/12
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'toss';
+           $chk[++$i]   = $_;
+           $chkcat[$i]  = 'toss';
            $chksymb[$i] = $1;
 
-       } elsif ( /^${T_US}[A-Za-z0-9_]/o ) {
+       } elsif ( /^${T_US}[A-Za-z0-9_]/o
+               && ( $TargetPlatform !~ /^hppa/ # need to avoid local labels in this case
+                  || /^L\$\d+$/ ) ) {
            local($thing);
            chop($thing = $_);
            print STDERR "Funny global thing?: $_"
                unless $KNOWN_FUNNY_THING{$thing}
                    || /^${T_US}_(PRIn|PRStart).*${T_POST_LBL}$/o # pointer reversal GC routines
-                   || /^${T_US}CC_.*${T_POST_LBL}$/            # PROF: _CC_ccident
-                   || /^${T_US}_reg.*${T_POST_LBL}$/         # PROF: __reg<module>
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'misc';
+                   || /^${T_US}CC_.*${T_POST_LBL}$/o           # PROF: _CC_ccident
+                   || /^${T_US}_reg.*${T_POST_LBL}$/o;         # PROF: __reg<module>
+           $chk[++$i]   = $_;
+           $chkcat[$i]  = 'misc';
            $chksymb[$i] = '';
 
        } else { # simple line (duplicated at the top)
@@ -309,19 +532,58 @@ sub mangle_asm {
     # about the whole module before we start spitting
     # output.
 
-    for ($i = 0; $i < $numchks; $i++) {
+    local($FIRST_MANGLABLE) = ($TargetPlatform =~ /^(alpha-|hppa|mips-)/) ? 1 : 0;
+
+#   print STDERR "first chunk to mangle: $FIRST_MANGLABLE\n";
+
+    # Alphas: NB: we start meddling at chunk 1, not chunk 0
+    # The first ".rdata" is quite magical; as of GCC 2.7.x, it
+    # spits a ".quad 0" in after the v first ".rdata"; we
+    # detect this special case (tossing the ".quad 0")!
+    local($magic_rdata_seen) = 0;
+  
+    # HPPAs, MIPSen: also start medding at chunk 1
+
+    for ($i = $FIRST_MANGLABLE; $i < $numchks; $i++) {
        $c = $chk[$i]; # convenience copy
 
 #      print STDERR "\nCHK $i (BEFORE) (",$chkcat[$i],"):\n", $c;
 
-       # toss all prologue stuff;
+       # toss all prologue stuff; HPPA is pretty weird
+       # (see elsewhere)
+       $c = &mash_hppa_prologue($c) if $TargetPlatform =~ /^hppa/;
+
        # be slightly paranoid to make sure there's
        # nothing surprising in there
        if ( $c =~ /--- BEGIN ---/ ) {
            if (($p, $r) = split(/--- BEGIN ---/, $c)) {
-               $p =~ s/^\tpushl \%edi\n//;
-               $p =~ s/^\tpushl \%esi\n//;
-               $p =~ s/^\tsubl \$\d+,\%esp\n//;
+
+               if ($TargetPlatform =~ /^i386-/) {
+                   $p =~ s/^\tpushl \%edi\n//;
+                   $p =~ s/^\tpushl \%esi\n//;
+                   $p =~ s/^\tsubl \$\d+,\%esp\n//;
+               } elsif ($TargetPlatform =~ /^m68k-/) {
+                   $p =~ s/^\tlink a6,#-?\d.*\n//;
+                   $p =~ s/^\tmovel d2,sp\@-\n//;
+                   $p =~ s/^\tmovel d5,sp\@-\n//; # SMmark.* only?
+                   $p =~ s/^\tmoveml \#0x[0-9a-f]+,sp\@-\n//; # SMmark.* only?
+               } elsif ($TargetPlatform =~ /^mips-/) {
+                   # the .frame/.mask/.fmask that we use is the same
+                   # as that produced by GCC for miniInterpret; this
+                   # gives GDB some chance of figuring out what happened
+                   $FRAME = "\t.frame\t\$sp,2168,\$31\n\t.mask\t0x90000000,-4\n\t.fmask\t0x00000000,0\n";
+                   $p =~ s/^\t\.(frame).*\n/__FRAME__/g;
+                   $p =~ s/^\t\.(mask|fmask).*\n//g;
+                   $p =~ s/^\t\.cprestore.*\n/\t\.cprestore 416\n/; # 16 + 100 4-byte args
+                   $p =~ s/^\tsubu\t\$sp,\$sp,\d+\n//;
+                   $p =~ s/^\tsw\t\$31,\d+\(\$sp\)\n//;
+                   $p =~ s/^\tsw\t\$fp,\d+\(\$sp\)\n//;
+                   $p =~ s/^\tsw\t\$28,\d+\(\$sp\)\n//;
+                   $p =~ s/__FRAME__/$FRAME/;
+               } else {
+                   print STDERR "$Pgm: unknown prologue mangling? $TargetPlatform\n";
+               }
+
                die "Prologue junk?: $p\n" if $p =~ /^\t[^\.]/;
 
                # glue together what's left
@@ -332,29 +594,71 @@ sub mangle_asm {
        # toss all epilogue stuff; again, paranoidly
        if ( $c =~ /--- END ---/ ) {
            if (($r, $e) = split(/--- END ---/, $c)) {
-               $e =~ s/^\tret\n//;
-               $e =~ s/^\tpopl \%edi\n//;
-               $e =~ s/^\tpopl \%esi\n//;
-               $e =~ s/^\taddl \$\d+,\%esp\n//;
+               if ($TargetPlatform =~ /^i386-/) {
+                   $e =~ s/^\tret\n//;
+                   $e =~ s/^\tpopl \%edi\n//;
+                   $e =~ s/^\tpopl \%esi\n//;
+                   $e =~ s/^\taddl \$\d+,\%esp\n//;
+               } elsif ($TargetPlatform =~ /^m68k-/) {
+                   $e =~ s/^\tunlk a6\n//;
+                   $e =~ s/^\trts\n//;
+               } elsif ($TargetPlatform =~ /^mips-/) {
+                   $e =~ s/^\tlw\t\$31,\d+\(\$sp\)\n//;
+                   $e =~ s/^\tlw\t\$fp,\d+\(\$sp\)\n//;
+                   $e =~ s/^\taddu\t\$sp,\$sp,\d+\n//;
+                   $e =~ s/^\tj\t\$31\n//;
+               } else {
+                   print STDERR "$Pgm: unknown epilogue mangling? $TargetPlatform\n";
+               }
                die "Epilogue junk?: $e\n" if $e =~ /^\t[^\.]/;
 
                # glue together what's left
                $c = $r . $e;
+               $c =~ s/\n\t\n/\n/; # junk blank line
            }
        }
 
+       # On SPARCs, we don't do --- BEGIN/END ---, we just
+       # toss the register-windowing save/restore/ret* instructions
+       # directly:
+       if ( $TargetPlatform =~ /^sparc-/ ) {
+           $c =~ s/^\t(save .*|restore|ret|retl)\n//g;
+           # throw away PROLOGUE comments
+           $c =~ s/^\t!#PROLOGUE# 0\n\t!#PROLOGUE# 1\n//;
+       }
+
+       # On Alphas, the prologue mangling is done a little later (below)
+
        # toss all calls to __DISCARD__
-       $c =~ s/^\tcall ${T_US}__DISCARD__\n//go;
+       $c =~ s/^\t(call|jbsr|jal) ${T_US}__DISCARD__\n//go;
+
+       # MIPS: that may leave some gratuitous asm macros around
+       # (no harm done; but we get rid of them to be tidier)
+       $c =~ s/^\t\.set\tnoreorder\n\t\.set\tnomacro\n\taddu\t(\S+)\n\t\.set\tmacro\n\t\.set\treorder\n/\taddu\t$1\n/
+           if $TargetPlatform =~ /^mips-/;
+
+       # toss stack adjustment after DoSparks
+       $c =~ s/^(\tjbsr _DoSparks\n)\taddqw #8,sp/$1/g
+               if $TargetPlatform =~ /^m68k-/; # this looks old...
+
+       if ( $TargetPlatform =~ /^alpha-/ &&
+          ! $magic_rdata_seen &&
+          $c =~ /^\s*\.rdata\n\t\.quad 0\n\t\.align \d\n/ ) {
+           $c =~ s/^\s*\.rdata\n\t\.quad 0\n\t\.align (\d)\n/\.rdata\n\t\.align $1\n/;
+           $magic_rdata_seen = 1;
+       }
+
+       # pick some end-things and move them to the next chunk
 
        # pin a funny end-thing on (for easier matching):
        $c .= 'FUNNY#END#THING';
 
-       # pick some end-things and move them to the next chunk
-
        while ( $c =~ /${T_MOVE_DIRVS}FUNNY#END#THING/o ) {
            $to_move = $1;
 
-           if ( $to_move =~ /${T_COPY_DIRVS}/ && $i < ($numchks - 1) ) {
+           if ( $i < ($numchks - 1)
+             && ( $to_move =~ /${T_COPY_DIRVS}/
+               || ($TargetPlatform =~ /^hppa/ && $to_move =~ /align/ && $chkcat[$i+1] eq 'literal') )) {
                $chk[$i + 1] = $to_move . $chk[$i + 1];
                # otherwise they're tossed
            }
@@ -362,6 +666,19 @@ sub mangle_asm {
            $c =~ s/${T_MOVE_DIRVS}FUNNY#END#THING/FUNNY#END#THING/o;
        }
 
+       if ( $TargetPlatform =~ /^alpha-/ && $c =~ /^\t\.ent\s+(\S+)/ ) {
+           $ent = $1;
+           # toss all prologue stuff, except for loading gp, and the ..ng address
+           if (($p, $r) = split(/^\t\.prologue/, $c)) {
+               if (($keep, $junk) = split(/\.\.ng:/, $p)) {
+                   $c = $keep . "..ng:\n";
+               } else {
+                   print STDERR "malformed code block ($ent)?\n"
+               }
+           }
+           $c .= "\t.frame \$30,0,\$26,0\n\t.prologue" . $r;
+       }
+  
        $c =~ s/FUNNY#END#THING//;
 
 #      print STDERR "\nCHK $i (AFTER) (",$chkcat[$i],"):\n", $c;
@@ -369,30 +686,78 @@ sub mangle_asm {
        $chk[$i] = $c; # update w/ convenience copy
     }
 
-    # print out all the literal strings first
+    if ( $TargetPlatform =~ /^alpha-/ ) {
+       # print out the header stuff first
+       $chk[0] =~ s/^(\t\.file.*)"(ghc\d+\.c)"/$1"$ifile_root.hc"/;
+       print OUTASM $chk[0];
+
+    } elsif ( $TargetPlatform =~ /^hppa/ ) {
+       print OUTASM $chk[0];
+
+    } elsif ( $TargetPlatform =~ /^mips-/ ) {
+       $chk[0] = "\t\.file\t1 \"$ifile_root.hc\"\n" . $chk[0];
+
+       # get rid of horrible "<dollar>Revision: .*$" strings
+       local(@lines0) = split(/\n/, $chk[0]);
+       local($z) = 0;
+       while ( $z <= $#lines0 ) {
+           if ( $lines0[$z] =~ /^\t\.byte\t0x24,0x52,0x65,0x76,0x69,0x73,0x69,0x6f$/ ) {
+               undef($lines0[$z]);
+               $z++;
+               while ( $z <= $#lines0 ) {
+                   undef($lines0[$z]);
+                   last if $lines0[$z] =~ /[,\t]0x0$/;
+                   $z++;
+               }
+           }
+           $z++;
+       }
+       $chk[0] = join("\n", @lines0);
+       $chk[0] =~ s/\n\n+/\n/;
+       print OUTASM $chk[0];
+    }
+
+    # print out all the literal strings next
     for ($i = 0; $i < $numchks; $i++) {
-       if ( $chkcat[$i] eq 'string' ) {
-           print OUTASM $T_HDR_string, $chk[$i];
-           
+       if ( $chkcat[$i] eq 'literal' ) {
+           print OUTASM $T_HDR_literal, $chk[$i];
+           print OUTASM "; end literal\n" if $TargetPlatform =~ /^hppa/; # for the splitter
+
            $chkcat[$i] = 'DONE ALREADY';
        }
     }
 
-    for ($i = 0; $i < $numchks; $i++) {
+    # on the HPPA, print out all the bss next
+    if ( $TargetPlatform =~ /^hppa/ ) {
+       for ($i = 1; $i < $numchks; $i++) {
+           if ( $chkcat[$i] eq 'bss' ) {
+               print OUTASM "\t.SPACE \$PRIVATE\$\n\t.SUBSPA \$BSS\$\n\t.align 4\n";
+               print OUTASM $chk[$i];
+
+               $chkcat[$i] = 'DONE ALREADY';
+           }
+       }
+    }
+
+    for ($i = $FIRST_MANGLABLE; $i < $numchks; $i++) {
 #      print STDERR "$i: cat $chkcat[$i], symb $chksymb[$i]\n";
 
        next if $chkcat[$i] eq 'DONE ALREADY';
 
        if ( $chkcat[$i] eq 'misc' ) {
-           print OUTASM $T_HDR_misc;
-           &print_doctored($chk[$i], 0);
+           if ($chk[$i] ne '') {
+               print OUTASM $T_HDR_misc;
+               &print_doctored($chk[$i], 0);
+           }
 
        } elsif ( $chkcat[$i] eq 'toss' ) {
            print STDERR "*** NB: TOSSING code for $chksymb[$i] !!! ***\n";
 
        } elsif ( $chkcat[$i] eq 'data' ) {
-           print OUTASM $T_HDR_data;
-           print OUTASM $chk[$i];
+           if ($chk[$i] ne '') {
+               print OUTASM $T_HDR_data;
+               print OUTASM $chk[$i];
+           }
 
        } elsif ( $chkcat[$i] eq 'consist' ) {
            if ( $chk[$i] =~ /$T_hsc_cc_PAT/o ) {
@@ -401,14 +766,17 @@ sub mangle_asm {
                $consist =~ s/\//./g;
                $consist =~ s/-/_/g;
                $consist =~ s/[^A-Za-z0-9_.]/ZZ/g; # ToDo: properly?
-               print OUTASM $T_HDR_consist, "${consist}${T_POST_LBL}\n";
+               print OUTASM $T_HDR_consist, "${consist}${T_POST_LBL}\n"
+                   if $TargetPlatform !~ /^mips-/; # we just don't try in that case
            } else {
                print STDERR "Couldn't grok consistency: ", $chk[$i];
            }
 
        } elsif ( $chkcat[$i] eq 'splitmarker' ) {
            # we can just re-constitute this one...
-           print OUTASM "${T_US}__stg_split_marker",$chksymb[$i],"${T_POST_LBL}\n";
+           # NB: we emit _three_ underscores no matter what,
+           # so ghc-split doesn't have to care.
+           print OUTASM "___stg_split_marker",$chksymb[$i],"${T_POST_LBL}\n";
 
        } elsif ( $chkcat[$i] eq 'closure'
               || $chkcat[$i] eq 'infotbl'
@@ -446,12 +814,33 @@ sub mangle_asm {
                $c = $chk[$slowchk{$symb}];
 
                if ( defined($fastchk{$symb}) ) {
-                   $c =~ s/^\tmovl \$${T_US}${symb}_fast\d+,\%edx\n\tjmp \*\%edx\n//;
-                   $c =~ s/^\tmovl \$${T_US}${symb}_fast\d+,\%eax\n\tjmp \*\%eax\n//;
+                   if ( $TargetPlatform =~ /^alpha-/ ) {
+                       $c =~ s/^\tjmp \$31,\(\$27\),0\n\t\.align 4\n\t\.end/\t.align 4\n\t.end/;
+                   } elsif ( $TargetPlatform =~ /^hppa/ ) {
+                       $c =~ s/^\s+ldil.*\n\s+ldo.*\n\s+bv.*\n(.*\n)?\s+\.EXIT/$1\t.EXIT/;
+                   } elsif ( $TargetPlatform =~ /^i386-/ ) {
+                       $c =~ s/^\tmovl \$${T_US}${symb}_fast\d+,\%edx\n\tjmp \*\%edx\n//;
+                       $c =~ s/^\tmovl \$${T_US}${symb}_fast\d+,\%eax\n\tjmp \*\%eax\n//;
+                   } elsif ( $TargetPlatform =~ /^mips-/ ) {
+                       $c =~ s/^\tjmp \$31,\(\$27\),0\n\t\.align 4\n\t\.end/\t.align 4\n\t.end/;
+                   } elsif ( $TargetPlatform =~ /^m68k-/ ) {
+                       $c =~ s/^\tjmp ${T_US}${symb}_fast\d+.*\n\tnop\n//;
+                       $c =~ s/^\tjmp ${T_US}${symb}_fast\d+.*\n//;
+                   } elsif ( $TargetPlatform =~ /^sparc-/ ) {
+                       $c =~ s/^\tcall ${T_US}${symb}_fast\d+,.*\n\tnop\n//;
+                       $c =~ s/^\tcall ${T_US}${symb}_fast\d+,.*\n(\t[a-z].*\n)/$1/;
+                   } else {
+                       print STDERR "$Pgm: mystery slow-fast dropthrough: $TargetPlatform\n";
+                   }
                }
 
-               print STDERR "still has jump to fast entry point:\n$c"
-                   if $c =~ /${T_US}${symb}_fast/; # NB: paranoia
+               if ( $TargetPlatform !~ /^(alpha-|hppa|mips-)/ ) {
+                   # On alphas, hppa: no very good way to look for "dangling"
+                   # references to fast-entry point.
+                   # (questionable re hppa and mips...)
+                   print STDERR "still has jump to fast entry point:\n$c"
+                       if $c =~ /${T_US}${symb}_fast/; # NB: paranoia
+               }
 
                print OUTASM $T_HDR_entry;
 
@@ -462,7 +851,13 @@ sub mangle_asm {
            
            # FAST ENTRY POINT
            if ( defined($fastchk{$symb}) ) {
-               print OUTASM $T_HDR_fast;
+               if ( ! defined($slowchk{$symb})
+                  # ToDo: the || clause can go once we're no longer
+                  # concerned about producing exactly the same output as before
+                  || $TargetPlatform =~ /^(m68k|sparc|i386)-/
+                  ) {
+                   print OUTASM $T_HDR_fast;
+               }
                &print_doctored($chk[$fastchk{$symb}], 0);
                $chkcat[$fastchk{$symb}] = 'DONE ALREADY';
            }
@@ -484,6 +879,15 @@ sub mangle_asm {
                print OUTASM $T_HDR_direct;
                &print_doctored($chk[$directchk{$symb}], 0);
                $chkcat[$directchk{$symb}] = 'DONE ALREADY';
+
+           } elsif ( $TargetPlatform =~ /^alpha-/ ) {
+               # Alphas: the commented nop is for the splitter, to ensure
+               # that no module ends with a label as the very last
+               # thing.  (The linker will adjust the label to point
+               # to the first code word of the next module linked in,
+               # even if alignment constraints cause the label to move!)
+
+               print OUTASM "\t# nop\n";
            }
            
        } else {
@@ -497,6 +901,31 @@ sub mangle_asm {
 \end{code}
 
 \begin{code}
+sub mash_hppa_prologue { # OK, epilogue, too
+    local($_) = @_;
+
+    # toss all prologue stuff
+    s/^\s+\.ENTRY[^\0]*--- BEGIN ---/\t.ENTRY/;
+
+    # Lie about our .CALLINFO
+    s/^\s+\.CALLINFO.*$/\t.CALLINFO NO_CALLS,NO_UNWIND/;
+
+    # Get rid of P'
+
+    s/LP'/L'/g;
+    s/RP'/R'/g;
+
+    # toss all epilogue stuff
+    s/^\s+--- END ---[^\0]*\.EXIT/\t.EXIT/;
+
+    # Sorry; we moved the _info stuff to the code segment.
+    s/_info,DATA/_info,CODE/g;
+
+    return($_);
+}
+\end{code}
+
+\begin{code}
 sub print_doctored {
     local($_, $need_fallthru_patch) = @_;
 
@@ -631,13 +1060,13 @@ sub print_doctored {
 
     # fix _all_ non-local jumps:
 
-    s/^\tjmp \*${T_PRE_LLBL_PAT}/\tJMP___SL/go;
-    s/^\tjmp ${T_PRE_LLBL_PAT}/\tJMP___L/go;
+    s/^\tjmp \*${T_X86_PRE_LLBL_PAT}/\tJMP___SL/go;
+    s/^\tjmp ${T_X86_PRE_LLBL_PAT}/\tJMP___L/go;
 
     s/^(\tjmp .*\n)/$exit_patch$1/g; # here's the fix...
 
-    s/^\tJMP___SL/\tjmp \*${T_PRE_LLBL}/go;
-    s/^\tJMP___L/\tjmp ${T_PRE_LLBL}/go;
+    s/^\tJMP___SL/\tjmp \*${T_X86_PRE_LLBL}/go;
+    s/^\tJMP___L/\tjmp ${T_X86_PRE_LLBL}/go;
 
     # fix post-PerformGC wrapper (re-)entries ???
 
@@ -656,14 +1085,29 @@ sub print_doctored {
 #=         if /^\t(jmp|call) .*\%ecx/;
     }
 
-    # final peephole fix
+    # final peephole fixes
 
     s/^\tmovl \%eax,36\(\%ebx\)\n\tjmp \*36\(\%ebx\)\n/\tmovl \%eax,36\(\%ebx\)\n\tjmp \*\%eax\n/;
+    s/^\tmovl \$_(.*),(\%e[abcd]x)\n\tjmp \*$2/\tjmp _$1/g;
+
+    # Hacks to eliminate some reloads of Hp.  Worth about 5% code size.
+    # We could do much better than this, but at least it catches about
+    # half of the unnecessary reloads.
+    # Note that these will stop working if either:
+    #  (i) the offset of Hp from BaseReg changes from 80, or
+    #  (ii) the register assignment of BaseReg changes from %ebx
+
+    s/^\tmovl 80\(\%ebx\),\%e.x\n\tmovl \$(.*),(-?[0-9]*)\(\%e.x\)\n\tmovl 80\(\%ebx\),\%e(.)x/\tmovl 80\(\%ebx\),\%e$3x\n\tmovl \$$1,$2\(\%e$3x\)/g;
+
+    s/^\tmovl 80\(\%ebx\),\%e(.)x\n\tmovl (.*),\%e(.)x\n\tmovl \%e$3x,(-?[0-9]*\(\%e$1x\))\n\tmovl 80\(\%ebx\),\%e$1x/\tmovl 80\(\%ebx\),\%e$1x\n\tmovl $2,\%e$3x\n\tmovl \%e$3x,$4/g;
+
+    s/^\tmovl 80\(\%ebx\),\%edx((\n\t(movl|addl) .*,((-?[0-9]*\(.*)|(\%e[abc]x)))+)\n\tmovl 80\(\%ebx\),\%edx/\tmovl 80\(\%ebx\),\%edx$1/g;
+    s/^\tmovl 80\(\%ebx\),\%eax((\n\t(movl|addl) .*,((-?[0-9]*\(.*)|(\%e[bcd]x)))+)\n\tmovl 80\(\%ebx\),\%eax/\tmovl 80\(\%ebx\),\%eax$1/g;
 
     # --------------------------------------------------------
     # that's it -- print it
     #
-    die "Funny jumps?\n$_" if /${T_X86_BADJMP}/o; # paranoia
+    #die "Funny jumps?\n$_" if /${T_X86_BADJMP}/o; # paranoia
 
     print OUTASM $_;
 
@@ -739,37 +1183,64 @@ sub rev_tbl {
 
     local($before) = '';
     local($label) = '';
+    local(@imports) = (); # hppa only
     local(@words) = ();
     local($after) = '';
     local(@lines) = split(/\n/, $tbl);
     local($i, $extra, $words_to_pad, $j);
 
-    for ($i = 0; $i <= $#lines && $lines[$i] !~ /^\t\.long\s+/; $i++) {
+    for ($i = 0; $i <= $#lines && $lines[$i] !~ /^\t${T_DOT_WORD}\s+/o; $i++) {
        $label .= $lines[$i] . "\n",
-           next if $lines[$i] =~ /^[A-Za-z0-9_]+_info:$/
-                || $lines[$i] =~ /^\.globl/
-                || $lines[$i] =~ /^${T_US}vtbl_\S+:$/;
+           next if $lines[$i] =~ /^[A-Za-z0-9_]+_info${T_POST_LBL}$/o
+                || $lines[$i] =~ /^${T_DOT_GLOBAL}/o
+                || $lines[$i] =~ /^${T_US}vtbl_\S+${T_POST_LBL}$/o;
 
        $before .= $lines[$i] . "\n"; # otherwise...
     }
 
-    for ( ; $i <= $#lines && $lines[$i] =~ /^\t\.long\s+/; $i++) {
-       push(@words, $lines[$i]);
+    if ( $TargetPlatform !~ /^hppa/ ) {
+       for ( ; $i <= $#lines && $lines[$i] =~ /^\t${T_DOT_WORD}\s+/o; $i++) {
+           push(@words, $lines[$i]);
+       }
+    } else { # hppa weirdness
+       for ( ; $i <= $#lines && $lines[$i] =~ /^\s+\.(word|IMPORT)/; $i++) {
+           if ($lines[$i] =~ /^\s+\.IMPORT/) {
+               push(@imports, $lines[$i]);
+           } else {
+               # We don't use HP's ``function pointers''
+               # We just use labels in code space, like normal people
+               $lines[$i] =~ s/P%//;
+               push(@words, $lines[$i]);
+           }
+       }
     }
+
     # now throw away the first word (entry code):
     shift(@words) if $discard1;
 
+# Padding removed to reduce code size and improve performance on Pentiums.
+# Simon M. 13/4/96
     # for 486-cache-friendliness, we want our tables aligned
     # on 16-byte boundaries (.align 4).  Let's pad:
-    $extra = ($#words + 1) % 4;
-    $words_to_pad = ($extra == 0) ? 0 : 4 - $extra;
-    for ($j = 0; $j < $words_to_pad; $j++) { push(@words, "\t\.long 0"); }
+#    $extra = ($#words + 1) % 4;
+#    $words_to_pad = ($extra == 0) ? 0 : 4 - $extra;
+#    for ($j = 0; $j < $words_to_pad; $j++) { push(@words, "\t${T_DOT_WORD} 0"); }
 
     for (; $i <= $#lines; $i++) {
        $after .= $lines[$i] . "\n";
     }
 
-    $tbl = $before . join("\n", (reverse @words)) . "\n" . $label . $after;
+    # Alphas:If we have anonymous text (not part of a procedure), the
+    # linker may complain about missing exception information.  Bleh.
+    if ( $TargetPlatform =~ /^alpha-/ && $label =~ /^([A-Za-z0-9_]+):$/) {
+       $before = "\t.ent $1\n" . $before;
+       $after .= "\t.end $1\n";
+    }
+
+    $tbl = $before
+        . (($TargetPlatform !~ /^hppa/) ? '' : join("\n", @imports) . "\n")
+        . join("\n", (reverse @words)) . "\n"
+        . $label . $after;
 
 #   print STDERR "before=$before\n";
 #   print STDERR "label=$label\n";
@@ -781,7 +1252,7 @@ sub rev_tbl {
 \end{code}
 
 \begin{code}
-sub mini_mangle_asm {
+sub mini_mangle_asm_i386 {
     local($in_asmf, $out_asmf) = @_;
 
     &init_TARGET_STUFF();
@@ -804,6 +1275,33 @@ sub mini_mangle_asm {
     close(OUTASM) || &tidy_up_and_die(1,"Failed writing to $out_asmf\n");
     close(INASM)  || &tidy_up_and_die(1,"Failed reading from $in_asmf\n");
 }
+\end{code}
+
+The HP is a major nuisance.  The threaded code mangler moved info
+tables from data space to code space, but unthreaded code in the RTS
+still has references to info tables in data space.  Since the HP
+linker is very precise about where symbols live, we need to patch the
+references in the unthreaded RTS as well.
+
+\begin{code}
+sub mini_mangle_asm_hppa {
+    local($in_asmf, $out_asmf) = @_;
+
+    open(INASM, "< $in_asmf")
+       || &tidy_up_and_die(1,"$Pgm: failed to open `$in_asmf' (to read)\n");
+    open(OUTASM,"> $out_asmf")
+       || &tidy_up_and_die(1,"$Pgm: failed to open `$out_asmf' (to write)\n");
+
+    while (<INASM>) {
+       s/_info,DATA/_info,CODE/;   # Move _info references to code space
+       s/P%_PR/_PR/;
+       print OUTASM;
+    }
+
+    # finished:
+    close(OUTASM) || &tidy_up_and_die(1,"Failed writing to $out_asmf\n");
+    close(INASM)  || &tidy_up_and_die(1,"Failed reading from $in_asmf\n");
+}
 
 # make "require"r happy...
 1;
diff --git a/ghc/driver/ghc-iface.lprl b/ghc/driver/ghc-iface.lprl
new file mode 100644 (file)
index 0000000..5f0fe31
--- /dev/null
@@ -0,0 +1,271 @@
+%************************************************************************
+%*                                                                     *
+\section[Driver-iface-thing]{Interface-file handling}
+%*                                                                     *
+%************************************************************************
+
+\begin{code}
+sub postprocessHiFile {
+    local($hsc_hi,             # The iface info produced by hsc.
+         $hifile_target,       # The name both of the .hi file we
+                               # already have and which we *might*
+                               # replace.
+         $going_interactive) = @_;
+
+    local($new_hi) = "$Tmp_prefix.hi-new";
+
+#   print STDERR `$Cat $hsc_hi`;
+
+    &constructNewHiFile($hsc_hi, $hifile_target, $new_hi);
+
+    # run diff if they asked for it
+    if ($HiDiff_flag && ! $HiOnStdout && ! $going_interactive && -f $hifile_target) {
+       &run_something("$Cmp -s $hifile_target $new_hi || $Diff $hifile_target $new_hi 1>&2 || exit 0",
+           "Diff'ing old and new .$HiSuffix files"); # NB: to stderr
+    }
+
+    # if we produced an interface file "no matter what",
+    # print what we got on stderr (ToDo: honor -ohi flag)
+    if ( $HiOnStdout ) {
+       print STDERR `$Cat $new_hi`;
+    } else {
+       &run_something("$Cmp -s $hifile_target $new_hi || ( $Rm $hifile_target && $Cp $new_hi $hifile_target )",
+          "Replace .$HiSuffix file, if changed");
+    }
+}
+\end{code}
+
+\begin{code}
+sub constructNewHiFile {
+    local($hsc_hi,         # The iface info produced by hsc.
+         $hifile_target,   # Pre-existing .hi filename (if it exists)
+         $new_hi) = @_;    # Filename for new one
+
+    &readHiFile('old',$hifile_target) unless $HiHasBeenRead{'old'} == 1;
+    &readHiFile('new',$hsc_hi)       unless $HiHasBeenRead{'new'} == 1;
+
+    open(NEWHI, "> $new_hi") || &tidy_up_and_die(1,"Can't open $new_hi (write)\n");
+
+    local($new_module_version) = &calcNewModuleVersion();
+    print NEWHI "interface ", $ModuleName{'new'}, " $new_module_version\n";
+
+    print NEWHI "__usages__\n", $Stuff{'new:usages'} unless $Stuff{'new:usages'} eq '';
+
+    local(@version_keys) = sort (keys %Version);
+    local($num_ver_things) = 0;
+    foreach $v (@version_keys) {
+       next unless $v =~ /^new:(.*$)/;
+       last if $num_ver_things >= 1;
+       $num_ver_things++;
+    }
+
+    print NEWHI "__versions__\n" unless $num_ver_things < 1;
+    foreach $v (@version_keys) {
+       next unless $v =~ /^new:(.*$)/;
+       $v = $1;
+
+       &printNewItemVersion($v, $new_module_version), "\n";
+    }
+
+    print NEWHI "__exports__\n";
+    print NEWHI $Stuff{'new:exports'};
+
+    if ( $Stuff{'new:instance_modules'} ) {
+       print NEWHI "__instance_modules__\n";
+       print NEWHI $Stuff{'new:instance_modules'};
+    }
+
+    if ( $Stuff{'new:fixities'} ) {
+       print NEWHI "__fixities__\n";
+       print NEWHI $Stuff{'new:fixities'};
+    }
+
+    if ( $Stuff{'new:declarations'} ) {
+       print NEWHI "__declarations__\n";
+       print NEWHI $Stuff{'new:declarations'};
+    }
+
+    if ( $Stuff{'new:instances'} ) {
+       print NEWHI "__instances__\n";
+       print NEWHI $Stuff{'new:instances'};
+    }
+
+    if ( $Stuff{'new:pragmas'} ) {
+       print NEWHI "__pragmas__\n";
+       print NEWHI $Stuff{'new:pragmas'};
+    }
+
+    close(NEWHI) || &tidy_up_and_die(1,"Failed writing to $new_hi\n");
+}
+\end{code}
+
+\begin{code}
+%Version = ();
+%Decl   = (); # details about individual definitions
+%Stuff  = (); # where we glom things together
+%HiExists      = ('old',-1,  'new',-1); # 1 <=> definitely exists; 0 <=> doesn't
+%HiHasBeenRead = ('old', 0,  'new', 0);
+%ModuleVersion = ('old', 0,  'new', 0);
+
+sub readHiFile {
+    local($mod,                    # module to read; can be special tag 'old'
+                           # (old .hi file for module being compiled) or
+                           # 'new' (new proto-.hi file for...)
+         $hifile) = @_;    # actual file to read
+
+    # info about the old version of this module's interface
+    $HiExists{$mod}      = -1; # 1 <=> definitely exists; 0 <=> doesn't
+    $HiHasBeenRead{$mod} = 0;
+    $ModuleVersion{$mod} = 0;
+    $Stuff{"$mod:usages"}          = ''; # stuff glommed together
+    $Stuff{"$mod:exports"}         = '';
+    $Stuff{"$mod:instance_modules"} = '';
+    $Stuff{"$mod:instances"}       = '';
+    $Stuff{"$mod:fixities"}        = '';
+    $Stuff{"$mod:declarations"}            = '';
+    $Stuff{"$mod:pragmas"}         = '';
+
+    if (! -f $hifile) { # no pre-existing .hi file
+       $HiExists{$mod} = 0;
+       return();
+    }
+
+    open(HIFILE, "< $hifile") || &tidy_up_and_die(1,"Can't open $hifile (read)\n");
+    $HiExists{$mod} = 1;
+    local($now_in) = '';
+    hi_line: while (<HIFILE>) {
+       next if /^ *$/; # blank line
+
+       # avoid pre-1.3 interfaces
+#print STDERR "now_in:$now_in:$_";
+       if ( /\{-# GHC_PRAGMA INTERFACE VERSION . #-\}/ ) {
+           $HiExists{$mod} = 0;
+           last hi_line;
+       }
+
+       if ( /^interface ([A-Z]\S*) (\d+)/ ) {
+           $ModuleName{$mod}    = $1; # not sure this is used much...
+           $ModuleVersion{$mod} = $2;
+
+       } elsif ( /^interface ([A-Z]\S*)/ && $mod eq 'new' ) { # special case: no version
+           $ModuleName{'new'} = $1;
+
+       } elsif ( /^__([a-z]+)__$/ ) {
+           $now_in = $1;
+
+       } elsif ( $now_in eq 'usages' && /^(\S+)\s+(\d+)\s+:: (.*)/ ) {
+           $Stuff{"$mod:usages"} .= $_; # save the whole thing
+
+       } elsif ( $now_in eq 'versions' && /^(\S+) (\d+)/ ) {
+           local($item) = $1;
+           local($n)    = $2;
+#print STDERR "version read:item=$item, n=$n, line=$_";
+           $Version{"$mod:$item"} = $n;
+
+       } elsif ( $now_in eq 'versions' && /^(\S+)/ && $mod eq 'new') { # doesn't have versions
+           local($item) = $1;
+#print STDERR "new version read:item=$item, line=$_";
+           $Version{"$mod:$item"} = 'y'; # stub value...
+
+       } elsif ( $now_in =~ /^(exports|instance_modules|instances|fixities|pragmas)$/ ) {
+           $Stuff{"$mod:$1"} .= $_; # just save it up
+
+       } elsif ( $now_in eq 'declarations' ) { # relatively special treatment needed...
+           $Stuff{"$mod:declarations"} .= $_; # just save it up
+
+           if ( /^[A-Z][A-Za-z0-9_']*\.(\S+)\s+::\s+/ ) {
+               $Decl{"$mod:$1"} = $_;
+
+           } elsif ( /^type\s+[A-Z][A-Za-z0-9_']*\.(\S+)/ ) {
+               $Decl{"$mod:$1"} = $_;
+
+           } elsif ( /^(newtype|data)\s+(.*\s+=>\s+)?[A-Z][A-Za-z0-9_']*\.(\S+)\s+/ ) {
+               $Decl{"$mod:$3"} = $_;
+
+           } elsif ( /class\s+(.*\s+=>\s+)?[A-Z][A-Za-z0-9_']*\.(\S+)\s+.*where\s+\{.*\};/ ) {
+               $Decl{"$mod:$2"} = $_; # must be wary of => bit matching after "where"...
+           } elsif ( /class\s+(.*\s+=>\s+)?[A-Z][A-Za-z0-9_']*\.(\S+)\s+/ ) {
+               $Decl{"$mod:$2"} = $_;
+
+           } else { # oh, well...
+               print STDERR "$Pgm: decl line didn't match?\n$_";
+           }
+
+       } else {
+           print STDERR "$Pgm:junk old iface line?:section:$now_in:$_";
+       }
+    }
+
+#   foreach $i ( sort (keys %Decl)) {
+#      print STDERR "$i: ",$Decl{$i}, "\n";
+#   }
+
+    close(HIFILE) || &tidy_up_and_die(1,"Failed reading from $hifile\n");
+    $HiHasBeenRead{$mod} = 1;
+}
+\end{code}
+
+\begin{code}
+sub calcNewModuleVersion {
+
+    return(&mv_change(1,'no old .hi file')) if $HiExists{'old'} == 0;
+       # could use "time()" as initial version; if a module existed, then was deleted,
+       # then comes back, we don't want the resurrected one to have an
+       # lower version number than the original (in case there are any
+       # lingering references to the original in other .hi files).
+
+    local($unchanged_version) = $ModuleVersion{'old'}; # will return one of these two
+    local($changed_version)   = $unchanged_version + 1;
+
+    return(&mv_change($changed_version,'usages changed')) if $Stuff{'old:usages'} ne $Stuff{'new:usages'};
+
+    foreach $t ( 'exports', 'instance_modules', 'instances', 'fixities', 'declarations', 'pragmas' ) {
+       return(&mv_change($changed_version,"$t changed")) if $Stuff{"old:$t"} ne $Stuff{"new:$t"};
+    }
+
+    return($unchanged_version);
+}
+
+sub mv_change {
+    local($mv, $str) = @_;
+
+    print STDERR "$Pgm: module version changed to $mv; reason: $str\n";
+    return($mv);
+}
+
+sub printNewItemVersion {
+    local($item, $mod_version) = @_;
+
+    if (! defined($Decl{"new:$item"}) ) {
+       print STDERR "$item: no decl?! (nothing into __versions__)\n";
+       return;
+    }
+
+    local($idecl) = $Decl{"new:$item"};
+
+    if (! defined($Decl{"old:$item"})) {
+       print STDERR "new: $item\n";
+       print NEWHI  "$item $mod_version\n";
+    } elsif ($idecl ne $Decl{"old:$item"})  {
+       print STDERR "changed: $item\n";
+       print NEWHI  "$item $mod_version\n";
+    } elsif (! defined($Version{"old:$item"}) ) {
+       print STDERR "$item: no old version?!\n" 
+    } else {
+       print NEWHI  "$item ", $Version{"old:$item"}, "\n";
+    }
+    return;
+}
+\end{code}
+
+\begin{code}
+sub findHiChanges {
+    local($hsc_hi,             # The iface info produced by hsc.
+         $hifile_target) = @_; # Pre-existing .hi filename (if it exists)
+}
+\end{code}
+
+\begin{code}
+# make "require"r happy...
+1;
+\end{code}
diff --git a/ghc/driver/ghc-recomp.lprl b/ghc/driver/ghc-recomp.lprl
new file mode 100644 (file)
index 0000000..3414605
--- /dev/null
@@ -0,0 +1,135 @@
+%************************************************************************
+%*                                                                     *
+\section[Driver-recomp-chking]{Recompilation checker}
+%*                                                                     *
+%************************************************************************
+
+\begin{code}
+sub runRecompChkr {
+    local($ifile,      # originating input file
+         $ifile_hs,    # post-unlit, post-cpp, etc., input file
+         $ifile_root,  # input filename minus suffix
+         $ofile_target,# the output file that we ultimately hope to produce
+         $hifile_target# the .hi file ... (ditto)
+        ) = @_;
+
+    ($i_dev,$i_ino,$i_mode,$i_nlink,$i_uid,$i_gid,$i_rdev,$i_size,
+     $i_atime,$i_mtime,$i_ctime,$i_blksize,$i_blocks) = stat($ifile);
+
+    if ( ! -f $ofile_target ) {
+       print STDERR "$Pgm:compile:Output file $ofile_target doesn't exist\n";
+       return(1);
+    }
+
+    ($o_dev,$o_ino,$o_mode,$o_nlink,$o_uid,$o_gid,$o_rdev,$o_size,
+     $o_atime,$o_mtime,$o_ctime,$o_blksize,$o_blocks) = stat(_); # stat info from -f test
+
+    if ( ! -f $hifile_target ) {
+       print STDERR "$Pgm:compile:Interface file $hifile_target doesn't exist\n";
+       return(1);
+    }
+
+    ($hi_dev,$hi_ino,$hi_mode,$hi_nlink,$hi_uid,$hi_gid,$hi_rdev,$hi_size,
+     $hi_atime,$hi_mtime,$hi_ctime,$hi_blksize,$hi_blocks) = stat(_); # stat info from -f test
+
+    if ($i_mtime > $o_mtime) {
+       print STDERR "$Pgm:recompile:Input file $ifile newer than $ofile_target ($i_mtime > $o_mtime)\n";
+       return(1);
+    }
+
+    # OK, let's see what we used last time; if none of it has
+    # changed, then we don't need to continue with this compilation.
+    require('ghc-iface.prl')
+       || &tidy_up_and_die(1,"$Pgm: panic: can't load ghc-iface.prl (recomp)!\n");
+    &tidy_up_and_die(1,"$Pgm:recomp:why has $hifile_target already been read?\n")
+       if $HiHasBeenRead{'old'} == 1;
+
+    &readHiFile('old',$hifile_target);
+    %ModUsed = ();
+    %Used    = ();
+
+    foreach $ul ( split(/;\n/, $Stuff{'old:usages'}) ) {
+
+       $ul =~ /^(\S+)\s+(\d+)\s+:: (.*)/ || die "$Pgm: bad old usages line!\n";
+       local($mod)    = $1;
+       local($modver) = $2;
+       local(@thing)  = split(/\s+/, $3);
+
+       $ModUsed{$mod} = $modver;
+
+       local($key, $n);
+       while ( $#thing >= 0 ) {
+           $key = "$mod:" . $thing[0];
+           $n   = $thing[1];
+           $Used{$key} = $n;
+           shift @thing; shift @thing; # toss two
+       }
+    }
+
+    # see if we can avoid recompilation just by peering at the
+    # module-version numbers:
+
+    &makeHiMap() unless $HiMapDone;
+
+    local($used_modules_have_changed) = 0;
+    used_mod: foreach $um ( keys %ModUsed ) {
+       if ( ! defined($HiMap{$um}) ) {
+           print STDERR "$Pgm:recompile:interface for used module $um no longer exists\n";
+           foreach $hm ( keys %HiMap ) {
+               print STDERR "$hm ==> ", $HiMap{$hm}, "\n";
+           }
+           return 1;
+       } else {
+           if ( $HiHasBeenRead{$um} ) {
+               print STDERR "$Pgm:very strange that $um.hi has already been read?!?\n"
+           } else {
+               &readHiFile($um, $HiMap{$um});
+           }
+       }
+       if ( $ModUsed{$um} != $ModuleVersion{$um} ) {
+           print STDERR "used module version: $um: was: ",$ModUsed{$um}, "; is ", $ModuleVersion{$um}, "\n";
+           $used_modules_have_changed = 1;
+           last used_mod; # no point continuing...
+       }
+    }
+    return 0 if ! $used_modules_have_changed;
+
+    # well, some module version has changed, but maybe no
+    # entity of interest has...
+print STDERR "considering used entities...\n";
+    local($used_entities_have_changed) = 0;
+
+    used_entity: foreach $ue ( keys %Used ) {
+       $ue =~ /([A-Z][A-Za-z0-9_']*):(.+)/;
+       local($ue_m) = $1;
+       local($ue_n) = $2;
+
+       die "$Pgm:interface for used-entity module $ue_m doesn't exist\n"
+           if ! defined($HiMap{$ue_m});
+
+       &readHiFile($ue_m, $HiMap{$ue_m}) unless $HiHasBeenRead{$ue_m};
+       # we might not have read it before...
+
+       if ( !defined($Version{$ue}) ) {
+           print STDERR "No version info for $ue?!\n";
+
+       } elsif ( $Used{$ue} != $Version{$ue} ) {
+           print STDERR "$Pgm:recompile: used entity changed: $ue: was version ",$Used{$ue},"; is ", $Version{$ue}, "\n";
+           $used_entities_have_changed = 1;
+           last used_entity; # no point continuing...
+       }
+    }
+    return 0 if ! $used_entities_have_changed;
+
+    print STDERR "ifile  $ifile:\t$i_mtime\n";
+    print STDERR "ofile  $ofile_target:\t$o_mtime\n";
+    print STDERR "hifile $hifile_target:\t$hi_mtime\n";
+
+    return(1); # OK, *recompile*
+}
+\end{code}
+
+\begin{code}
+# make "require"r happy...
+1;
+\end{code}
index 00c116e..3a4dadb 100644 (file)
@@ -9,7 +9,7 @@ sub inject_split_markers {
     local($hc_file) = @_;
 
     unlink("$Tmp_prefix.unmkd");
-    local($to_do) = "cp $hc_file $Tmp_prefix.unmkd";
+    local($to_do) = "$Cp $hc_file $Tmp_prefix.unmkd";
     &run_something($to_do, 'Prepare to number split markers');
 
     open(TMPI, "< $Tmp_prefix.unmkd") || &tidy_up_and_die(1,"$Pgm: failed to open `$Tmp_prefix.unmkd' (to read)\n");
@@ -191,8 +191,8 @@ sub process_asm_block_sparc {
     if ( $OptimiseC ) {
        $str =~ s/_?__stg_split_marker.*:\n//;
     } else {
-       $str =~ s/(\.text\n\t\.align .\n)\t\.global\s+.*_?__stg_split_marker.*\n\t\.proc.*\n/\1/;
-       $str =~ s/(\t\.align .\n)\t\.global\s+.*_?__stg_split_marker.*\n\t\.proc.*\n/\1/;
+       $str =~ s/(\.text\n\t\.align .\n)\t\.global\s+.*_?__stg_split_marker.*\n\t\.proc.*\n/$1/;
+       $str =~ s/(\t\.align .\n)\t\.global\s+.*_?__stg_split_marker.*\n\t\.proc.*\n/$1/;
     }
 
     # make sure the *.hc filename gets saved; not just ghc*.c (temp name)
@@ -226,10 +226,10 @@ sub process_asm_block_sparc {
 sub process_asm_block_m68k {
     local($str) = @_;
 
-    # strip the marker (ToDo: something special for unregisterized???)
+    # strip the marker
 
-    $str =~ s/(\.text\n\t\.even\n)\t\.globl\s+.*_?__stg_split_marker.*\n/\1/;
-    $str =~ s/(\t\.even\n)\t\.globl\s+.*_?__stg_split_marker.*\n/\1/;
+    $str =~ s/(\.text\n\t\.even\n)\t\.globl\s+.*_?__stg_split_marker.*\n/$1/;
+    $str =~ s/(\t\.even\n)\t\.globl\s+.*_?__stg_split_marker.*\n/$1/;
 
     # it seems prudent to stick on one of these:
     $str = "\.text\n\t.even\n" . $str;
@@ -266,7 +266,7 @@ sub process_asm_block_alpha {
     if ( $OptimiseC ) {
        $str =~ s/_?__stg_split_marker.*:\n//;
     } else {
-       $str =~ s/(\t\.align .\n)\t\.globl\s+.*_?__stg_split_marker.*\n\t\.ent.*\n/\1/;
+       $str =~ s/(\t\.align .\n)\t\.globl\s+.*_?__stg_split_marker.*\n\t\.ent.*\n/$1/;
     }
 
     # remove/record any literal constants defined here
@@ -292,7 +292,7 @@ sub process_asm_block_alpha {
     # Slide the dummy direct return code into the vtbl .ent/.end block,
     # to keep the label fixed if it's the last thing in a module, and
     # to avoid having any anonymous text that the linker will complain about
-    $str =~ s/(\t\.end [A-Za-z0-9_]+)\n\t# nop/\tnop\n\1/g;
+    $str =~ s/(\t\.end [A-Za-z0-9_]+)\n\t# nop/\tnop\n$1/g;
 
     print STDERR "### STRIPPED BLOCK (alpha):\n$str" if $Dump_asm_splitting_info;
 
@@ -302,10 +302,10 @@ sub process_asm_block_alpha {
 sub process_asm_block_iX86 {
     local($str) = @_;
 
-    # strip the marker (ToDo: something special for unregisterized???)
+    # strip the marker
 
-    $str =~ s/(\.text\n\t\.align .(,0x90)?\n)\.globl\s+.*_?__stg_split_marker.*\n/\1/;
-    $str =~ s/(\t\.align .(,0x90)?\n)\.globl\s+.*_?__stg_split_marker.*\n/\1/;
+    $str =~ s/(\.text\n\t\.align .(,0x90)?\n)\.globl\s+.*_?__stg_split_marker.*\n/$1/;
+    $str =~ s/(\t\.align .(,0x90)?\n)\.globl\s+.*_?__stg_split_marker.*\n/$1/;
 
     # it seems prudent to stick on one of these:
     $str = "\.text\n\t.align 4\n" . $str;
@@ -396,7 +396,7 @@ sub process_asm_block_mips {
     if ( $OptimiseC ) {
        $str =~ s/_?__stg_split_marker.*:\n//;
     } else {
-       $str =~ s/(\t\.align .\n)\t\.globl\s+.*_?__stg_split_marker.*\n\t\.ent.*\n/\1/;
+       $str =~ s/(\t\.align .\n)\t\.globl\s+.*_?__stg_split_marker.*\n\t\.ent.*\n/$1/;
     }
 
     # remove/record any literal constants defined here
@@ -422,7 +422,7 @@ sub process_asm_block_mips {
     # Slide the dummy direct return code into the vtbl .ent/.end block,
     # to keep the label fixed if it's the last thing in a module, and
     # to avoid having any anonymous text that the linker will complain about
-    $str =~ s/(\t\.end [A-Za-z0-9_]+)\n\t# nop/\tnop\n\1/g;
+    $str =~ s/(\t\.end [A-Za-z0-9_]+)\n\t# nop/\tnop\n$1/g;
 
     $str .= $UNDEFINED_FUNS; # pin on gratuitiously-large amount of info
 
index 8ccef55..09f1bef 100644 (file)
@@ -37,7 +37,7 @@ possible phases of a compilation:
 For each input file, the phase to START with is determined by the
 file's suffix:
     - .lhs     literate Haskell: lit2pgm
-    - .hs      illiterate Haskell: hsp
+    - .hs      illiterate Haskell: hsc
     - .hc      C from the Haskell compiler: gcc
     - .c       C not from the Haskell compiler: gcc
     - .s       assembly language: as
@@ -56,7 +56,7 @@ option:
 
 Other commonly-used options are:
 
-    -O         An `optimising' package of options, to produce faster code
+    -O         An `optimising' package of compiler flags, for faster code
 
     -prof      Compile for cost-centre profiling
                (add -auto for automagic cost-centres on top-level functions)
@@ -108,17 +108,19 @@ if (! $ENV{'GLASGOW_HASKELL_ROOT'}) { # good -- death to environment variables
     $TopPwd        = '$(TOP_PWD)';
     $InstLibDirGhc  = '$(INSTLIBDIR_GHC)';
     $InstDataDirGhc = '$(INSTDATADIR_GHC)';
+#   $InstSysLibDir  = '$(INSTLIBDIR_HSLIBS)'; ToDo ToDo
+    $InstSysLibDir  = '$(TOP_PWD)/hslibs';
 } else {
     $TopPwd = $ENV{'GLASGOW_HASKELL_ROOT'};
 
-    if ( '$(INSTLIBDIR_GHC)' =~ /^\/(local\/fp|usr\/local)(\/.*)/ ) {
-       $InstLibDirGhc  = $ENV{'GLASGOW_HASKELL_ROOT'} . $2;
+    if ('$(INSTLIBDIR_GHC)' =~ /.*(\/lib\/ghc\/\d\.\d\d\/[^-]-[^-]-[^-]\/.*)/) {
+       $InstLibDirGhc  = $ENV{'GLASGOW_HASKELL_ROOT'} . $1;
     } else {
        print STDERR "GLASGOW_HASKELL_ROOT environment variable is set;\nBut can't untangle $(INSTLIBDIR_GHC).\n(Installation error)\n";
        exit(1);
     }
 
-    if ( '$(INSTDATADIR_GHC)' =~ /\/(local\/fp|usr\/local)(\/.*)/ ) {
+    if ('$(INSTDATADIR_GHC)' =~ /.*(\/lib\/ghc\/\d\.\d\d\/.*)/) {
        $InstDataDirGhc = $ENV{'GLASGOW_HASKELL_ROOT'} . $2;
     } else {
        print STDERR "GLASGOW_HASKELL_ROOT environment variable is set;\nBut can't untangle $(INSTDATADIR_GHC).\n(Installation error)\n";
@@ -128,8 +130,6 @@ if (! $ENV{'GLASGOW_HASKELL_ROOT'}) { # good -- death to environment variables
 
 $Status  = 0; # just used for exit() status
 $Verbose = '';
-$CoreLint = '';
-$Time = '';    # ToDo: mkworld-ize the timing command
 
 # set up signal handler
 sub quit_upon_signal { &tidy_up_and_die(1, ''); }
@@ -138,7 +138,7 @@ $SIG{'QUIT'} = 'quit_upon_signal';
 
 # where to get "require"d .prl files at runtime (poor man's dynamic loading)
 #   (use LIB, not DATA, because we can't be sure of arch-independence)
-@INC = ( ( $(INSTALLING) ) ? "$InstLibDirGhc"
+@INC = ( ( $(INSTALLING) ) ? $InstLibDirGhc
                           : "$TopPwd/$(CURRENT_DIR)" );
 
 if ( $ENV{'TMPDIR'} ) { # where to make tmp file names
@@ -154,7 +154,12 @@ $Unlit = ( $(INSTALLING) ) ? "$InstLibDirGhc/unlit"
                             : "$TopPwd/$(CURRENT_DIR)/$(GHC_UNLIT)";
 @Unlit_flags   = ();
 
-$Cat    = "cat";
+$Cp   = '$(CP)';
+$Rm   = '$(RM)';
+$Diff = '$(CONTEXT_DIFF)';
+$Cat  = 'cat';
+$Cmp  = 'cmp';
+$Time = '';
 
 $HsCpp  = # but this is re-set to "cat" (after options) if -cpp not seen
           ( $(INSTALLING) ) ? "$InstLibDirGhc/hscpp"
@@ -162,10 +167,6 @@ $HsCpp      = # but this is re-set to "cat" (after options) if -cpp not seen
 @HsCpp_flags   = ();
 $genSPECS_flag = '';           # See ../utils/hscpp/hscpp.prl
 
-$HsP    = ( $(INSTALLING) ) ? "$InstLibDirGhc/hsp"
-                            : "$TopPwd/$(CURRENT_DIR)/$(GHC_HSP)";
-@HsP_flags = ();
-
 $HsC    = ( $(INSTALLING) ) ? "$InstLibDirGhc/hsc"
                             : "$TopPwd/$(CURRENT_DIR)/$(GHC_HSC)";
 
@@ -177,10 +178,11 @@ $SysMan    = ( $(INSTALLING) ) ? "$InstLibDirGhc/SysMan"
 #   terrible things to cache behavior.
 $Specific_heap_size = 6 * 1000 * 1000;
 $Specific_stk_size  = 1000 * 1000;
-$Scale_sizes_by = 1.0;
-$RTS_style = $(GHC_RTS_STYLE);
-@HsC_rts_flags = ();
+$Scale_sizes_by     = 1.0;
+@HsC_rts_flags      = ();
 
+@HsP_flags     = (); # these are the flags destined solely for
+                     # the flex/yacc parser
 @HsC_flags     = ();
 @HsC_antiflags  = ();
 \end{code}
@@ -189,9 +191,10 @@ The optimisations/etc to be done by the compiler are {\em normally}
 expressed with a \tr{-O} (or \tr{-O2}) flag, or by its absence.
 
 \begin{code}
-$OptLevel = 0;     # no -O == 0; -O == 1; -O2 == 2; -Ofile == 3
-$MinusO2ForC = 0;   # set to 1 if -O2 should be given to C compiler
+$OptLevel      = 0; # no -O == 0; -O == 1; -O2 == 2; -Ofile == 3
+$MinusO2ForC   = 0; # set to 1 if -O2 should be given to C compiler
 $StolenX86Regs = 4; # **HACK*** of the very worst sort
+$CoreLint      = '';
 \end{code}
 
 These variables represent parts of the -O/-O2/etc ``templates,''
@@ -202,41 +205,31 @@ $Oopt_UnfoldingUseThreshold       = '-fsimpl-uf-use-threshold3';
 $Oopt_MaxSimplifierIterations  = '-fmax-simplifier-iterations4';
 $Oopt_PedanticBottoms          = '-fpedantic-bottoms'; # ON by default
 $Oopt_MonadEtaExpansion                = '';
-#OLD:$Oopt_LambdaLift          = '';
-$Oopt_AddAutoSccs              = '';
 $Oopt_FinalStgProfilingMassage = '';
 $Oopt_StgStats                 = '';
 $Oopt_SpecialiseUnboxed                = '';
 $Oopt_DoSpecialise             = '-fspecialise';
 $Oopt_FoldrBuild               = 1; # On by default!
-$Oopt_FB_Support               = '-fdo-new-occur-anal -fdo-arity-expand';
+$Oopt_FB_Support               = '-fdo-arity-expand';
 #$Oopt_FoldrBuildWW            = 0; # Off by default
 $Oopt_FoldrBuildInline         = '-fdo-inline-foldr-build';
 \end{code}
 
 Things to do with C compilers/etc:
 \begin{code}
-$CcUnregd      = '$(GHC_DEBUG_HILEV_ASM)'; # our high-level assembler (non-optimising)
-$CcRegd                = '$(GHC_OPT_HILEV_ASM)';   # our high-level assembler (optimising)
-$GccAvailable  = $(GHC_GCC_IS_AVAILABLE);  # whether GCC avail or not for optimising
-
+$CcRegd                = 'gcc';
 @CcBoth_flags  = ('-S');   # flags for *any* C compilation
 @CcInjects     = ();
 
-# non-registerizing flags: those for all files, those only for .c files; those only for .hc files
-@CcUnregd_flags   = ( $GccAvailable ) ? ('-ansi', '-pedantic') : ();
-@CcUnregd_flags_c = ();
-@CcUnregd_flags_hc= ();
-
-# ditto; but for registerizing (we must have GCC for this)
+# GCC flags: those for all files, those only for .c files; those only for .hc files
 @CcRegd_flags    = ('-ansi', '-D__STG_GCC_REGS__', '-D__STG_TAILJUMPS__');
 @CcRegd_flags_c        = ();
 @CcRegd_flags_hc = ();
 
-$As            = ''; # assembler is normally the same pgm as used for C compilation
+$As            = ''; # "assembler" is normally GCC
 @As_flags      = ();
 
-$Lnkr          = ''; # linker is normally the same pgm as used for C compilation
+$Lnkr          = ''; # "linker" is normally GCC
 @Ld_flags      = ();
 
 # 'nm' is used for consistency checking (ToDo: mk-world-ify)
@@ -283,7 +276,7 @@ $BuildTag   = ''; # default is sequential build w/ Appel-style GC
 %BuildDescr    = ('',      'normal sequential',
                   '_p',    'profiling',
                   '_t',    'ticky-ticky profiling',
-                  '_u',    'unregisterized (using portable C only)',
+#OLD:             '_u',    'unregisterized (using portable C only)',
                   '_mc',   'concurrent',
                   '_mr',   'profiled concurrent',
                   '_mt',   'ticky concurrent',
@@ -341,12 +334,15 @@ $BuildTag = ''; # default is sequential build w/ Appel-style GC
                   '_p',    'push(@HsC_flags,  \'-fscc-profiling\');
                             push(@CcBoth_flags, \'-DPROFILING\');',
 
+                           #and maybe ...
+                           #push(@CcBoth_flags, '-DPROFILING_DETAIL_COUNTS');
+
                            # ticky-ticky sequential
                   '_t',    'push(@HsC_flags, \'-fticky-ticky\');
                             push(@CcBoth_flags, \'-DTICKY_TICKY\');',
 
-                           # unregisterized (ToDo????)
-                  '_u',    '',
+#OLD:                      # unregisterized (ToDo????)
+#                 '_u',    '',
 
                            # concurrent
                   '_mc',   '$StkChkByPageFaultOK = 0;
@@ -374,7 +370,8 @@ $BuildTag   = ''; # default is sequential build w/ Appel-style GC
 
                            # GranSim
                   '_mg',   '$StkChkByPageFaultOK = 0;
-                            push(@HsC_flags,  \'-fconcurrent\');
+                            push(@HsC_flags,  \'-fconcurrent\', \'-fgransim\');
+                            push(@HsCpp_flags,\'-D__GRANSIM__\',   \'-DGRAN\');
                             push(@Cpp_define, \'-D__CONCURRENT_HASKELL__\', \'-DCONCURRENT\', \'-DGRAN\');',
 
                   '_2s',   'push (@CcBoth_flags, \'-DGC2s\');',
@@ -409,17 +406,17 @@ require special handling.
 @SysImport_dir = ( $(INSTALLING) )
                    ? ( "$InstDataDirGhc/imports" )
                    : ( "$TopPwd/$(CURRENT_DIR)/$(GHC_LIBSRC)/prelude"
-                     );
+                     , "$TopPwd/$(CURRENT_DIR)/$(GHC_LIBSRC)/required" );
 
-$ghc_version_info = $(PROJECTVERSION) * 100;
-$haskell1_version = 2; # i.e., Haskell 1.2
-@Cpp_define    = ();
+$GhcVersionInfo  = 201; # ToDo: int ($(PROJECTVERSION) * 100);
+$Haskell1Version = 3; # i.e., Haskell 1.3
+@Cpp_define     = ();
 
 @UserLibrary_dir= ();  #-L things;...
 @UserLibrary           = ();   #-l things asked for by the user
 
 @SysLibrary_dir = ( ( $(INSTALLING) )  #-syslib things supplied by the system
-                   ? "$InstLibDirGhc"
+                   ? $InstLibDirGhc
                    : ("$TopPwd/$(CURRENT_DIR)/$(GHC_RUNTIMESRC)",
                       "$TopPwd/$(CURRENT_DIR)/$(GHC_RUNTIMESRC)/gmp",
                       "$TopPwd/$(CURRENT_DIR)/$(GHC_LIBSRC)")
@@ -440,35 +437,28 @@ start with.  L