From 76c2a7cf2f1c40b4e672ab27710143efe5aaed1a Mon Sep 17 00:00:00 2001 From: simonmar <unknown> Date: Thu, 26 Oct 2000 14:38:42 +0000 Subject: [PATCH] [project @ 2000-10-26 14:38:42 by simonmar] Simon's stuff --- ghc/compiler/main/DriverPipeline.hs | 75 +++++++++++++++-------------- ghc/compiler/main/Finder.lhs | 4 +- ghc/compiler/main/HscMain.lhs | 3 +- ghc/compiler/main/Main.hs | 23 +++++---- ghc/compiler/main/MkIface.lhs | 6 ++- 5 files changed, 61 insertions(+), 50 deletions(-) diff --git a/ghc/compiler/main/DriverPipeline.hs b/ghc/compiler/main/DriverPipeline.hs index 8efa7ee03111..502a849319fb 100644 --- a/ghc/compiler/main/DriverPipeline.hs +++ b/ghc/compiler/main/DriverPipeline.hs @@ -1,5 +1,5 @@ ----------------------------------------------------------------------------- --- $Id: DriverPipeline.hs,v 1.6 2000/10/25 14:42:32 sewardj Exp $ +-- $Id: DriverPipeline.hs,v 1.7 2000/10/26 14:38:42 simonmar Exp $ -- -- GHC Driver -- @@ -29,18 +29,17 @@ import DriverUtil import DriverMkDepend import DriverPhases import DriverFlags +import HscMain import Finder import TmpFiles import HscTypes -import UniqFM import Outputable import Module -import ErrUtils import CmdLineOpts import Config import Util -import Panic +import Posix import Directory import System import IOExts @@ -149,10 +148,8 @@ genPipeline todo stop_flag filename cish = cish_suffix suffix -- for a .hc file, or if the -C flag is given, we need to force lang to HscC - real_lang - | suffix == "hc" = HscC - | todo == StopBefore HCc && haskellish = HscC - | otherwise = lang + real_lang | suffix == "hc" = HscC + | otherwise = lang let ----------- ----- ---- --- -- -- - - - @@ -302,8 +299,6 @@ run_phase Unlit _basename _suff input_fn output_fn run_phase Cpp _basename _suff input_fn output_fn = do src_opts <- getOptionsFromSource input_fn - -- ToDo: this is *wrong* if we're processing more than one file: - -- the OPTIONS will persist through the subsequent compilations. _ <- processArgs dynamic_flags src_opts [] do_cpp <- readState cpp_flag @@ -395,7 +390,7 @@ run_phase MkDependHS basename suff input_fn _output_fn = do ----------------------------------------------------------------------------- -- Hsc phase -run_phase Hsc basename suff input_fn output_fn +run_phase Hsc basename suff input_fn output_fn = do -- we add the current directory (i.e. the directory in which @@ -441,44 +436,54 @@ run_phase Hsc basename suff input_fn output_fn -- build a bogus ModSummary to pass to hscMain. let summary = ModSummary { ms_location = error "no loc", - ms_ppsource = Just (loc, error "no fingerprint"), + ms_ppsource = Just (input_fn, error "no fingerprint"), ms_imports = error "no imports" } + -- get the DynFlags + dyn_flags <- readIORef v_DynFlags + -- run the compiler! - result <- hscMain dyn_flags mod_summary - Nothing{-no iface-} - output_fn emptyUFM emptyPCS + pcs <- initPersistentCompilerState + result <- hscMain dyn_flags{ hscOutName = output_fn } + (error "no Finder!") + summary + Nothing -- no iface + emptyModuleEnv -- HomeSymbolTable + emptyModuleEnv -- HomeIfaceTable + emptyModuleEnv -- PackageIfaceTable + pcs case result of { - HscErrs pcs errs warns -> do { - printErrorsAndWarnings errs warns - throwDyn (PhaseFailed "hsc" (ExitFailure 1)) }; - - HscOK details maybe_iface maybe_stub_h maybe_stub_c pcs warns -> do - - pprBagOfWarnings warns + HscFail pcs -> throwDyn (PhaseFailed "hsc" (ExitFailure 1)); - -- get the module name + HscOK details maybe_iface maybe_stub_h maybe_stub_c + _maybe_interpreted_code pcs -> do -- generate the interface file - case iface of + case maybe_iface of Nothing -> -- compilation not required do run_something "Touching object file" ("touch " ++ o_file) return False Just iface -> do -- discover the filename for the .hi file in a roundabout way - let mod = md_id details - locn <- mkHomeModule mod basename input_fn - let hifile = hi_file locn - -- write out the interface file here... - return () + let mod = moduleString (mi_module iface) + ohi <- readIORef output_hi + hifile <- case ohi of + Just fn -> fn + Nothing -> do hisuf <- readIORef hi_suf + return (current_dir ++ + '/'mod ++ '.':hisuf) + -- write out the interface... + if_hdl <- openFile hifile WriteMode + printForIface if_hdl (pprIface iface) + hClose if_hdl -- deal with stubs maybe_stub_o <- dealWithStubs basename maybe_stub_h maybe_stub_c - case stub_o of + case maybe_stub_o of Nothing -> return () Just stub_o -> add ld_inputs stub_o @@ -531,7 +536,7 @@ run_phase cc_phase _basename _suff input_fn output_fn verb <- is_verbose - o2 <- readIORef opt_minus_o2_for_C + o2 <- readIORef v_minus_o2_for_C let opt_flag | o2 = "-O2" | otherwise = "-O" @@ -720,7 +725,7 @@ preprocess filename = compile :: Finder -- to find modules -> ModSummary -- summary, including source - -> Maybe ModIFace -- old interface, if available + -> Maybe ModIface -- old interface, if available -> HomeSymbolTable -- for home module ModDetails -> PersistentCompilerState -- persistent compiler state -> IO CompResult @@ -757,13 +762,13 @@ compile finder summary old_iface hst pcs = do HscAsm -> newTempName (phaseInputExt As) HscC -> newTempName (phaseInputExt HCc) HscJava -> newTempName "java" -- ToDo - HscInterpreter -> return (error "no output file") + HscInterpreted -> return (error "no output file") -- run the compiler hsc_result <- hscMain dyn_flags summary old_iface output_fn hst pcs case hsc_result of { - HscErrs pcs errs warns -> return (CompErrs pcs errs warns); + HscFail pcs -> return (CompErrs pcs); HscOK details maybe_iface maybe_stub_h maybe_stub_c maybe_interpreted_code pcs warns -> do @@ -784,7 +789,7 @@ compile finder summary old_iface hst pcs = do -- in interpreted mode, just return the compiled code -- as our "unlinked" object. - HscInterpreter -> + HscInterpreted -> case maybe_interpreted_code of Just code -> return (Trees code) Nothing -> panic "compile: no interpreted code" diff --git a/ghc/compiler/main/Finder.lhs b/ghc/compiler/main/Finder.lhs index d0de38f5492f..bc2a5f39446f 100644 --- a/ghc/compiler/main/Finder.lhs +++ b/ghc/compiler/main/Finder.lhs @@ -118,12 +118,12 @@ mkHomeModuleLocn mod_name basename source_fn = do ohi <- readIORef output_hi hisuf <- readIORef hi_suf let hifile = case ohi of - Nothing -> basename ++ hisuf + Nothing -> basename ++ '.':hisuf Just fn -> fn -- figure out the .o file name. It also lives in the same dir -- as the source, but can be overriden by a -odir flag. - o_file <- odir_ify (basename ++ '.':phaseInputExt Ln) + o_file <- odir_ify (basename ++ '.':phaseInputExt Ln) >>= osuf_ify return (Just (mkHomeModule mod_name, ModuleLocation{ diff --git a/ghc/compiler/main/HscMain.lhs b/ghc/compiler/main/HscMain.lhs index 4d8a9e88522e..62b1cf288888 100644 --- a/ghc/compiler/main/HscMain.lhs +++ b/ghc/compiler/main/HscMain.lhs @@ -4,7 +4,8 @@ \section[GHC_Main]{Main driver for Glasgow Haskell compiler} \begin{code} -module HscMain ( hscMain ) where +module HscMain ( HscResult(..), hscMain, + initPersistentCompilerState ) where #include "HsVersions.h" diff --git a/ghc/compiler/main/Main.hs b/ghc/compiler/main/Main.hs index b0886cedbb90..ce7e26d44c41 100644 --- a/ghc/compiler/main/Main.hs +++ b/ghc/compiler/main/Main.hs @@ -1,6 +1,6 @@ {-# OPTIONS -W -fno-warn-incomplete-patterns #-} ----------------------------------------------------------------------------- --- $Id: Main.hs,v 1.8 2000/10/24 16:08:16 simonmar Exp $ +-- $Id: Main.hs,v 1.9 2000/10/26 14:38:42 simonmar Exp $ -- -- GHC Driver program -- @@ -94,7 +94,6 @@ main = -- install signal handlers main_thread <- myThreadId - #ifndef mingw32_TARGET_OS let sig_handler = Catch (throwTo main_thread (DynException (toDyn Interrupted))) @@ -149,6 +148,10 @@ main = (flags2, mode, stop_flag) <- getGhcMode argv' writeIORef v_GhcMode mode + -- force lang to "C" if the -C flag was given + case mode of StopBefore HCc -> writeIORef hsc_lang HscC + _ -> return () + -- process all the other arguments, and get the source files non_static <- processArgs static_flags flags2 [] @@ -160,6 +163,14 @@ main = static_opts <- buildStaticHscOpts writeIORef static_hsc_opts static_opts + -- warnings + warn_level <- readIORef warning_opt + let warn_opts = case warn_level of + W_default -> standardWarnings + W_ -> minusWOpts + W_all -> minusWallOpts + W_not -> [] + -- build the default DynFlags (these may be adjusted on a per -- module basis by OPTIONS pragmas and settings in the interpreter). @@ -174,14 +185,6 @@ main = -- leave out hscOutName for now flags = [] } - -- warnings - warn_level <- readIORef warning_opt - let warn_opts = case warn_level of - W_default -> standardWarnings - W_ -> minusWOpts - W_all -> minusWallOpts - W_not -> [] - -- the rest of the arguments are "dynamic" srcs <- processArgs dynamic_flags non_static [] -- save the "initial DynFlags" away diff --git a/ghc/compiler/main/MkIface.lhs b/ghc/compiler/main/MkIface.lhs index 1172df31526f..b16a95a046b1 100644 --- a/ghc/compiler/main/MkIface.lhs +++ b/ghc/compiler/main/MkIface.lhs @@ -5,7 +5,8 @@ \begin{code} module MkIface ( - mkModDetails, mkModDetailsFromIface, completeIface, writeIface + mkModDetails, mkModDetailsFromIface, completeIface, + writeIface, pprIface ) where #include "HsVersions.h" @@ -266,7 +267,7 @@ ifaceTyCls (AnId id) %* * %************************************************************************ -\begin{code} +\begin{code} ifaceInstance :: DFunId -> RenamedInstDecl ifaceInstance dfun_id = InstDecl (toHsType tidy_ty) EmptyMonoBinds [] (Just (getName dfun_id)) noSrcLoc @@ -621,6 +622,7 @@ writeIface finder (Just mod_iface) where mod_name = moduleName (mi_module mod_iface) +pprIface :: ModIface -> SDoc pprIface iface = vcat [ ptext SLIT("__interface") <+> doubleQuotes (ptext opt_InPackage) -- GitLab