[project @ 2000-06-13 15:35:29 by simonm]
[ghc-hetmet.git] / ghc / driver / ghc.lprl
index 8e4b16f..0568a0d 100644 (file)
@@ -158,7 +158,14 @@ $SIG{'QUIT'} = 'quit_upon_signal';
                           : "$TopPwd/${CURRENT_DIR}" );
 
 if ( $ENV{'TMPDIR'} ) { # where to make tmp file names
-    $Tmp_prefix = ($ENV{'TMPDIR'} . "/ghc$$");
+    # Try to find a $Tmp_prefix which isn't being used...
+    $tmp = $$;
+    do {
+      $Tmp_prefix = ($ENV{'TMPDIR'} . "/ghc$tmp");
+      $tmp++;
+    } while ( -e "$Tmp_prefix.hc" ||
+             -e "$Tmp_Prefix.s"  || 
+             -e "$Tmp_Prefix.hi" );
 } else {
     print STDERR "TMPDIR has not been set to anything useful!\n" if (${TMPDIR} eq '');
     $Tmp_prefix ="${TMPDIR}/ghc$$"; # TMPDIR set via Makefile when booting..
@@ -226,7 +233,6 @@ These are the default values, which may be changed by user flags.
 \begin{code}
 sub setupOptFlags {
    $Oopt_MaxSimplifierIterations  = '-fmax-simplifier-iterations4';
-   $Oopt_PedanticBottoms         = '-fpedantic-bottoms'; # ON by default
    $Oopt_FinalStgProfilingMassage = '';
    $Oopt_StgStats                = '';
    $Oopt_DoSpecialise            = '-fspecialise';
@@ -246,7 +252,7 @@ problems, so I'm turing on the warnings -- SDM 4/5/98)
 \begin{code}
 $CcRegd                = $GHC_OPT_HILEV_ASM;
 @CcBoth_flags  = ('-S','-Wimplicit');   # flags for *any* C compilation
-@CcInjects     = ();
+@CcInjects     = ("#include \"Stg.h\"\n", "#include \"HsStd.h\"\n");
 
 # GCC flags: 
 #    those for all files, 
@@ -277,6 +283,7 @@ warnings that you get all the time are
        -fwarn-missing-fields
        -fwarn-deprecations
        -fwarn-duplicate-exports
+       -fwarn-hi-shadowing
 
 these are turned off by -Wnot.
 
@@ -285,6 +292,7 @@ these are turned off by -Wnot.
                     '-fwarn-missing-methods',
                     '-fwarn-missing-fields',
                     '-fwarn-deprecations',
+# DISABLE DUE TO DUPLICATE INCLUDE PATHS (ToDo): '-fwarn-hi-shadowing',
                     '-fwarn-duplicate-exports');
 @MinusWOpts              = (@StandardWarnings, 
                     '-fwarn-unused-binds',
@@ -462,12 +470,15 @@ $PostprocessCcOutput = 0;
 $Static = 1;
 $Static = 0 if ($EnableWin32DLLs eq 'YES');
 
-# native code-gen or via C?
+# Output language
 $HaveNativeCodeGen = $GhcWithNativeCodeGen;
-$HscOut = '-C='; # '-C=' ==> .hc output; '-S=' ==> .s output; '-N=' ==> neither
-$HscOut = '-S='
-    if ($HaveNativeCodeGen ne 'YES') && $TargetPlatform =~ /^(alpha)-/;
-# TEMP: disable x86 & Sparc if $HaveNativeCodeGen && $TargetPlatform =~ /^(i386|alpha|sparc)-/;
+$HscLang = 'C';        # 'C'    ==> .hc output; 
+                       # 'asm'  ==> .s output; 
+                       # 'java' ==> .java output
+                       # 'none' ==> no code output
+$HscLang = 'asm'
+    if ($HaveNativeCodeGen eq 'YES') && $TargetPlatform =~ /^(i386)-/;
+
 $ProduceHi    = '-hifile=';
 $HiOnStdout   = 0;
 $HiWith       = '';
@@ -513,6 +524,9 @@ $NoImplicitPrelude = 0;
 # external main is provided instead.
 $NoHaskellMain=0;
 
+# Hash to keep track of 
+%Syslibs_added = ();
+
 } # end of initDriverGlobals (Sigh)
 
 # we split the argv passed to the driver into three:
@@ -704,7 +718,6 @@ sub setupOptimiseFlags {
        '-fcase-of-case',
        '-fcase-merge',
        '-flet-to-case',
-       $Oopt_PedanticBottoms,
 
        # initial simplify: mk specialiser happy: minimum effort please
 
@@ -805,7 +818,7 @@ 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-lambda-eta-expansion -freuse-con -flet-to-case $Oopt_PedanticBottoms $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_MaxSimplifierIterations $Oopt_ShowSimplifierProgress ]" ),
 
 #      '-fliberate-case',
 
@@ -942,9 +955,9 @@ After the sanity checks, add flags to the necessary parts of the driver pipeline
   if ( $BuildTag ne '' ) { # something other than normal sequential...
 
       local($Tag) = "${BuildTag}";
-      $Tag =~ s/_//;  # move the underscore to the back
+      $Tag =~ s/_//;   # move the underscore to the back
 
-      $HscOut = '-C='; # must go via C
+      $HscLang = 'C';  # must go via C
       &processArgs(split(' ', $SetupOpts{$BuildTag}));
 #      eval($EvaldSetupOpts{$BuildTag});
   }
@@ -1104,6 +1117,7 @@ sub setupLinkOpts {
           ,'-u', "${uscore}PrelException_NonTermination_closure"
           ,'-u', "${uscore}PrelException_PutFullMVar_closure"
           ,'-u', "${uscore}PrelException_BlockedOnDeadMVar_closure"
+          ,'-u', "${uscore}PrelWeak_runFinalizzerBatch_closure"
           ,'-u', "${uscore}__init_Prelude"
           ,'-u', "${uscore}__init_PrelMain"
        ));
