[project @ 1999-10-05 10:30:26 by simonmar]
[ghc-hetmet.git] / ghc / driver / ghc.lprl
index 7b2ee9c..965a8d6 100644 (file)
@@ -98,7 +98,7 @@ INSTALLING
 
 HOSTPLATFORM TARGETPLATFORM
 
-ProjectName ProjectVersion ProjectVersionInt ProjectPatchLevel 
+ProjectName ProjectVersion ProjectVersionInt
 
 HscMajorVersion HscMinorVersion CcMajorVersion CcMinorVersion
 
@@ -108,18 +108,20 @@ bindir libdir libexecdir datadir
 
 CURRENT_DIR TMPDIR
 
-GHC_LIB_DIR GHC_RUNTIME_DIR GHC_UTILS_DIR GHC_INCLUDE_DIR
+GHC_LIB_DIR GHC_RUNTIME_DIR GHC_INCLUDE_DIR
 
 GHC_OPT_HILEV_ASM GhcWithNativeCodeGen
 
-GHC_UNLIT GHC_HSCPP GHC_HSC GHC_SYSMAN
+GHC_UNLIT GHC_HSCPP GHC_MKDEPENDHS GHC_HSC GHC_SYSMAN
 
 CP RM CONTEXT_DIFF
 
-WAY_*_NAME WAY_*_HC_OPTS
+WAY_*_NAME WAY_*_REAL_OPTS
 
 LeadingUnderscore
 
+GhcWithRegisterised
+
 \end{verbatim}
 
 Establish what executables to run for the various phases, what the
@@ -223,15 +225,11 @@ These are the default values, which may be changed by user flags.
 sub setupOptFlags {
    $Oopt_MaxSimplifierIterations  = '-fmax-simplifier-iterations4';
    $Oopt_PedanticBottoms         = '-fpedantic-bottoms'; # ON by default
-   $Oopt_MonadEtaExpansion       = '';
    $Oopt_FinalStgProfilingMassage = '';
    $Oopt_StgStats                = '';
    $Oopt_DoSpecialise            = '-fspecialise';
    $Oopt_FoldrBuild              = 0; # *Off* by default!
-   $Oopt_FB_Support              = ''; # was '-fdo-arity-expand';
-#  $Oopt_FoldrBuildWW            = 0; # Off by default
-   $Oopt_FoldrBuildInline        = ''; # was '-fdo-inline-foldr-build';
-   $Oopt_ShowSimplifierProgress   = '';
+   $Oopt_UsageSPInf               = ''; # Off by default
 } # end of setupOptFlags
 
 # Assign defaults to these right away.
@@ -281,13 +279,14 @@ these are turned off by -Wnot.
 \begin{code}
 @StandardWarnings = ('-fwarn-overlapping-patterns', 
                     '-fwarn-missing-methods',
+                    '-fwarn-missing-fields',
                     '-fwarn-duplicate-exports');
 @MinusWOpts              = (@StandardWarnings, 
-                    '-fwarn-incomplete-patterns', 
                     '-fwarn-unused-binds',
+                    '-fwarn-unused-matches',
+                    '-fwarn-incomplete-patterns', 
                     '-fwarn-unused-imports');
 @MinusWallOpts           = (@MinusWOpts, 
-                    '-fwarn-unused-matches',
                     '-fwarn-type-defaults',
                     '-fwarn-name-shadowing',
                     '-fwarn-missing-signatures');
