-fno-code shouldn't be a mode.
authorLemmih <lemmih@gmail.com>
Sat, 18 Mar 2006 17:17:28 +0000 (17:17 +0000)
committerLemmih <lemmih@gmail.com>
Sat, 18 Mar 2006 17:17:28 +0000 (17:17 +0000)
I've removed -fno-code from Main to make it work
equally well with --make and -c.
I've also allowed it not to write hi files unless
-fwrite-iface is given.

ghc/compiler/main/CodeOutput.lhs
ghc/compiler/main/DriverPipeline.hs
ghc/compiler/main/DynFlags.hs
ghc/compiler/main/HscMain.lhs
ghc/compiler/main/Main.hs

index 0148ca4..d1b2933 100644 (file)
@@ -100,7 +100,6 @@ codeOutput dflags this_mod location foreign_stubs pkg_deps flat_abstractC
 #else
                                panic "ILX support not compiled into this ghc";
 #endif
-             HscNothing     -> return ();
          }
        ; return stubs_exist
        }
index 2dbee88..ac98eff 100644 (file)
@@ -130,7 +130,7 @@ compile hsc_env mod_summary maybe_old_linkable old_iface mod_index nmods = do
        dflags      = dflags0 { includePaths = current_dir : old_paths }
 
    -- Figure out what lang we're generating
-   let hsc_lang = hscTarget dflags
+   let hsc_lang = hscMaybeAdjustTarget dflags StopLn src_flavour (hscTarget dflags)
    -- ... and what the next phase should be
    let next_phase = hscNextPhase dflags src_flavour hsc_lang
    -- ... and what file to generate the output into
@@ -204,6 +204,8 @@ compile hsc_env mod_summary maybe_old_linkable old_iface mod_index nmods = do
      HscInterpreted | not (isHsBoot src_flavour) -- We can't compile boot files to
                                                  -- bytecode so don't even try.
          -> runCompiler hscCompileInteractive handleInterpreted
+     HscNothing
+         -> runCompiler hscCompileNothing handleBatch
      _other
          -> runCompiler hscCompileBatch handleBatch
 
@@ -717,7 +719,7 @@ runPhase (Hsc src_flavour) stop dflags0 basename suff input_fn get_output_fn _ma
                                  else return False
 
   -- get the DynFlags
-       let hsc_lang = hscTarget dflags
+       let hsc_lang = hscMaybeAdjustTarget dflags stop src_flavour (hscTarget dflags)
        let next_phase = hscNextPhase dflags src_flavour hsc_lang
        output_fn  <- get_output_fn next_phase (Just location4)
 
@@ -765,7 +767,7 @@ runPhase CmmCpp stop dflags basename suff input_fn get_output_fn maybe_loc
 
 runPhase Cmm stop dflags basename suff input_fn get_output_fn maybe_loc
   = do
-       let hsc_lang = hscTarget dflags
+       let hsc_lang = hscMaybeAdjustTarget dflags stop HsSrcFile (hscTarget dflags)
        let next_phase = hscNextPhase dflags HsSrcFile hsc_lang
        output_fn <- get_output_fn next_phase maybe_loc
 
@@ -1376,8 +1378,27 @@ hscNextPhase dflags other hsc_lang =
        HscC -> HCc
        HscAsm | dopt Opt_SplitObjs dflags -> SplitMangle
               | otherwise -> As
-        HscNothing     -> HCc
+       HscNothing     -> StopLn
+       HscInterpreted -> StopLn
        _other         -> StopLn
 
+
+hscMaybeAdjustTarget :: DynFlags -> Phase -> HscSource -> HscTarget -> HscTarget
+hscMaybeAdjustTarget dflags stop HsBootFile current_hsc_lang 
+  = HscNothing         -- No output (other than Foo.hi-boot) for hs-boot files
+hscMaybeAdjustTarget dflags stop other current_hsc_lang 
+  = hsc_lang 
+  where
+       keep_hc = dopt Opt_KeepHcFiles dflags
+       hsc_lang
+               -- don't change the lang if we're interpreting
+                | current_hsc_lang == HscInterpreted = current_hsc_lang
+
+               -- force -fvia-C if we are being asked for a .hc file
+                | HCc <- stop = HscC
+                | keep_hc     = HscC
+               -- otherwise, stick to the plan
+                | otherwise = current_hsc_lang
+
 GLOBAL_VAR(v_Split_info, ("",0), (String,Int))
        -- The split prefix and number of files
index f0c95bc..8f6ac1f 100644 (file)
@@ -174,7 +174,6 @@ data DynFlag
    | Opt_RecompChecking
    | Opt_DryRun
    | Opt_DoAsmMangling