@@ -1140,7 +1154,6 @@ sub setupIncPaths {
       push (@Include_dir, "$TopPwd/${CURRENT_DIR}/${GHC_INCLUDE_DIR}");
   } else {
       push (@Include_dir, "$InstLibDirGhc/includes");
-      push (@Include_dir, "$InstLibDirGhc/includes");
   }
 } # end of setupIncPaths
 \end{code}
@@ -1401,11 +1414,17 @@ Again, we'll do the post-recompilation-checker parts of this later.
     # 
     local($do_cc)      = ( $Do_cc != -1) # i.e., it was set explicitly
                          ? $Do_cc
-                         : ( ($HscOut eq '-C=') ? 1 : 0 );
+                         : ( ($HscLang eq 'C') ? 1 : 0 );
     local($do_as)      = $Do_as;
-    local($hsc_out)       = ( $HscOut eq '-C=' ) ? "$Tmp_prefix.hc" : "$Tmp_prefix.s" ;
-    local($hsc_out_c_stub) = ( $HscOut eq '-C=' ) ? "${Tmp_prefix}_stb.c" : "";
-    local($hsc_out_h_stub) = ( $HscOut eq '-C=' ) ? "${Tmp_prefix}_stb.h" : "";
+
+    local($hsc_out_suffix) = ( $HscLang eq 'C' )    ? "hc" : 
+                            ( $HscLang eq 'asm' )  ? "s" : 
+                            ( $HscLang eq 'java' ) ? "java" : 
+                               "" ;
+    
+    local($hsc_out)       = "$Tmp_prefix.$hsc_out_suffix" ;
+    local($hsc_out_c_stub) = "${Tmp_prefix}_stb.c";
+    local($hsc_out_h_stub) = "${Tmp_prefix}_stb.h";
 
     if ($Only_preprocess_hc) { # stop after having run $Cc -E
        $do_as=0;
@@ -1445,20 +1464,20 @@ not} going to run, set its input (i.e., the output of its preceding
 phase) to @"$ifile_root.<suffix>"@.
 
 \begin{code}
