X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Fmain%2FCodeOutput.lhs;h=7732497a648dcc82296ef2be9fa17c8c5cea6e7a;hb=423d477bfecd490de1449c59325c8776f91d7aac;hp=14fbb0b3a2823907f5cf1660d963e889e4cdc120;hpb=8ea6ae884aa28d770dd4ca5575e5757e2115883d;p=ghc-hetmet.git diff --git a/ghc/compiler/main/CodeOutput.lhs b/ghc/compiler/main/CodeOutput.lhs index 14fbb0b..7732497 100644 --- a/ghc/compiler/main/CodeOutput.lhs +++ b/ghc/compiler/main/CodeOutput.lhs @@ -24,24 +24,27 @@ import qualified PrintJava import OccurAnal ( occurAnalyseBinds ) #endif +import PprC ( writeCs ) +import CmmLint ( cmmLint ) import Packages import DriverState ( getExplicitPackagesAnd, getPackageCIncludes ) import FastString ( unpackFS ) -import AbsCSyn ( AbstractC ) -import PprAbsC ( dumpRealC, writeRealC ) +import Cmm ( Cmm ) import HscTypes import CmdLineOpts -import ErrUtils ( dumpIfSet_dyn, showPass ) +import ErrUtils ( dumpIfSet_dyn, showPass, ghcExit ) import Outputable import Pretty ( Mode(..), printDoc ) import Module ( Module ) import ListSetOps ( removeDupsEq ) +import Maybes ( firstJust ) +import Directory ( doesFileExist ) +import Data.List ( intersperse ) import Monad ( when ) import IO \end{code} - %************************************************************************ %* * \subsection{Steering} @@ -53,7 +56,7 @@ codeOutput :: DynFlags -> Module -> ForeignStubs -> Dependencies - -> AbstractC -- Compiled abstract C + -> [Cmm] -- Compiled C-- -> IO (Bool{-stub_h_exists-}, Bool{-stub_c_exists-}) codeOutput dflags this_mod foreign_stubs deps flat_abstractC @@ -64,7 +67,17 @@ codeOutput dflags this_mod foreign_stubs deps flat_abstractC -- Dunno if the above comment is still meaningful now. JRS 001024. - do { showPass dflags "CodeOutput" + do { when (dopt Opt_DoCmmLinting dflags) $ do + { showPass dflags "CmmLint" + ; let lints = map cmmLint flat_abstractC + ; case firstJust lints of + Just err -> do { printDump err + ; ghcExit 1 + } + Nothing -> return () + } + + ; showPass dflags "CodeOutput" ; let filenm = dopt_OutName dflags ; stubs_exist <- outputForeignStubs dflags foreign_stubs ; case dopt_HscLang dflags of { @@ -103,8 +116,7 @@ doOutput filenm io_action = bracket (openFile filenm WriteMode) hClose io_action \begin{code} outputC dflags filenm flat_absC (stub_h_exists, _) dependencies foreign_stubs - = do dumpIfSet_dyn dflags Opt_D_dump_realC "Real C" (dumpRealC flat_absC) - + = do -- figure out which header files to #include in the generated .hc file: -- -- * extra_includes from packages @@ -141,7 +153,7 @@ outputC dflags filenm flat_absC hPutStr h cc_injects when stub_h_exists $ hPutStrLn h ("#include \"" ++ (hscStubHOutName dflags) ++ "\"") - writeRealC h flat_absC + writeCs h flat_absC \end{code} @@ -157,9 +169,8 @@ outputAsm dflags filenm flat_absC #ifndef OMIT_NATIVE_CODEGEN = do ncg_uniqs <- mkSplitUniqSupply 'n' - let (stix_final, ncg_output_d) = _scc_ "NativeCodeGen" - nativeCodeGen flat_absC ncg_uniqs - dumpIfSet_dyn dflags Opt_D_dump_stix "Final stix code" stix_final + ncg_output_d <- _scc_ "NativeCodeGen" + nativeCodeGen dflags flat_absC ncg_uniqs dumpIfSet_dyn dflags Opt_D_dump_asm "Asm code" (docToSDoc ncg_output_d) _scc_ "OutputAsm" doOutput filenm $ \f -> printDoc LeftMode f ncg_output_d @@ -220,7 +231,12 @@ outputIlx dflags filename mod tycons stg_binds outputForeignStubs :: DynFlags -> ForeignStubs -> IO (Bool, -- Header file created Bool) -- C file created -outputForeignStubs dflags NoStubs = return (False, False) +outputForeignStubs dflags NoStubs = do +-- When compiling External Core files, may need to use stub files from a +-- previous compilation + hFileExists <- doesFileExist (hscStubHOutName dflags) + cFileExists <- doesFileExist (hscStubCOutName dflags) + return (hFileExists, cFileExists) outputForeignStubs dflags (ForeignStubs h_code c_code _ _) = do dumpIfSet_dyn dflags Opt_D_dump_foreign @@ -241,7 +257,7 @@ outputForeignStubs dflags (ForeignStubs h_code c_code _ _) stub_c_file_exists <- outputForeignStubs_help (hscStubCOutName dflags) stub_c_output_w ("#define IN_STG_CODE 0\n" ++ - "#include \"RtsAPI.h\"\n" ++ + "#include \"Rts.h\"\n" ++ rts_includes ++ cplusplus_hdr) cplusplus_ftr