-   | Opt_WriteIface
    | Opt_ExcessPrecision
    | Opt_ReadUserPackageConf
    | Opt_NoHsMain
@@ -406,7 +405,6 @@ defaultDynFlags =
                        -- a good thing anyway, but it seems fragile.
     
            Opt_DoAsmMangling,
-            Opt_WriteIface,
     
            -- and the default no-optimisation options:
            Opt_IgnoreInterfacePragmas,
@@ -836,10 +834,8 @@ dynamic_flags = [
   ,  ( "stubdir"       , HasArg (upd . setStubDir . Just))
 
        ------- Keeping temporary files -------------------------------------
-  ,  ( "keep-hc-file"   , AnySuffix (\_ -> do setDynFlag Opt_KeepHcFiles
-                                              setTarget HscC))
-  ,  ( "keep-s-file"    , AnySuffix (\_ -> do setDynFlag Opt_KeepSFiles
-                                              setTarget HscAsm))
+  ,  ( "keep-hc-file"   , AnySuffix (\_ -> setDynFlag Opt_KeepHcFiles))
+  ,  ( "keep-s-file"    , AnySuffix (\_ -> setDynFlag Opt_KeepSFiles))
   ,  ( "keep-raw-s-file", AnySuffix (\_ -> setDynFlag Opt_KeepRawSFiles))
   ,  ( "keep-tmp-files" , AnySuffix (\_ -> setDynFlag Opt_KeepTmpFiles))
 
@@ -945,8 +941,7 @@ dynamic_flags = [
 
         ------ Compiler flags -----------------------------------------------
 
-  ,  ( "fno-code",     NoArg (do setTarget HscNothing
-                                  unSetDynFlag Opt_WriteIface))
+  ,  ( "fno-code",     NoArg (setTarget HscNothing))
   ,  ( "fasm",         AnySuffix (\_ -> setTarget HscAsm) )
   ,  ( "fvia-c",       NoArg (setTarget HscC) )
   ,  ( "fvia-C",       NoArg (setTarget HscC) )
@@ -1004,8 +999,7 @@ fFlags = [
   ( "case-merge",                      Opt_CaseMerge ),
   ( "unbox-strict-fields",             Opt_UnboxStrictFields ),
   ( "excess-precision",                        Opt_ExcessPrecision ),
-  ( "asm-mangling",                    Opt_DoAsmMangling ),
-  ( "write-iface",                      Opt_WriteIface )
+  ( "asm-mangling",                    Opt_DoAsmMangling )
   ]
 
 glasgowExtsFlags = [ 
index f2bc84a..3af61b1 100644 (file)
@@ -529,11 +529,9 @@ hscNormalIface simpl_result
 
 hscWriteIface :: (ModIface, Bool, ModDetails, a) -> Comp (ModIface, ModDetails, a)
 hscWriteIface (iface, no_change, details, a)
-    = do hsc_env <- gets compHscEnv
-         mod_summary <- gets compModSummary
-         let writeIface = dopt Opt_WriteIface (hsc_dflags hsc_env)
+    = do mod_summary <- gets compModSummary
          liftIO $ do
-         unless (no_change || not writeIface)
+         unless no_change
            $ writeIfaceFile (ms_location mod_summary) iface
          return (iface, details, a)
 
index 468c0a6..ec5a116 100644 (file)
@@ -147,13 +147,7 @@ main =
         ShowInterface f -> showIface f
        DoMake          -> doMake session srcs
        DoMkDependHS    -> doMkDependHS session (map fst srcs)
-       StopBefore p
-            -- Stop after compiling Haskell if we aren't
-            -- interested in any further results.
-            | HscNothing <- hscTarget dflags
-                        -> oneShot dflags HCc srcs
-            | otherwise
-                        -> oneShot dflags p srcs
+       StopBefore p    -> oneShot dflags p srcs
        DoInteractive   -> interactiveUI session srcs Nothing
        DoEval expr     -> interactiveUI session srcs (Just expr)
 
@@ -354,6 +348,11 @@ mode_flags =
   ,  ( "-make"         , PassFlag (setMode DoMake))
   ,  ( "-interactive"  , PassFlag (setMode DoInteractive))
   ,  ( "e"              , HasArg   (\s -> setMode (DoEval s) "-e"))
+
+       -- -fno-code says to stop after Hsc but don't generate any code.
+  ,  ( "fno-code"      , PassFlag (\f -> do setMode (StopBefore HCc) f
+                                            addFlag "-fno-code"
+                                            addFlag "-no-recomp"))
   ]
 
 setMode :: CmdLineMode -> String -> ModeM ()