-    local($going_interactive) = $HscOut eq '-N=' || $ifile_root eq '_stdin';
+    local($going_interactive) = $HscLang eq 'none' || $ifile_root eq '_stdin';
 
     #
     # Warning issued if -keep-hc-file-too is used without
     # -fvia-C (or the equivalent)
     #
-    if ( $HscOut ne '-C=' && $Keep_hc_file_too ) {
+    if ( $HscLang ne 'C' && $Keep_hc_file_too ) {
        print STDERR "$Pgm: warning: Native code generator to be used, -keep-hc-file-too will be ignored\n";
     }
 
     if (! $do_cc && ! $do_as) { # stopping after hsc
        $hsc_out = ($Specific_output_file ne '')
                 ? $Specific_output_file
-                : &odir_ify($ifile_root, ($HscOut eq '-C=') ? 'hc' : 's');
+                : &odir_ify($ifile_root, $hsc_out_suffix);
 
        $ofile_target = $hsc_out; # reset
     }
@@ -1488,17 +1507,6 @@ Now the Haskell compiler, C compiler, and assembler
     }
 
     if (-f $hsc_out_c_stub) {
-       &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/\.(.*)$//;
-
-        $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.
        #
@@ -1506,7 +1514,6 @@ Now the Haskell compiler, C compiler, and assembler
        # Hack - ensure that the stub .h file is included in the OPTIONS section
        #        if the .hc file is saved.
        push (@File_options, "-#include \"${ofile_h_stub_target}\"\n");
-       
     }
 
     if ($do_cc) {
@@ -1519,6 +1526,21 @@ Now the Haskell compiler, C compiler, and assembler
     # save a copy of the .s file..
     &saveIntermediate($ifile_root , "s" , $cc_as) if ($do_as && $Keep_s_file_too);
     &runAs($as_out, $ifile_root) if $do_as;
+
+    if (-f $hsc_out_c_stub) {
+       &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/\.(.*)$//;
+
+        $ofile_o_stub_target = &osuf_ify($ofile_o_stub_target, "o");
+       if ($do_cc || $do_as) {  # might be using NCG, so check $do_as
+         &runGcc    (0, $ofile_c_stub_target, $ofile_s_stub_target);
+          &runAs     ($ofile_o_stub_target, $ofile_s_stub_target);
+       }
+    }
+
 \end{code}
 
 Finally, decide what to queue up for linker input.
@@ -1663,7 +1685,7 @@ sub runHscAndProcessInterfaces {
    # See if it bailed out early, saying nothing needed doing.  
    # We work this out by seeing if it created an output .hi file
 
-    if ( ! -f $hsc_hi && $ProduceHi !~ /-nohifile=/ ) {
+    if ( ! -f $hsc_out ) {
        # Doesn't exist, so we bailed out early.
        # Tell the C compiler and assembler not to run
        $do_cc = 0; $do_as = 0;
@@ -1673,7 +1695,7 @@ sub runHscAndProcessInterfaces {
        # recompiling this module has been done
        #
        &run_something("touch $ofile_target",
-                      "Touch $ofile_target,  to propagate dependencies") if $HscOut ne '-N=';
+                      "Touch $ofile_target,  to propagate dependencies") if $HscLang ne 'none';
 
     } else {   
 
@@ -1682,34 +1704,34 @@ sub runHscAndProcessInterfaces {
        # If non-interactive, heave in the consistency info at the end
        # NB: pretty hackish (depends on how $output is set)
        if ( ! $going_interactive ) {
-           if ( $HscOut eq '-C=' ) {
-           $to_do = "echo 'static char ghc_hsc_ID[] = \"\@(#)hsc $ifile\t$HsC_major_version.$HsC_minor_version,$HsC_consist_options\";' >> $hsc_out";
+           if ( $HscLang eq 'C' ) {
+                $to_do = "echo 'static char ghc_hsc_ID[] = \"\@(#)hsc $ifile\t$HsC_major_version.$HsC_minor_version,$HsC_consist_options\";' >> $hsc_out";
     
-           } elsif ( $HscOut eq '-S=' ) {
+               &run_something($to_do, 'Pin on Haskell consistency info');      
+           } elsif ( $HscLang eq 'asm' ) {
                local($consist) = "hsc.$ifile.$HsC_major_version.$HsC_minor_version.$HsC_consist_options";
                $consist =~ s/,/./g;
                $consist =~ s/\//./g;
                $consist =~ s/-/_/g;
                $consist =~ s/[^A-Za-z0-9_.]/ZZ/g; # ToDo: properly?
                $to_do = "echo '\n\t.text\n$consist:' >> $hsc_out";
+               &run_something($to_do, 'Pin on Haskell consistency info');      
            }
-           &run_something($to_do, 'Pin on Haskell consistency info');  
+           # no consistency info for Java output files
        }   
 
 
        # Interface-handling is important enough to live off by itself
-        if ( $ProduceHi !~ /-nohifile=/ ) { # If we've produced one, process it.
-          require('ghc-iface.prl') || &tidy_up_and_die(1,"$Pgm: panic: can't load ghc-iface.prl!\n");
-          &postprocessHiFile($hsc_hi, $hifile_target, $going_interactive);
+       if ( -f $hsc_hi ) {
+               # print STDERR "Aha! A new hi file\n" ;
+               &run_something( "mv $hsc_hi $hifile_target", "Copy hi file" ) ;
+       } else {
+               # print STDERR "Oh ho! Hi file unchanged\n" ;
        }
-       # if we're going to split up object files,
-       # we inject split markers into the .hc file now
-       if ( $HscOut eq '-C=' && $SplitObjFiles ) {
-           &inject_split_markers ( $hsc_out );
-        }
+
 
        # save a copy of the .hc file, even if we are carrying on...
-       if ($HscOut eq '-C=' && $do_cc && $Keep_hc_file_too) {
+       if ($HscLang eq 'C' && $do_cc && $Keep_hc_file_too) {
             &saveIntermediate($ifile_root , "hc" , $hsc_out);
        }
 
@@ -1738,7 +1760,8 @@ sub runHsc {
 
     # set up for producing output/.hi; note that flag twiddling
     # may mean that nothing will actually be produced:
-    $output = "$ProduceHi$hsc_hi $HscOut$hsc_out -F=$hsc_out_c_stub -FH=$hsc_out_h_stub";
+    $oflags = ( $HscLang eq 'none' ? "" : "-olang=$HscLang -ofile=$hsc_out" ) ;
+    $output = "$ProduceHi$hsc_hi $oflags -F=$hsc_out_c_stub -FH=$hsc_out_h_stub";
     push(@Files_to_tidy, $hsc_hi, $hsc_out, $hsc_out_c_stub, $hsc_out_h_stub );
 
     # if we're compiling foo.hs, we want the GC stats to end up in foo.stat
@@ -2092,11 +2115,7 @@ sub runGcc {
     # a tmp .c file which #include's the needful.
     open(TMP, "> $cc_help") || &tidy_up_and_die(1,"$Pgm: failed to open `$cc_help' (to write)\n");
     if ( $is_hc_file ) {
-       print TMP <<EOINCL;
-#include "Stg.h"
-EOINCL
-       # user may have asked for #includes to be injected...
-       print TMP @CcInjects if $#CcInjects >= 0;
+       print TMP @CcInjects;
     } else {
        # Straight .c files may want to know that they're being used
        # with a particular version of GHC, so we define __GLASGOW_HASKELL__ for their benefit.
@@ -2486,9 +2505,6 @@ to the syslib family. The info bit consist of the following:
 
 \begin{code}
 
-# Hash to keep track of 
-%Syslibs_added = ();
-
 sub add_syslib {
     local($syslib) = @_;
 
@@ -2528,7 +2544,7 @@ sub add_syslib {
               : "$TopPwd/hslibs/concurrent"
          )
        , '' # where to find the cbits archive to use when linking
-       , '' # Syslib dependencies
+       , 'lang' # Syslib dependencies
        , '' # extra ghc opts
        , '' # extra cc opts
        , '' # extra ld opts
@@ -2600,7 +2616,7 @@ sub add_syslib {
        [  # where to slurp interface files from
          ( $INSTALLING 
               ? "$InstLibDirGhc/imports/text"
-              : "$TopPwd/hslibs/text:$TopPwd/hslibs/text/html:$TopPwd/hslibs/text/haxml/lib"
+              : "$TopPwd/hslibs/text:$TopPwd/hslibs/text/html:$TopPwd/hslibs/text/haxml/lib:$TopPwd/hslibs/text/parsec"
          )
        , # where to find the archive to use when linking
          ( $INSTALLING 
@@ -2634,10 +2650,10 @@ sub add_syslib {
               ? "$InstLibDirGhc"
               : "$TopPwd/hslibs/util/cbits"
          )
-       , 'lang concurrent' # Syslib dependencies
+       , 'lang concurrent' . (( $TargetPlatform =~ /^.*(cygwin32|mingw32)$/ ) ? '' : ' posix' ) # Syslib dependencies
        , ''     # extra ghc opts
        , ''     # extra cc opts
-       , ''     # extra ld opts
+       , "$LibsReadline"     # extra ld opts
        ],
 
        win32,
@@ -2652,12 +2668,30 @@ sub add_syslib {
               : "$TopPwd/hslibs/win32/src"
          )
        , ''
-       , 'lang' # Syslib dependencies
+       , 'lang greencard' # Syslib dependencies
        , ''     # extra ghc opts
        , ''     # extra cc opts
        , '-luser32 -lgdi32'     # extra ld opts
        ],
 
+       greencard,
+        [  # where to slurp interface files from
+          ( $INSTALLING
+               ? "$InstLibDirGhc/imports/greencard"
+               : "$TopPwd/green-card/lib/ghc"
+          )
+        , # where to find the archive to use when linking
+          ( $INSTALLING
+               ? "$InstLibDirGhc"
+               : "$TopPwd/green-card/lib/ghc"
+          )
+        , ''     # No cbits archive
+        , 'lang' # Syslib dependencies
+        , ''     # extra ghc opts
+        , ''     # extra cc opts
+        , ''     # extra ld opts
+        ],
+
        com,
        [  # where to slurp interface files from
          ( $INSTALLING 
@@ -2686,6 +2720,12 @@ sub add_syslib {
        return;
     }
 
+    # Make sure that header file HsFoo.h is included for syslib foo.
+    if ( !exists $Syslibs_added{$syslib} ) {
+      push(@CcInjects, "#include \"Hs\u$syslib.h\"\n");
+      push(@Include_dir, "$TopPwd/hslibs/$syslib/cbits") unless ( $INSTALLING );
+    }
+
     # 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,
@@ -2880,11 +2920,15 @@ arg: while($_ = $Args[0]) {
     # change the global default:
     # we won't run cat; we'll run the real thing
        
-    /^-C$/         && do { $Do_cc = 0; $Do_as = 0; $Do_lnkr = 0; $HscOut = '-C=';
+    /^-C$/         && do { $Do_cc = 0; $Do_as = 0; $Do_lnkr = 0; $HscLang = 'C';
                            next arg; };
     # stop after generating C
        
-    /^-noC$/       && do { $HscOut = '-N='; $ProduceHi = '-nohifile=';
+    /^-J$/         && do { $Do_cc = 0; $Do_as = 0; $Do_lnkr = 0; $HscLang = 'java';
+                           next arg; };
+    # stop after generating Java
+       
+    /^-noC$/       && do { $HscLang = 'none'; $ProduceHi = '-nohifile=';
                            $Do_cc = 0; $Do_as = 0; $Do_lnkr = 0;
                            next arg; };
     # leave out actual C generation (debugging) [also turns off interface gen]
@@ -3162,7 +3206,7 @@ arg: while($_ = $Args[0]) {
                            print STDERR "WARNING: don't know how to split objects on this platform: $TargetPlatform\n`-split-objs' option ignored\n";
                        } else {
                            $SplitObjFiles = 1;
-                           $HscOut = '-C=';
+                           $HscLang = 'C';
 
                            push(@HsC_flags, "-fglobalise-toplev-names"); 
                            push(@CcBoth_flags, '-DUSE_SPLIT_MARKERS');
@@ -3180,14 +3224,20 @@ arg: while($_ = $Args[0]) {
     /^-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, $_);
 
-                       # -fglasgow-exts implies -syslib lang
+                       # -fglasgow-exts implies -package lang
                        &add_syslib('lang');
 
                        next arg; };
 
+       # for compiling lib/std we can't add the implicit package lang,
+       # because it isn't built yet.
+    /^-fglasgow-exts-no-lang$/
+               && do { push(@HsC_flags, "-fglasgow-exts"); next arg; };
+
     /^-fspeciali[sz]e$/
                && do { $Oopt_DoSpecialise = '-fspecialise'; next arg; };
     /^-fno-speciali[sz]e$/
@@ -3197,8 +3247,6 @@ arg: while($_ = $Args[0]) {
                 && 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$/
@@ -3218,8 +3266,8 @@ arg: while($_ = $Args[0]) {
 
     # ---------------
 
-    /^-fasm-(.*)$/     && do { $HscOut = '-S='; next arg; }; # force using nativeGen
-    /^-fvia-[cC]$/     && do { $HscOut = '-C='; next arg; }; # force using C compiler
+    /^-fasm-(.*)$/     && do { $HscLang = 'asm'; next arg; }; # force using nativeGen
+    /^-fvia-[cC]$/     && do { $HscLang = 'C';   next arg; }; # force using C compiler
 
     # ---------------
 
@@ -3236,9 +3284,6 @@ arg: while($_ = $Args[0]) {
                    && do { $Oopt_MaxSimplifierIterations = $1 . &grab_arg_arg(*Args,$1, $2);
                            next arg; };
 
-    /^-fno-pedantic-bottoms$/
-                   && do { $Oopt_PedanticBottoms = ''; next arg; };
-
     /^-fno-pre-inlining$/
                    && do { push(@HsC_flags, $_); next arg };
 
@@ -3250,7 +3295,13 @@ arg: while($_ = $Args[0]) {
 
     # --------------- Warnings etc. ------
 
-    /^-fwarn-(.*)$/      && do { push(@HsC_flags, $_); next arg; };
+    /^-fwarn-(.*)$/ && do { if (!grep(/$1/,@MinusWallOpts)) {
+                               print STDERR "$Pgm: unrecognised warning option: $_\n";
+                               $Status++;
+                           } else {                            
+                               push(@HsC_flags, $_); 
+                           }
+                           next arg; };
 
     /^-fno-(.*)$/   && do { push(@HsC_antiflags, "-f$1");
                            &squashHscFlag("-f$1");
@@ -3391,7 +3442,7 @@ arg: while($_ = $Args[0]) {
                local($opt_lev) = ( /^-O2$/ ) ? 2 : 1; # max 'em
                $OptLevel = ( $opt_lev > $OptLevel ) ? $opt_lev : $OptLevel;
 
-               $HscOut = '-C=' if $OptLevel == 2; # force use of C compiler
+               $HscLang = 'C';  # force use of C compiler
                next arg; };
 
     /^-Onot$/  && do { $OptLevel = 0; next arg; }; # # set it to <no opt>