[project @ 2000-02-25 14:55:31 by panne]
[ghc-hetmet.git] / ghc / driver / ghc.lprl
index 5e93214..e3720e3 100644 (file)
@@ -98,7 +98,7 @@ INSTALLING
 
 HOSTPLATFORM TARGETPLATFORM
 
-ProjectName ProjectVersion ProjectVersionInt ProjectPatchLevel 
+ProjectName ProjectVersion ProjectVersionInt
 
 HscMajorVersion HscMinorVersion CcMajorVersion CcMinorVersion
 
@@ -108,11 +108,11 @@ 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
 
@@ -272,6 +272,8 @@ warnings that you get all the time are
        
        -fwarn-overlapping-patterns
        -fwarn-missing-methods
+       -fwarn-missing-fields
+       -fwarn-deprecations
        -fwarn-duplicate-exports
 
 these are turned off by -Wnot.
@@ -279,6 +281,8 @@ these are turned off by -Wnot.
 \begin{code}
 @StandardWarnings = ('-fwarn-overlapping-patterns', 
                     '-fwarn-missing-methods',
+                    '-fwarn-missing-fields',
+                    '-fwarn-deprecations',
                     '-fwarn-duplicate-exports');
 @MinusWOpts              = (@StandardWarnings, 
                     '-fwarn-unused-binds',
@@ -303,6 +307,7 @@ $BuildTag   = ''; # default is sequential build w/ Appel-style GC
                   '_p',    "Profiling",
                   '_t',    "Ticky-ticky Profiling",
                   '_u',    "Unregisterised",
+                  '_s',    "SMP",
                   '_mp',   "Parallel",
                   '_mg',   "Gransim",
                   # system ways end
@@ -350,8 +355,9 @@ $BuildTag   = ''; # default is sequential build w/ Appel-style GC
        '_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");
+       '_s',  "-fsmp -optc-pthread -optl-pthread -optc-DSMP",
+       '_mp', "-fparallel -D__PARALLEL_HASKELL__ -optc-DPAR",
+       '_mg', "-fgransim -D__GRANSIM__ -optc-DGRAN");
 
 # where to look for interface files (system hi's, i.e., prelude and syslibs)
 @SysImport_dir = ( $INSTALLING )
@@ -367,7 +373,8 @@ $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__"
@@ -383,15 +390,10 @@ $Haskell1Version = 5; # i.e., Haskell 1.4
                      )
                  );
 
-$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 = ();
 
@@ -425,6 +427,9 @@ $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
 