@@ -301,12 +300,12 @@ Prelude ({\em including} its interface file(s)).
 $BuildTag      = ''; # default is sequential build w/ Appel-style GC
 
 %BuildDescr    = (# system ways begin
-                   '',     'normal sequential',
-                  '_p',    "$WAY_p_NAME",
-                  '_t',    "$WAY_t_NAME",
-                  '_u',    "$WAY_u_NAME",
-                  '_mp',   "$WAY_mp_NAME",
-                  '_mg',   "$WAY_mg_NAME",
+                   '',     'Normal Sequential',
+                  '_p',    "Profiling",
+                  '_t',    "Ticky-ticky Profiling",
+                  '_u',    "Unregisterised",
+                  '_mp',   "Parallel",
+                  '_mg',   "Gransim",
                   # system ways end
                   '_a',    "$WAY_a_NAME",
                   '_b',    "$WAY_b_NAME",
@@ -330,39 +329,30 @@ $BuildTag = ''; # default is sequential build w/ Appel-style GC
 #
 %SetupOpts = 
        (
-       '_a', "$WAY_a_HC_OPTS",
-       '_b', "$WAY_b_HC_OPTS",
-       '_c', "$WAY_c_HC_OPTS",
-       '_d', "$WAY_d_HC_OPTS",
-       '_e', "$WAY_e_HC_OPTS",
-       '_f', "$WAY_f_HC_OPTS",
-       '_g', "$WAY_g_HC_OPTS",
-       '_h', "$WAY_h_HC_OPTS",
-       '_i', "$WAY_i_HC_OPTS",
-       '_j', "$WAY_j_HC_OPTS",
-       '_k', "$WAY_k_HC_OPTS",
-       '_l', "$WAY_l_HC_OPTS",
-       '_m', "$WAY_m_HC_OPTS",
-       '_n', "$WAY_n_HC_OPTS",
-       '_o', "$WAY_o_HC_OPTS",
-       '_A', "$WAY_A_HC_OPTS",
-       '_B', "$WAY_B_HC_OPTS",
+       '_a', "$WAY_a_REAL_OPTS",
+       '_b', "$WAY_b_REAL_OPTS",
+       '_c', "$WAY_c_REAL_OPTS",
+       '_d', "$WAY_d_REAL_OPTS",
+       '_e', "$WAY_e_REAL_OPTS",
+       '_f', "$WAY_f_REAL_OPTS",
+       '_g', "$WAY_g_REAL_OPTS",
+       '_h', "$WAY_h_REAL_OPTS",
+       '_i', "$WAY_i_REAL_OPTS",
+       '_j', "$WAY_j_REAL_OPTS",
+       '_k', "$WAY_k_REAL_OPTS",
+       '_l', "$WAY_l_REAL_OPTS",
+       '_m', "$WAY_m_REAL_OPTS",
+       '_n', "$WAY_n_REAL_OPTS",
+       '_o', "$WAY_o_REAL_OPTS",
+       '_A', "$WAY_A_REAL_OPTS",
+       '_B', "$WAY_B_REAL_OPTS",
 
        # system ways
-       '_p',  "$WAY_p_HC_OPTS",
-       '_t',  "$WAY_t_HC_OPTS",
-       '_u',  "$WAY_u_HC_OPTS",
-       '_mp', "$WAY_mp_HC_OPTS",
-       '_mg', "$WAY_mg_HC_OPTS");
-
-\end{code}
-
-Import/include directories (\tr{-I} options) are sufficiently weird to
-require special handling.
-
-\begin{code}
-@Import_dir    = ('.'); #-i things
-@Include_dir   = ('.'); #-I things; other default(s) stuck on AFTER option processing
+       '_p',  "-fscc-profiling -DPROFILING -optc-DPROFILING",
+       '_t',  "-fticky-ticky -DTICKY_TICKY -optc-DTICKY_TICKY",
+       '_u',  "-optc-DNO_REGS -optc-DUSE_MINIINTERPRETER -fno-asm-mangling -funregisterised",
+       '_mp', "-fstack-check -fparallel -D__PARALLEL_HASKELL__ -optc-DPAR",
+       '_mg', "-fstack-check -fconcurrent -fgransim -D__GRANSIM__ -D__CONCURRENT_HASKELL__ -optc-DCONCURRENT -optc-DGRAN");
 
 # where to look for interface files (system hi's, i.e., prelude and syslibs)
 @SysImport_dir = ( $INSTALLING )
@@ -378,14 +368,13 @@ $Haskell1Version = 5; # i.e., Haskell 1.4
 # Cpp symbols defined when we're processing Haskell source.
 
 @HsSourceCppOpts = 
-       ( "-D__HASKELL1__=$Haskell1Version"
+       ( "-D__HASKELL__=98"
+       , "-D__HASKELL1__=$Haskell1Version"
        , "-D__GLASGOW_HASKELL__=$ProjectVersionInt"
        , "-D__HASKELL98__"
        , "-D__CONCURRENT_HASKELL__"
        );
 
-@UserLibrary_dir= ();  #-L things;...
-@UserLibrary           = ();   #-l things asked for by the user
 
 @SysLibrary_dir = ( ( $INSTALLING )    #-syslib things supplied by the system
                    ? $InstLibDirGhc
@@ -395,17 +384,11 @@ $Haskell1Version = 5; # i.e., Haskell 1.4
                      , "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/std/cbits"
                      )
                  );
-@SysLibrary = (); # will be built up as we go along
-
-$TopClosureFile # defaults to 1.2 one; will be mangled later
-       = '';
-#      ( $INSTALLING)  ? "$InstLibDirGhc/TopClosureXXXX.o"
-#                        : "$TopPwd/$CURRENT_DIR/$GHC_RUNTIME_DIR/main/TopClosureXXXX.o";
 
 # make depend for Haskell
 $MkDependHS
        = ( $INSTALLING ) ? "$InstLibExecDirGhc/mkdependHS"
-                         : "$TopPwd/$CURRENT_DIR/$GHC_UTILS_DIR/mkdependHS/mkdependHS";
+                         : "$TopPwd/$CURRENT_DIR/$GHC_MKDEPENDHS";
 # Fill in later
 @MkDependHS_flags = ();
 
