[project @ 1999-10-27 09:45:49 by simonmar]
[ghc-hetmet.git] / ghc / driver / ghc.lprl
index 745f968..2541fe1 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
 
@@ -279,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');
@@ -303,6 +304,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 +352,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',  "-fparallel -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 +370,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 +387,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 +424,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
 
@@ -702,7 +704,6 @@ sub setupOptimiseFlags {
        '-ffoldr-build-on',
 
         '-fdo-eta-reduction',
-       '-fdo-case-elim',
        '-fdo-lambda-eta-expansion',
        '-fcase-of-case',
        '-fcase-merge',
@@ -713,65 +714,58 @@ sub setupOptimiseFlags {
 
        '-fsimplify',
          '[', 
-         '-finline-phase1',            # Don't inline rule Ids till specialisation has bitten
-
-#              APR 99: the stuff in this comment is now
-#              handled by -finline-phase1
-#
-# 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',
-
-         '-fmax-simplifier-iterations2',
+               '-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',
          ']',
 
+       # 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',
+#        '[', 
+#              # 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_UsageSPInf, # infer usage information here in case we need it later.
-                          # (add more of these where you need them --KSW 1999-04)
 
        '-fsimplify',
          '[', 
-               $Oopt_MaxSimplifierIterations,  
-
-               # Still don't inline transformation rule Ids, to give the
-               # rules a good chance to fire
-               '-finline-phase1',
+               '-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,  
          ']',
 
-       '-ffull-laziness',
-
-       '-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',
          '[', 
-               '-finline-phase2',
-               $Oopt_MaxSimplifierIterations,  
+               # 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',
+       '-fcpr-analyse',
        '-fworker-wrapper',
 
        '-fsimplify',
@@ -780,6 +774,14 @@ 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)
        '-ffloat-inwards',
 
 # Case-liberation for -O2.  This should be after
@@ -794,6 +796,7 @@ sub setupOptimiseFlags {
        '-fsimplify',
          '[', 
                $Oopt_MaxSimplifierIterations,  
+               # No -finline-phase: allow all Ids to be inlined now
          ']',
 
       #        '-fstatic-args',
@@ -900,6 +903,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';
@@ -908,7 +914,9 @@ sub setupBuildFlags {
       $BuildTag = '_t';
 
   } elsif ( $UNREGing eq 'u' ) {
-      $BuildTag = '_u';
+      if ($GhcWithRegisterised eq 'YES') {
+        $BuildTag = '_u';
+      }
   }
 \end{code}
 
@@ -1077,6 +1085,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");
@@ -1132,7 +1141,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)$/);
@@ -1219,8 +1228,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}
 
 %************************************************************************
@@ -1458,13 +1466,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.
        #
@@ -1700,7 +1710,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) = '';
@@ -1727,7 +1738,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");
     }
 
@@ -1785,7 +1796,7 @@ sub makeHiMap {
     
     foreach $d ( @Import_dir ) {
        if ($HiIncludeString) { 
-          $HiIncludeString = "$HiIncludeString:${d}%.${HiSuffix}";
+          $HiIncludeString = "$HiIncludeString${SplitMarker}${d}%.${HiSuffix}";
        } else { 
           $HiIncludeString = "$d%.${HiSuffix}"; 
        }
@@ -1794,7 +1805,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}";
         }
@@ -1809,7 +1820,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) = '';
 
@@ -1837,7 +1848,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
@@ -1882,7 +1893,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';
@@ -1932,7 +1943,7 @@ EOSCRIPT2
     }
 }
 
-sub createWin32DLL()
+sub createWin32DLL
 {
     local ($libdirs);
 
@@ -1976,7 +1987,7 @@ sub createWin32DLL()
     &run_something($to_do, 'DLL creator');
 }
 
-sub prepareWin32DllLink ()
+sub prepareWin32DllLink
 {
     local($linking_main) = @_;
 
@@ -1996,10 +2007,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");
     }
@@ -2488,7 +2499,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' : '')
@@ -2657,7 +2668,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;
@@ -2763,7 +2774,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; };
@@ -2937,6 +2948,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" --------------------------------------------
 
@@ -2962,8 +2974,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; };
 
@@ -3056,6 +3076,7 @@ arg: while($_ = $Args[0]) {
     /^-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, $_);