@@ -568,7 +573,6 @@ Now slurp through the arguments.
 if (  $Status == 0 && $Only_generate_deps ) {
 
     push (@MkDependHS_flags, "-o$Osuffix") if $Osuffix;
-    push (@MkDependHS_flags, "-s$BuildTag") if $BuildTag;
     # They're not (currently) needed, but we need to quote any -#include options
     foreach (@Cmd_opts) {
        s/-#include.*$/'$&'/g;
@@ -689,7 +693,6 @@ sub setupOptimiseFlags {
     = (        
        '-fsimplify',
          '[', 
-               '-finline-phase2',
                $Oopt_MaxSimplifierIterations,
          ']',
 
@@ -718,6 +721,10 @@ sub setupOptimiseFlags {
                                        #  ==> ...(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
+
+               '-fno-rules',           # Similarly, don't apply any rules until after full laziness
+                                       # Notably, list fusion can prevent floating.
+
                '-fmax-simplifier-iterations2',
          ']',
 
@@ -772,14 +779,23 @@ sub setupOptimiseFlags {
                # 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)
+
+       # We want CSE to follow the final full-laziness pass, because it may
+       # succeed in commoning up things floated out by full laziness.
+       #
+       # CSE must immediately follow a simplification pass, because it relies
+       # on the no-shadowing invariant.  See comments at the top of CSE.lhs
+       # So it must NOT follow float-inwards, which can give rise to shadowing,
+       # even if its input doesn't have shadows.  Hence putting it between
+       # the two passes.
+       '-fcse',        
+                       
+
        '-ffloat-inwards',
 
 # Case-liberation for -O2.  This should be after
@@ -789,6 +805,8 @@ sub setupOptimiseFlags {
 #        ? ''
 #      : "-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 ]" ),
 
+#      '-fliberate-case',
+
 # Final clean-up simplification:
 
        '-fsimplify',
@@ -859,7 +877,6 @@ Sort out @$BuildTag@, @$PROFing@, @$PARing@,
 \begin{code}
 sub setupBuildFlags {
 
-
    # PROFILING stuff after argv mangling:
    if ( ! $PROFing ) {
      # add -auto sccs even if not profiling !
@@ -901,6 +918,9 @@ sub setupBuildFlags {
          exit(1);
       }
 
+  } elsif ( $SMPing eq 's') {
+      $BuildTag = '_s';
+
   } elsif ( $GRANing eq 'g' ) {
       if ($TICKYing eq 't') { print STDERR "$Pgm: Can't mix -gransim with -ticky.\n"; exit 1; }
       $BuildTag = '_mg';
@@ -1059,8 +1079,8 @@ sub setupLinkOpts {
   unshift(@Ld_flags,
          ( '-u', "${uscore}PrelBase_Izh_static_info"
           ,'-u', "${uscore}PrelBase_Czh_static_info"
-          ,'-u', "${uscore}PrelBase_Fzh_static_info"
-          ,'-u', "${uscore}PrelBase_Dzh_static_info"
+          ,'-u', "${uscore}PrelFloat_Fzh_static_info"
+          ,'-u', "${uscore}PrelFloat_Dzh_static_info"
           ,'-u', "${uscore}PrelAddr_Azh_static_info"
           ,'-u', "${uscore}PrelAddr_Wzh_static_info"
           ,'-u', "${uscore}PrelAddr_I64zh_static_info"
@@ -1068,8 +1088,8 @@ sub setupLinkOpts {
           ,'-u', "${uscore}PrelStable_StablePtr_static_info"
          ,'-u', "${uscore}PrelBase_Izh_con_info"
           ,'-u', "${uscore}PrelBase_Czh_con_info"
-          ,'-u', "${uscore}PrelBase_Fzh_con_info"
-          ,'-u', "${uscore}PrelBase_Dzh_con_info"
+          ,'-u', "${uscore}PrelFloat_Fzh_con_info"
+          ,'-u', "${uscore}PrelFloat_Dzh_con_info"
           ,'-u', "${uscore}PrelAddr_Azh_con_info"
           ,'-u', "${uscore}PrelAddr_Wzh_con_info"
           ,'-u', "${uscore}PrelAddr_I64zh_con_info"
@@ -1080,16 +1100,22 @@ 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");
   }
+  if ($PROFing ne '') {
+   unshift (@Ld_flags,'-u', "${uscore}_regPrelude");
+  }
   if ($TargetPlatform =~ /^powerpc-|^rs6000-/) {
     # sometimes we have lots of toc entries...
     #  unshift(@Ld_flags, ('-Xlinker -bbigtoc -Xlinker -bnoquiet')); 
     unshift(@Ld_flags, ('-Xlinker -bbigtoc')); 
   }
-
+  if ($TargetPlatform =~ /^hppa/) {
+    unshift(@Ld_flags, ('-Xlinker +vnocompatwarnings'));
+  }
 
 } # end of setupLinkOpts
 
@@ -1135,7 +1161,7 @@ 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)$/);
@@ -1222,8 +1248,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}
 
 %************************************************************************
@@ -1461,13 +1486,17 @@ 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);
+       ($ofile_o_stub_target = $ofile_c_stub_target) =~ s/\.(.*)$//;
+
+        $ofile_o_stub_target = &osuf_ify($ofile_o_stub_target, "o");
+       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.
        #
@@ -1703,7 +1732,8 @@ sub runHsc {
     local($ifile_root, $hsc_out, $hsc_hi, $hsc_out_c_stub, $hsc_out_h_stub, $going_interactive) = @_;
 
     &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) = '';
@@ -1730,7 +1760,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");
     }
 
@@ -1788,7 +1818,7 @@ sub makeHiMap {
     
     foreach $d ( @Import_dir ) {
        if ($HiIncludeString) { 
-          $HiIncludeString = "$HiIncludeString:${d}%.${HiSuffix}";
+          $HiIncludeString = "$HiIncludeString${SplitMarker}${d}%.${HiSuffix}";
        } else { 
           $HiIncludeString = "$d%.${HiSuffix}"; 
        }
@@ -1797,7 +1827,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}";
         }
@@ -1812,7 +1842,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) = '';
 
@@ -1840,7 +1870,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
@@ -1885,7 +1915,8 @@ 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}
+# ngoqvam choHbogh vaj' vIHoHnISbej !!!!
 #
 \$pvm_executable      = '$pvm_executable';
 \$pvm_executable_base = '$pvm_executable_base';
@@ -1917,7 +1948,9 @@ args: while ($a = shift(@ARGV)) {
     }
     if ( $a eq '-d' && $in_RTS_args ) {
        $debug = '-';
-    } elsif ( $a =~ /^-N(\d+)/ && $in_RTS_args ) {
+    } elsif ( $a =~ /^-qN(\d+)/ && $in_RTS_args ) {
+       $nprocessors = $1;
+    } elsif ( $a =~ /^-qp(\d+)/ && $in_RTS_args ) {
        $nprocessors = $1;
     } else {
        push(@nonPVM_args, $a);
@@ -1935,7 +1968,7 @@ EOSCRIPT2
     }
 }
 
-sub createWin32DLL()
+sub createWin32DLL
 {
     local ($libdirs);
 
@@ -1979,7 +2012,7 @@ sub createWin32DLL()
     &run_something($to_do, 'DLL creator');
 }
 
-sub prepareWin32DllLink ()
+sub prepareWin32DllLink
 {
     local($linking_main) = @_;
 
@@ -1999,10 +2032,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");
     }
@@ -2143,7 +2176,7 @@ sub runAs {
     # need to add the -I flags in case the file is going through cpp (.S files)
     local($includes) = '-I' . join(' -I', @Include_dir);
 
-    if ( ! $SplitObjFiles ) {
+   if ( ! $SplitObjFiles || $ifile_root =~ /_stub\.s$/ ) {
        local($to_do)  = "$asmblr -o $as_out -c @As_flags $includes $cc_as";
        push(@Files_to_tidy, $as_out );
        &run_something($to_do, 'Unix assembler');
@@ -2235,12 +2268,24 @@ sub run_something {
        close(CCOUT) || &tidy_up_and_die(1,"$Pgm: failed closing `$Tmp_prefix.ccout'\n");
     }
 
+    local($signal_num)  = $? & 127;
+    local($dumped_core) = $? & 128;
+
+    if ($signal_num != 0) {
+       print STDERR "$tidy_name received signal $signal_num";
+       if ($dumped_core != 0) {
+               print STDERR " (core dumped)";
+       }
+       print STDERR "\n";
+    }
+
     if ($return_val != 0) {
         if ($Using_dump_file) {
            print STDERR "Compilation Errors dumped in $Specific_dump_file\n";
        }
        &tidy_up_and_die($return_val, '');
     }
+
     $Using_dump_file = 0;
 }
 \end{code}
@@ -2457,104 +2502,152 @@ sub add_syslib {
 
     # Lifting this out of this sub brings it out of scope - why??
     %Supported_syslibs =
-     ( exts,
+     ( lang,
        [  # where to slurp interface files from
          ( $INSTALLING 
-              ? "$InstLibDirGhc/imports/exts"
-              : "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/exts"
+              ? "$InstLibDirGhc/imports/lang"
+              : "$TopPwd/hslibs/lang:$TopPwd/hslibs/lang/monads"
          )
        , # where to find the archive to use when linking
          ( $INSTALLING 
               ? "$InstLibDirGhc"
-              : "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/exts"
+              : "$TopPwd/hslibs/lang"
+         )
+       , # where to find the cbits archive to use when linking
+         ( $INSTALLING 
+              ? "$InstLibDirGhc"
+              : "$TopPwd/hslibs/lang/cbits"
          )
-       , '' # no cbits
        , '' # Syslib dependencies
        , '' # extra ghc opts
        , '' # extra cc opts
        , '' # extra ld opts
        ],
 
-       misc,
+       concurrent,
        [  # where to slurp interface files from
          ( $INSTALLING 
-              ? "$InstLibDirGhc/imports/misc"
-              : "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/misc"
+              ? "$InstLibDirGhc/imports/concurrent"
+              : "$TopPwd/hslibs/concurrent"
          )
        , # where to find the archive to use when linking
          ( $INSTALLING 
               ? "$InstLibDirGhc"
-              : "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/misc"
+              : "$TopPwd/hslibs/concurrent"
          )
-       , # where to find the cbits archive to use when linking
+       , '' # where to find the cbits archive to use when linking
+       , '' # Syslib dependencies
+       , '' # extra ghc opts
+       , '' # extra cc opts
+       , '' # extra ld opts
+       ],
+
+       data,
+       [  # where to slurp interface files from
+         ( $INSTALLING 
+              ? "$InstLibDirGhc/imports/data"
+              : "$TopPwd/hslibs/data:$TopPwd/hslibs/data/edison:$TopPwd/hslibs/data/edison/Assoc:$TopPwd/hslibs/data/edison/Coll:$TopPwd/hslibs/data/edison/Seq"
+         )
+       , # where to find the archive to use when linking
          ( $INSTALLING 
               ? "$InstLibDirGhc"
-              : "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/misc/cbits"
+              : "$TopPwd/hslibs/data"
          )
-       , 'exts' # Syslib dependencies
-       , ''     # extra ghc opts
-       , ''     # extra cc opts
-       , ( $TargetPlatform =~ /-solaris2$/  ? '-lnsl -lsocket' : '')
+       , '' # where to find the cbits archive to use when linking
+       , '' # Syslib dependencies
+       , '' # extra ghc opts
+       , '' # extra cc opts
+       , '' # extra ld opts
        ],
-       hbc,
+
+       net,
        [  # where to slurp interface files from
          ( $INSTALLING 
-              ? "$InstLibDirGhc/imports/hbc"
-              : "$TopPwd/CONTRIB/libraries/hbc/src"
+              ? "$InstLibDirGhc/imports/net"
+              : "$TopPwd/hslibs/net"
          )
        , # where to find the archive to use when linking
          ( $INSTALLING 
               ? "$InstLibDirGhc"
-              : "$TopPwd/CONTRIB/libraries/src/hbc"
+              : "$TopPwd/hslibs/net"
          )
        , # where to find the cbits archive to use when linking
          ( $INSTALLING 
               ? "$InstLibDirGhc"
-              : "$TopPwd/CONTRIB/libraries/hbc/cbits"
+              : "$TopPwd/hslibs/net/cbits"
          )
-       , 'exts' # Syslib dependencies
-       , ''     # extra ghc opts
-       , ''     # extra cc opts
-       , ''
+       , 'lang text' # Syslib dependencies
+       , '' # extra ghc opts
+       , '' # extra cc opts
+       , ( $TargetPlatform =~ /-solaris2$/  ? '-lnsl -lsocket' : '')
        ],
+
        posix,
        [  # where to slurp interface files from
          ( $INSTALLING 
               ? "$InstLibDirGhc/imports/posix"
-              : "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/posix"
+              : "$TopPwd/hslibs/posix"
          )
        , # where to find the archive to use when linking
          ( $INSTALLING 
               ? "$InstLibDirGhc"
-              : "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/posix"
+              : "$TopPwd/hslibs/posix"
          )
        , # where to find the cbits archive to use when linking
          ( $INSTALLING 
               ? "$InstLibDirGhc"
-              : "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/posix/cbits"
+              : "$TopPwd/hslibs/posix/cbits"
          )
-       , 'misc' # Syslib dependencies
+       , 'lang' # Syslib dependencies
        , ''     # extra ghc opts
        , ''     # extra cc opts
        , ''     # extra ld opts
        ],
-       concurrent,
+
+       text,
        [  # where to slurp interface files from
          ( $INSTALLING 
-              ? "$InstLibDirGhc/imports/concurrent"
-              : "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/concurrent"
+              ? "$InstLibDirGhc/imports/text"
+              : "$TopPwd/hslibs/text:$TopPwd/hslibs/text/html:$TopPwd/hslibs/text/haxml"
          )
        , # where to find the archive to use when linking
          ( $INSTALLING 
               ? "$InstLibDirGhc"
-              : "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/concurrent"
+              : "$TopPwd/hslibs/text"
          )
-       , '' # where to find the cbits archive to use when linking
-       , '' # Syslib dependencies
+       , # where to find the cbits archive to use when linking
+         ( $INSTALLING 
+              ? "$InstLibDirGhc"
+              : "$TopPwd/hslibs/text/cbits"
+         )
+       , 'lang' # Syslib dependencies
        , '' # extra ghc opts
        , '' # extra cc opts
        , '' # extra ld opts
        ],
+
+       util,
+       [  # where to slurp interface files from
+         ( $INSTALLING 
+              ? "$InstLibDirGhc/imports/util"
+              : "$TopPwd/hslibs/util"
+         )
+       , # where to find the archive to use when linking
+         ( $INSTALLING 
+              ? "$InstLibDirGhc"
+              : "$TopPwd/hslibs/util"
+         )
+       , # where to find the cbits archive to use when linking
+         ( $INSTALLING 
+              ? "$InstLibDirGhc"
+              : "$TopPwd/hslibs/util/cbits"
+         )
+       , 'lang concurrent' # Syslib dependencies
+       , ''     # extra ghc opts
+       , ''     # extra cc opts
+       , ''     # extra ld opts
+       ],
+
        win32,
        [  # where to slurp interface files from
          ( $INSTALLING 
@@ -2567,11 +2660,12 @@ sub add_syslib {
               : "$TopPwd/hslibs/win32/src"
          )
        , ''
-       , 'exts' # Syslib dependencies
+       , 'lang' # Syslib dependencies
        , ''     # extra ghc opts
        , ''     # extra cc opts
        , '-luser32 -lgdi32'     # extra ld opts
        ],
+
        com,
        [  # where to slurp interface files from
          ( $INSTALLING 
@@ -2584,7 +2678,7 @@ sub add_syslib {
               : "$TopPwd/hdirect/lib"
          )
        , ''
-       , 'exts' # Syslib dependencies
+       , 'lang' # Syslib dependencies
        , ''     # extra ghc opts
        , ''     # extra cc opts
        , '-luser32 -lole32 -loleaut32 -ladvapi32'
@@ -2603,8 +2697,8 @@ sub add_syslib {
     # This check is here to avoid syslib loops from
     # spoiling the party. A side-effect of it is that
     # it disallows multiple mentions of a syslib on a command-line,
-    # explicit *and* implicit ones (i.e., "-syslib exts -syslib misc"
-    # is not equal to "-syslib exts -syslib misc -syslib exts",
+    # explicit *and* implicit ones (i.e., "-syslib lang -syslib misc"
+    # is not equal to "-syslib lang -syslib misc -syslib lang",
     # which it needs to be)
     # 
     # Since our current collection of syslibs don't have any
@@ -2616,12 +2710,13 @@ sub add_syslib {
        
     $Syslibs_added{$syslib} = 1;
 
-    local ($hi_dir, $lib_dir, $lib_cbits_dir,
+    local ($hi_dirs, $lib_dir, $lib_cbits_dir,
           $syslib_deps, $syslib_ghc_opts,
           $syslib_cc_opts, $syslib_ld_opts) = @{ $Supported_syslibs{$syslib} };
 
-
-    unshift(@SysImport_dir, $hi_dir);
+    foreach(split(':',$hi_dirs)) {
+       unshift(@SysImport_dir, $_);
+    }
     push(@SysLibrary_dir, $lib_dir);
     push(@SysLibrary_dir, $lib_cbits_dir) if ( $lib_cbits_dir ne '');
 
@@ -2660,7 +2755,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;
@@ -2730,9 +2825,24 @@ sub saveIntermediate {
   local ($final,$suffix,$tmp)= @_ ;
   local ($to_do);
 
+  local ($new_suffix);
+
   # $final  -- root of where to park ${final}.${suffix}
   # $tmp    -- temporary file where hsc put the intermediate file.
 
+  # HWL: use -odir for .hc and .s files, too
+  if ( $Specific_output_dir ne '' ) {
+    $final = "${Specific_output_dir}/${final}";
+  }    
+  # HWL: use the same suffix as for $Osuffix in generating intermediate file,
+  #      replacing o with hc or s, respectively. 
+  if ( $Osuffix ne '' ) {
+    ($new_suffix = $Osuffix) =~ s/o$/hc/ if $suffix eq "hc";
+    ($new_suffix = $Osuffix) =~ s/o$/s/ if $suffix eq "s";
+    $suffix = $new_suffix;
+    print stderr "HWL says: suffix for intermediate file is $suffix; ${final}.${suffix} overall\n" if $Verbose;
+  }
+
   # Delete the old file
   $to_do = "$Rm ${final}.${suffix}"; &run_something($to_do, "Removing old .${suffix} file");
 
@@ -2766,7 +2876,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; };
@@ -2940,6 +3050,7 @@ arg: while($_ = $Args[0]) {
     /^-gransim$/    && do { $GRANing   = 'g'; &add_syslib('concurrent'); next arg; }; # GranSim
     /^-ticky$/     && do { $TICKYing  = 't'; next arg; }; # ticky-ticky
     /^-parallel$/   && do { $PARing    = 'p'; &add_syslib('concurrent'); next arg; }; # parallel Haskell
+    /^-smp$/        && do { $SMPing    = 's'; &add_syslib('concurrent'); next arg; }; # parallel Haskell
 
     #-------------- "user ways" --------------------------------------------
 
@@ -2965,8 +3076,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; };
 
@@ -3035,6 +3154,7 @@ arg: while($_ = $Args[0]) {
     /^-fticky-ticky$/     && do { push(@HsC_flags,$_); next arg; };
     /^-fgransim$/        && do { push(@HsC_flags,$_); next arg; };
     /^-fparallel$/        && do { push(@HsC_flags,$_); next arg; };
+    /^-fsmp$/             && do { push(@HsC_flags,$_); next arg; };
 
     /^-split-objs$/    && do {
                        if ( $TargetPlatform !~ /^(alpha|hppa1\.1|i386|m68k|mips|powerpc|rs6000|sparc)-/ ) {
@@ -3063,8 +3183,8 @@ arg: while($_ = $Args[0]) {
     /^-fglasgow-exts$/
                && do { push(@HsC_flags, $_);
 
-                       # -fglasgow-exts implies -syslib exts
-                       &add_syslib('exts');
+                       # -fglasgow-exts implies -syslib lang
+                       &add_syslib('lang');
 
                        next arg; };
 
@@ -3106,6 +3226,9 @@ arg: while($_ = $Args[0]) {
     /^-funfolding-.*$/
                    && do { push(@HsC_flags, $_); next arg };
 
+    /^-fliberate-case-.*$/
+                   && do { push(@HsC_flags, $_); next arg };
+
     /^-funfold-casms-in-hi-file$/
                    && do { push(@HsC_flags, $_); next arg };
 
@@ -3206,7 +3329,7 @@ arg: while($_ = $Args[0]) {
        } elsif ($heap_size >= $Specific_heap_size) {
            $Specific_heap_size = $heap_size;
        } else {
-           print STDERR "$Pgm: ignoring heap-size-setting option ($_)...not the largest seen\n";
+           print STDERR "$Pgm: ignoring heap-size-setting option ($_)...not the largest seen\n" if $Verbose;
        }
        next arg; };
 
@@ -3228,7 +3351,7 @@ arg: while($_ = $Args[0]) {
        } elsif ($stk_size >= $Specific_stk_size) {
            $Specific_stk_size = $stk_size;
        } else {
-           print STDERR "$Pgm: ignoring stack-size-setting option ($flag $stk_size)...not the largest seen\n";
+           print STDERR "$Pgm: ignoring stack-size-setting option ($flag $stk_size)...not the largest seen\n" if $Verbose;
        }
        next arg; };