@@ -424,8 +407,6 @@ sub initDriverGlobals {
 # reset the following options:
 # RTS flags to use while compiling
 @HsC_rts_flags      = ();
-@HsP_flags     = (); # these are the flags destined solely for
-                     # the flex/yacc parser
 @HsC_flags     = ();
 @HsC_antiflags  = ();
 \end{code}
@@ -438,12 +419,19 @@ $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      = '';
+$USPLint       = '';
 $StgLint       = '';
 
+# The SplitMarker is the string/character used to mark end of element
+# in import lists.
+$SplitMarker    = ':';
 @Import_dir    = ('.'); #-i things
 @Include_dir   = ('.'); #-I things; other default(s) stuck on AFTER option processing
 
+@UserLibrary_dir= ();  #-L things;...
+@UserLibrary           = ();   #-l things asked for by the user
 
+@SysLibrary = (); # will be built up as we go along
 \end{code}
 
 We are given a list of files with various presumably-known suffixes
@@ -492,6 +480,7 @@ $UNPROFscc_auto = '';       # set to relevant hsc flag if forcing auto sccs without pr
 $TICKYing = '';        # set to t if compiling for ticky-ticky profiling
 $PARing = '';          # set to p if compiling for PAR
 $GRANing = '';         # set to g if compiling for GRAN
+$UNREGing = ($GhcWithRegisterised eq 'YES') ? '' : 'u';
 $Specific_hi_file = '';                # set by -ohi <file>; "-" for stdout
 $Specific_dump_file = '';      # set by -odump <file>; "-" for stdout
 $Using_dump_file = 0;
@@ -693,216 +682,104 @@ It really really wants to be the last STG-to-STG pass that is run.
 
 sub setupOptimiseFlags {
 
+       # this pass-ordering sequence was agreed by Simon and Andr\'e
+       # (WDP 94/07, 94/11).
+
    @HsC_minusNoO_flags 
-    = (        '-fsimplify',
-         '[',
-         $Oopt_FB_Support,
-         '-ffloat-lets-exposing-whnf',
-         '-ffloat-primops-ok',
-         '-fcase-of-case',
-         '-fdo-case-elim',
-#        '-fdo-lambda-eta-expansion',  # too complicated
-         '-freuse-con',
-#        '-flet-to-case',              # no strictness analysis, so...
-         $Oopt_PedanticBottoms,
-#        $Oopt_MonadEtaExpansion,      # no thanks
-
-# These two work fine, if you really want no simplification at all,
-# for bizarre test reasons.  But you get really terrible code if you use them,
-#      for example: let x = e in x
-# with dozens of redundant thunks etc.  So I'm leaving them out.
-#
-#        '-fsimpl-uf-use-threshold0',
-#        '-fessential-unfoldings-only',
-
-         #
-         # The presence of -fclone-binds is *temporary* to work around
-          # the fact that the desugarer in 3.0{2.3} does generate
-         # bindings with identical ids, and the type checker doesn't perform
-         # properly cloned type substitutions. Instead, we make sure that all 
-         # binders are cloned first time through the simplifier.
-          #
-         # Will be properly fixed in the `new compiler` I hear, at which point
-         # the cloning can be turned off here.
-         #
-          # Let's find out..
-          #'-fclone-binds',
-
-         $Oopt_MaxSimplifierIterations,
-         $Oopt_ShowSimplifierProgress,
+    = (        
+       '-fsimplify',
+         '[', 
+               '-finline-phase2',
+               $Oopt_MaxSimplifierIterations,
          ']',
+
        $Oopt_AddAutoSccs,
-#      '-ffull-laziness',      # removed 95/04 WDP following Andr\'e's lead
-       
        $Oopt_FinalStgProfilingMassage
       );
 
    @HsC_minusO_flags # NOTE: used for *both* -O and -O2 (some conditional bits)
     = (
+       '-ffoldr-build-on',
+
         '-fdo-eta-reduction',
+       '-fdo-lambda-eta-expansion',
+       '-fcase-of-case',
+       '-fcase-merge',
+       '-flet-to-case',
+       $Oopt_PedanticBottoms,
 
        # initial simplify: mk specialiser happy: minimum effort please
+
        '-fsimplify',
          '[', 
-         $Oopt_FB_Support,
-         '-fkeep-spec-pragma-ids',     # required before specialisation
-
-# I don't understand why we want -fessential-unfoldings-only here
-# If we have it, the following nasty thing happens:
-#      f  = E
-#      g* = f
-#      ...g...
-# where "*" means exported.
-# In the essential-unfoldings pass we still substitute f for g
-# but we don't substitute E for f first.  So we get
-#      f  = E
-#      g* = f
-#      ...f...
-# The g=f will get reverse-substituted later, but it's untidy. --SLPJ
-#
-# SDM: Here's why it's necessary.
-#
-#   If we unfold in the first pass before the specialiser is run
-#   we miss opportunities for specialisation because eg. wrappers
-#   have been inlined for specialisable functions.  
-#
-#   This shows up in PrelArr.lhs - the specialised instance for newArray 
-#   calls the generic rangeSize, because rangeSize is strict and is
-#   replaced by its wrapper by the simplifier.
-
-         '-fessential-unfoldings-only',
-         '-fsimpl-uf-use-threshold0',
-
-         # See remark re: cloning in defn of minusnotO
-         '-fclone-binds',
-
-         '-fdo-case-elim',
-         '-fmax-simplifier-iterations1',
-         $Oopt_PedanticBottoms,
+               '-finline-phase0',      # Don't inline anything till full laziness has bitten
+                                       # In particular, inlining wrappers inhibits floating
+                                       # e.g. ...(case f x of ...)...
+                                       #  ==> ...(case (case x of I# x# -> fw x#) of ...)...
+                                       #  ==> ...(case x of I# x# -> case fw x# of ...)...
+                                       # and now the redex (f x) isn't floatable any more
+               '-fmax-simplifier-iterations2',
          ']',
 
-       ($Oopt_DoSpecialise) ? (
-         $Oopt_DoSpecialise,
-       ) : (),
+       # Specialisation is best done before full laziness
+       # so that overloaded functions have all their dictionary lambdas manifest
+       ($Oopt_DoSpecialise) ? ( $Oopt_DoSpecialise, ) : (),
+       '-ffull-laziness',
+       '-ffloat-inwards',
 
-       '-fsimplify',           # need dependency anal after specialiser ...
-         '[',                  # need tossing before calc-inlinings ...
-         $Oopt_FB_Support,
-         '-ffloat-lets-exposing-whnf',
-         '-ffloat-primops-ok',
-         '-fcase-of-case',
-         '-fdo-case-elim',
-         '-fcase-merge',
-#        '-fdo-eta-reduction',
-         '-fdo-lambda-eta-expansion',
-         '-freuse-con',
-         $Oopt_PedanticBottoms,
-         $Oopt_MonadEtaExpansion,
-         $Oopt_MaxSimplifierIterations,
-         $Oopt_ShowSimplifierProgress,
-         #
-         # The presence of -fclone-binds is *crucial* here as
-         # -ffull-laziness (which we're about to do next) floats
-         # bindings outwards, so we better make sure that this
-         # doesn't result in the floating out of bindings
-         # with identical uniques, i.e., -ffull-laziness needs
-         # to be preceeded by a simplifier pass with -fclone-binds
-         # set.
-          '-fclone-binds',
-         ']',
+#      '-fsimplify',
+#        '[', 
+#              # Run the simplifier before specialising, so that overloaded functions
+#              # look like             f = \d -> ...
+#              # (Full laziness may lift out something hiding the \d
+#              '-finline-phase1',
+#              '-fmax-simplifier-iterations1',
+#        ']',
 
-#      ($Oopt_FoldrBuildWW) ? (
-#              '-ffoldr-build-ww-anal',
-#              '-ffoldr-build-worker-wrapper',
-#              '-fsimplify', 
-#                '[', 
-#                $Oopt_FB_Support,
-#                '-ffloat-lets-exposing-whnf',
-#                '-ffloat-primops-ok',
-#                '-fcase-of-case',
-#                '-fdo-case-elim',
-#                '-fcase-merge',
-#                '-fdo-eta-reduction',
-#                '-fdo-lambda-eta-expansion',
-#                '-freuse-con',
-#                $Oopt_PedanticBottoms,
-#                $Oopt_MonadEtaExpansion,
-#                $Oopt_MaxSimplifierIterations,
-#                $Oopt_ShowSimplifierProgress,
-#                ']',
-#       ) : (),
 
-       # this pass-ordering sequence was agreed by Simon and Andr\'e
-       # (WDP 94/07, 94/11).
-       '-ffull-laziness',
-
-       ($Oopt_FoldrBuild) ? (
-         '-ffoldr-build-on',           # desugar list comprehensions for foldr/build
-
-         '-fsimplify', 
-           '[', 
-           '-fignore-inline-pragma',   # **** NB!
-           '-fdo-foldr-build',         # NB
-           $Oopt_FB_Support,
-           '-ffloat-lets-exposing-whnf',
-           '-ffloat-primops-ok',
-           '-fcase-of-case',
-           '-fdo-case-elim',
-           '-fcase-merge',
-#          '-fdo-eta-reduction',
-           '-fdo-lambda-eta-expansion',        # After full laziness
-           '-freuse-con',
-           $Oopt_PedanticBottoms,
-           $Oopt_MonadEtaExpansion,
-           $Oopt_MaxSimplifierIterations,
-           $Oopt_ShowSimplifierProgress,
-           ']',
-       ) : (),
+       '-fsimplify',
+         '[', 
+               '-finline-phase1',
+               # Want to run with inline phase 1 after the specialiser to give
+               # maximum chance for fusion to work before we inline build/augment
+               # in phase 2.  This made a difference in 'ansi' where an overloaded
+               # function wasn't inlined till too late.
+               $Oopt_MaxSimplifierIterations,  
+         ']',
 
-       '-ffloat-inwards',
+        $Oopt_UsageSPInf, # infer usage information here in case we need it later.
+                          # (add more of these where you need them --KSW 1999-04)
 
        '-fsimplify',
          '[', 
-         $Oopt_FB_Support,
-         '-ffloat-lets-exposing-whnf',
-         '-ffloat-primops-ok',
-         '-fcase-of-case',
-         '-fdo-case-elim',
-         '-fcase-merge',
-         '-fdo-eta-reduction',
-         '-fdo-lambda-eta-expansion',
-         '-freuse-con',
-         ($Oopt_FoldrBuildInline),
-                       # you need to inline foldr and build
-         ($Oopt_FoldrBuild) ? ('-fdo-foldr-build') : (), 
-                       # but do reductions if you see them!
-         $Oopt_PedanticBottoms,
-         $Oopt_MonadEtaExpansion,
-         $Oopt_MaxSimplifierIterations,
-         $Oopt_ShowSimplifierProgress,
+               # Need inline-phase2 here so that build/augment get 
+               # inlined.  I found that spectral/hartel/genfft lost some useful
+               # strictness in the function sumcode' if augment is not inlined
+               # before strictness analysis runs
+
+               '-finline-phase2',
+               $Oopt_MaxSimplifierIterations,  
          ']',
 
+
        '-fstrictness',
+       '-fcpr-analyse',
        '-fworker-wrapper',
 
        '-fsimplify',
          '[', 
-         $Oopt_FB_Support,
-         '-ffloat-lets-exposing-whnf',
-         '-ffloat-primops-ok',
-         '-fcase-of-case',
-         '-fdo-case-elim',
-         '-fcase-merge',
-#        '-fdo-eta-reduction',
-         '-fdo-lambda-eta-expansion',
-         '-freuse-con',
-         '-flet-to-case',              # Aha! Only done after strictness analysis
-         $Oopt_PedanticBottoms,
-         $Oopt_MonadEtaExpansion,
-         $Oopt_MaxSimplifierIterations,
-         $Oopt_ShowSimplifierProgress,
+               $Oopt_MaxSimplifierIterations,  
+               # No -finline-phase: allow all Ids to be inlined now
          ']',
 
+       '-fcse',        # CSE must immediately follow a simplification pass, because it relies
+                       # on the no-shadowing invariant.  See comments at the top of CSE.lhs
+                
+       '-ffull-laziness',      # nofib/spectral/hartel/wang doubles in speed if you
+                               # do full laziness late in the day.  It only happens
+                               # after fusion and other stuff, so the early pass doesn't
+                               # catch it.  For the record, the redex is 
+                               #       f_el22 (f_el21 r_midblock)
        '-ffloat-inwards',
 
 # Case-liberation for -O2.  This should be after
@@ -910,38 +787,20 @@ sub setupOptimiseFlags {
 
 #      ( ($OptLevel != 2)
 #        ? ''
-#      : "-fliberate-case -fsimplify [ $Oopt_FB_Support -ffloat-lets-exposing-whnf -ffloat-primops-ok -fcase-of-case -fdo-case-elim -fcase-merge -fdo-eta-reduction -fdo-lambda-eta-expansion -freuse-con -flet-to-case $Oopt_PedanticBottoms $Oopt_MonadEtaExpansion $Oopt_MaxSimplifierIterations $Oopt_ShowSimplifierProgress ]" ),
+#      : "-fliberate-case -fsimplify [ $Oopt_FB_Support -ffloat-lets-exposing-whnf -ffloat-primops-ok -fcase-of-case -fdo-case-elim -fcase-merge -fdo-lambda-eta-expansion -freuse-con -flet-to-case $Oopt_PedanticBottoms $Oopt_MaxSimplifierIterations $Oopt_ShowSimplifierProgress ]" ),
 
 # Final clean-up simplification:
 
        '-fsimplify',
          '[', 
-         $Oopt_FB_Support,
-         '-ffloat-lets-exposing-whnf',
-         '-ffloat-primops-ok',
-         '-fcase-of-case',
-         '-fdo-case-elim',
-         '-fcase-merge',
-#        '-fdo-eta-reduction',
-         '-fdo-lambda-eta-expansion',
-         '-freuse-con',
-         '-flet-to-case',
-         '-fignore-inline-pragma',     # **** NB!
-         $Oopt_FoldrBuildInline,       
-         ($Oopt_FoldrBuild) ? ('-fdo-foldr-build') : (), 
-                       # but still do reductions if you see them!
-         $Oopt_PedanticBottoms,
-         $Oopt_MonadEtaExpansion,
-         $Oopt_MaxSimplifierIterations,
-         $Oopt_ShowSimplifierProgress,
+               $Oopt_MaxSimplifierIterations,  
+               # No -finline-phase: allow all Ids to be inlined now
          ']',
 
       #        '-fstatic-args',
 
-#LATER:        '-fcalc-inlinings2', -- pointless for 2.01
-
       # stg2stg passes
-       '-flambda-lift',
+#      '-flambda-lift',
        $Oopt_FinalStgProfilingMassage,
        $Oopt_StgStats,
 
@@ -996,16 +855,13 @@ if ( $OptLevel <= 0 ) {
 %************************************************************************
 
 Sort out @$BuildTag@, @$PROFing@, @$PARing@,
-@$GRANing@, @$TICKYing@:
+@$GRANing@, @$TICKYing@, @UNREGing@:
 \begin{code}
 sub setupBuildFlags {
 
 
    # PROFILING stuff after argv mangling:
    if ( ! $PROFing ) {
-     # warn about any scc exprs found (in case scc used as identifier)
-     push(@HsP_flags, '-W');
-
      # add -auto sccs even if not profiling !
      push(@HsC_flags, $UNPROFscc_auto) if $UNPROFscc_auto;
 
@@ -1018,8 +874,6 @@ sub setupBuildFlags {
 
       # Ignore user sccs when auto annotating, but warn when doing so.
       $PROFignore_scc = '-W' if $PROFauto; 
-
-      push(@HsP_flags, (($PROFignore_scc) ? $PROFignore_scc : '-S'));
   }
   #if ( $BuildTag ne '' ) {
   #    local($b) = $BuildDescr{$BuildTag};
@@ -1053,8 +907,12 @@ sub setupBuildFlags {
 
   } elsif ( $TICKYing eq 't' ) {
       $BuildTag = '_t';
-  }
 
+  } elsif ( $UNREGing eq 'u' ) {
+      if ($GhcWithRegisterised eq 'YES') {
+        $BuildTag = '_u';
+      }
+  }
 \end{code}
 
 After the sanity checks, add flags to the necessary parts of the driver pipeline:
@@ -1222,6 +1080,7 @@ sub setupLinkOpts {
           ,'-u', "${uscore}PrelPack_unpackCString_closure"
           ,'-u', "${uscore}PrelException_stackOverflow_closure"
           ,'-u', "${uscore}PrelException_heapOverflow_closure"
+          ,'-u', "${uscore}PrelException_NonTermination_static_closure"
        ));
   if (!$NoHaskellMain) {
    unshift (@Ld_flags,'-u', "${uscore}PrelMain_mainIO_closure");
@@ -1277,7 +1136,10 @@ sub setupSyslibs {
   # to implement the itimers, since cygwin.dll does not
   # support it. Only reqd. for `ways' that use itimers.
   #
-  push(@SysLibrary, '-lwinmm') if $TargetPlatform eq 'i386-unknown-cygwin32';
+  push(@SysLibrary, '-lwinmm')   if ($TargetPlatform =~ /-(mingw32|cygwin32)$/);
+   # Note: currently only tested with mingw, may cause conflicts when linking
+   #       with libcygwin.a
+  push(@SysLibrary, '-lwsock32') if ($TargetPlatform =~ /-(mingw32|cygwin32)$/);
 
   # Push the pvm libraries
   if ($BuildTag eq '_mp') {
@@ -1361,8 +1223,7 @@ if ($#Input_file < 0 && $#Link_file < 0) {
 
 Tell the world who we are, if they asked.
 \begin{code}
-print STDERR "${ProjectName}, version ${ProjectVersion}, patchlevel ${ProjectPatchLevel}\n"
-    if $Verbose;
+print STDERR "${ProjectName}, version ${ProjectVersion}\n" if $Verbose;
 \end{code}
 
 %************************************************************************
@@ -1600,13 +1461,15 @@ Now the Haskell compiler, C compiler, and assembler
     }
 
     if (-f $hsc_out_c_stub) {
-       &run_something("cp $hsc_out_c_stub $ofile_c_stub_target", 'Copy foreign export C stubs');
+       &run_something("rm -f $ofile_c_stub_target && echo '#include \"${ofile_h_stub_target}\"' > $ofile_c_stub_target && cat $hsc_out_c_stub >> $ofile_c_stub_target", 'Copy foreign export C stubs');
        local ($hsc_out_s_stub);
        local ($hsc_out_o_stub);
        ($ofile_s_stub_target = $ofile_c_stub_target) =~ s/\.(.*)$/\.s/;
        ($ofile_o_stub_target = $ofile_c_stub_target) =~ s/\.(.*)$/\.o/;
-       &runGcc    (0, $ofile_c_stub_target, $ofile_s_stub_target);
-        &runAs     ($ofile_o_stub_target, $ofile_s_stub_target);
+       if ($do_cc) {
+         &runGcc    (0, $ofile_c_stub_target, $ofile_s_stub_target);
+          &runAs     ($ofile_o_stub_target, $ofile_s_stub_target);
+       }
        #
        # Bring the C stub protos into scope when compiling the .hc file.
        #
@@ -1841,11 +1704,9 @@ sub runHscAndProcessInterfaces {
 sub runHsc {
     local($ifile_root, $hsc_out, $hsc_hi, $hsc_out_c_stub, $hsc_out_h_stub, $going_interactive) = @_;
 
-    # prepend comma to HsP flags (so hsc can tell them apart...)
-    foreach $a ( @HsP_flags ) { $a = ",$a" unless $a =~ /^,/; }
-
     &makeHiMap() unless $HiMapDone;
-    push(@HsC_flags, "-himap=$HiIncludeString");
+    push(@HsC_flags, "\"-himap=$HiIncludeString\"");
+    push(@HsC_flags, "\"-himap-sep=${SplitMarker}\"");
 
     # here, we may produce .hc/.s and/or .hi files
     local($output) = '';
@@ -1872,7 +1733,7 @@ sub runHsc {
        # emit nofibbish time/bytes-alloc stats to stderr;
        # see later .stat file post-processing
        print STDERR "warning: both -Rgc-stats and -Rghc-timing used, -Rghc-timing wins." if $CollectingGCstats;
-       push(@HsC_rts_flags, "-s$Tmp_prefix.stat");
+       push(@HsC_rts_flags, "-S$Tmp_prefix.stat");
        push(@Files_to_tidy, "$Tmp_prefix.stat");
     }
 
@@ -1897,13 +1758,13 @@ sub runHsc {
 
       local($to_do_opts) = "$Tmp_prefix.opts";
       open(OPTS, "> $Tmp_prefix.opts") || &tidy_up_and_die(1,"Can't open $Tmp_prefix.opts\n");
-      print OPTS "$dump @HsC_flags $CoreLint $StgLint $Verbose";
+      print OPTS "$dump @HsC_flags $CoreLint $USPLint $StgLint $Verbose";
       close(OPTS);
-      $to_do = "$HsC @HsP_flags ,$hscpp_hsc \@$Tmp_prefix.opts $output +RTS @HsC_rts_flags";
+      $to_do = "$HsC $hscpp_hsc \@$Tmp_prefix.opts $output +RTS @HsC_rts_flags";
 
     } else {
 
-      $to_do = "$HsC @HsP_flags ,$hscpp_hsc $dump @HsC_flags $CoreLint $StgLint $Verbose $output +RTS @HsC_rts_flags";
+    $to_do = "$HsC $hscpp_hsc $dump @HsC_flags $CoreLint $USPLint $StgLint $Verbose $output +RTS @HsC_rts_flags";
     }
     &run_something($to_do, 'Haskell compiler');
 
@@ -1930,7 +1791,7 @@ sub makeHiMap {
     
     foreach $d ( @Import_dir ) {
        if ($HiIncludeString) { 
-          $HiIncludeString = "$HiIncludeString:${d}%.${HiSuffix}";
+          $HiIncludeString = "$HiIncludeString${SplitMarker}${d}%.${HiSuffix}";
        } else { 
           $HiIncludeString = "$d%.${HiSuffix}"; 
        }
@@ -1939,7 +1800,7 @@ sub makeHiMap {
 
     foreach $d ( @SysImport_dir ) {
        if ($HiIncludeString) { 
-           $HiIncludeString = "$HiIncludeString:${d}%.${HiSuffix_prelude}";
+           $HiIncludeString = "$HiIncludeString${SplitMarker}${d}%.${HiSuffix_prelude}";
        } else { 
            $HiIncludeString = "${d}%.${HiSuffix_prelude}";
         }
@@ -1954,7 +1815,7 @@ Invoke the 'linker' - either the standard linker or the one used to build
 a (Win32) DLL.
 
 \begin{code}
-sub runLinker()
+sub runLinker
 {
     local($libdirs) = '';
 
@@ -1982,7 +1843,7 @@ sub runLinker()
 
     &prepareWin32DllLink(1);
 
-    local($to_do) = "$lnkr $Verbose @Ld_flags $output @Link_file $TopClosureFile $libdirs @UserLibrary @SysLibrary";
+    local($to_do) = "$lnkr $Verbose @Ld_flags $output @Link_file $libdirs @UserLibrary @SysLibrary";
     &run_something($to_do, 'Linker');
 
     # finally, check the consistency info in the binary
@@ -2027,7 +1888,7 @@ eval 'exec perl -S \$0 \${1+"\$@"}'
   if \$running_under_some_shell;
 # =!=!=!=!=!=!=!=!=!=!=!
 # This script is automatically generated: DO NOT EDIT!!!
-# Generated by Glasgow Haskell, version ${ProjectVersion} ${ProjectPatchLevel}
+# Generated by Glasgow Haskell, version ${ProjectVersion}
 #
 \$pvm_executable      = '$pvm_executable';
 \$pvm_executable_base = '$pvm_executable_base';
@@ -2077,7 +1938,7 @@ EOSCRIPT2
     }
 }
 
-sub createWin32DLL()
+sub createWin32DLL
 {
     local ($libdirs);
 
@@ -2121,7 +1982,7 @@ sub createWin32DLL()
     &run_something($to_do, 'DLL creator');
 }
 
-sub prepareWin32DllLink ()
+sub prepareWin32DllLink
 {
     local($linking_main) = @_;
 
@@ -2141,10 +2002,10 @@ sub prepareWin32DllLink ()
          foreach $a ( @UserLibrary ) {
            $a = "${a}_imp" if ($a =~ /^-lHS/);
          }
-         push(@Link_file, ( $INSTALLING ) ? "$InstLibDirGhc/Main.o"
-                                         : "$TopPwd/$CURRENT_DIR/$GHC_RUNTIME_DIR/Main.o") if $linking_main;
-         push(@Link_file, ( $INSTALLING ) ? "$InstLibDirGhc/PrelMain.o"
-                                         : "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/PrelMain.o") if $linking_main;
+         push(@Link_file, ( $INSTALLING ) ? "$InstLibDirGhc/Main.dll_o"
+                                         : "$TopPwd/$CURRENT_DIR/$GHC_RUNTIME_DIR/Main.dll_o") if $linking_main;
+         push(@Link_file, ( $INSTALLING ) ? "$InstLibDirGhc/PrelMain.dll_o"
+                                         : "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/std/PrelMain.dll_o") if $linking_main;
        }
        push(@Ld_flags,  "-mno-cygwin");
     }
@@ -2633,7 +2494,7 @@ sub add_syslib {
               ? "$InstLibDirGhc"
               : "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/misc/cbits"
          )
-       , 'exts' # Syslib dependencies
+       , 'exts concurrent' # Syslib dependencies
        , ''     # extra ghc opts
        , ''     # extra cc opts
        , ( $TargetPlatform =~ /-solaris2$/  ? '-lnsl -lsocket' : '')
@@ -2802,7 +2663,7 @@ sub check_for_source_options {
     open(FILE,$file) || return(1); # No big loss
     
     while (<FILE>) {
-       if ( /^${comment_start} OPTIONS (.*)${comment_end}$/ ) {
+       if ( /^${comment_start} OPTIONS (.*)${comment_end}/ ) {
            # add the options found at the back of the command line.
           local(@entries) = split(/\s+/,$1);
           print STDERR "Found OPTIONS " . join(' ',@entries) . " in $file\n" if $Verbose;
@@ -2908,7 +2769,7 @@ arg: while($_ = $Args[0]) {
     if (/^-\?$/ || /^--?help$/) { print $LongUsage; exit $Status; }
 
     #-----------version ----------------------------------------------------
-    /^--version$/   && do { print STDERR "${ProjectName}, version ${ProjectVersion}, patchlevel ${ProjectPatchLevel}\n"; exit $Status; };
+    /^--version$/   && do { print STDERR "${ProjectName}, version ${ProjectVersion}\n"; exit $Status; };
 
     #---------- verbosity and such -----------------------------------------
     /^-v$/         && do { $Verbose = '-v'; $Time = 'time'; next arg; };
@@ -3107,8 +2968,16 @@ arg: while($_ = $Args[0]) {
                            print STDERR "WARNING: import paths cleared by `-i'\n";
                            next arg; };
 
-    /^-i(.*)/      && do { local(@new_items)
-                             = split( /:/, &grab_arg_arg(*Args,'-i', $1));
+    /^-i(.*)/      && do { local(@new_items);
+                           local($arg) = $1;
+    
+                           #
+                           if ( $arg =~ /;/ ) {
+                              $SplitMarker=";";
+                              @new_items = split( /;/, &grab_arg_arg(*Args,'-i', $arg));
+                           } else {
+                              @new_items = split( /:/, &grab_arg_arg(*Args,'-i', $arg));
+                           }
                            unshift(@Import_dir, @new_items);
                            next arg; };
 
@@ -3141,7 +3010,6 @@ arg: while($_ = $Args[0]) {
     /^-optP(.*)$/   && do { push(@HsCpp_flags,      $1); next arg; };
     /^-optCrts(.*)$/&& do { push(@HsC_rts_flags,    $1); next arg; };
     /^-optC(.*)$/   && do { push(@HsC_flags,        $1); next arg; };
-    /^-optp(.*)$/   && do { push(@HsP_flags,        $1); next arg; };
     /^-optcpp(.*)$/ && do { push(@Cpp_define,       $1); $Only_preprocess_hc = ($1 eq "-E"); next arg; };
     /^-optc(.*)$/   && do { push(@CcBoth_flags,     $1); next arg; };
     /^-opta(.*)$/   && do { push(@As_flags,         $1); next arg; };
@@ -3195,13 +3063,16 @@ arg: while($_ = $Args[0]) {
                        }
                        next arg; };
 
+    /^-unreg$/             && do { $UNREGing = 'u'; next arg; };
+    /^-funregisterised$/    && do { push(@HsC_flags, $_); next arg; };
     /^-fno-asm-mangling$/   && do { $DoAsmMangling = 0; next arg; };
 
     /^-fallow-overlapping-instances$/ && do { push(@HsC_flags, $_); next arg; };
     /^-fallow-undecidable-instances$/ && do { push(@HsC_flags, $_); next arg; };
+    /^-fhistory-size.*$/             && do { push(@HsC_flags, $_); next arg; };
+    /^-fdicts-strict$/                       && do { push(@HsC_flags, $_); next arg; };
     /^-fglasgow-exts$/
                && do { push(@HsC_flags, $_);
-                       push(@HsP_flags, '-N');
 
                        # -fglasgow-exts implies -syslib exts
                        &add_syslib('exts');
@@ -3213,31 +3084,21 @@ arg: while($_ = $Args[0]) {
     /^-fno-speciali[sz]e$/
                && do { $Oopt_DoSpecialise = ''; next arg; };
 
+    /^-fusagesp$/
+                && do {  $Oopt_UsageSPInf = '-fusagesp';
+                         push (@HsC_flags, '-fusagesp-on'); next arg; };
+
     /^-fcompiling-prelude$/ && do { $CompilingPrelude=1; push(@HsC_flags, $_); next arg; };
 
 # Now the foldr/build options, which are *on* by default (for -O).
 
     /^-ffoldr-build$/
                    && do { $Oopt_FoldrBuild = 1; 
-                           $Oopt_FB_Support = '-fdo-arity-expand';
                            #print "Yes F/B\n";
                            next arg; };
 
     /^-fno-foldr-build$/
                    && do { $Oopt_FoldrBuild = 0; 
-                           $Oopt_FB_Support = ''; 
-                           next arg; };
-
-    /^-fno-foldr-build-rule$/
-                   && do { $Oopt_FoldrBuild = 0; 
-                           next arg; };
-
-    /^-fno-enable-tech$/
-                   && do { $Oopt_FB_Support = ''; 
-                           next arg; };
-
-    /^-fno-snapback-to-append$/
-                   && do { $Oopt_FoldrBuildInline .= ' -fdo-not-fold-back-append '; 
                            next arg; };
 
     # --------------- Renamer -------------
@@ -3269,9 +3130,6 @@ arg: while($_ = $Args[0]) {
     /^-fno-pre-inlining$/
                    && do { push(@HsC_flags, $_); next arg };
 
-    /^-fdo-monad-eta-expansion$/
-                   && do { $Oopt_MonadEtaExpansion = $_; next arg; };
-
     /^-fno-let-from-(case|app|strict-let)$/ # experimental, really (WDP 95/10)
                    && do { push(@HsC_flags, $_); next arg; };
 
@@ -3320,6 +3178,9 @@ arg: while($_ = $Args[0]) {
     # -d(no-)core-lint is done this way so it is turn-off-able.
     /^-dcore-lint/       && do { $CoreLint = '-dcore-lint'; next arg; };
     /^-dno-core-lint/    && do { $CoreLint = '';           next arg; };
+    # Ditto for USP lint
+    /^-dusagesp-lint/    && do { $USPLint = '-dusagesp-lint'; next arg; };
+    /^-dno-usagesp-lint/ && do { $USPLint = '';               next arg; };
     # Ditto for STG lint
     /^-dstg-lint/       && do { $StgLint = '-dstg-lint'; next arg; };
     /^-dno-stg-lint/    && do { $StgLint = '';           next arg; };