\section{Code output phase}
\begin{code}
+{-# OPTIONS_GHC -w #-}
+-- The above warning supression flag is a temporary kludge.
+-- While working on this module you are encouraged to remove it and fix
+-- any warnings in the module. See
+-- http://hackage.haskell.org/trac/ghc/wiki/WorkingConventions#Warnings
+-- for details
+
module CodeOutput( codeOutput, outputForeignStubs ) where
#include "HsVersions.h"
import AsmCodeGen ( nativeCodeGen )
#endif
-#ifdef ILX
-import IlxGen ( ilxGen )
-#endif
-
#ifdef JAVA
import JavaGen ( javaGen )
import qualified PrintJava
import PprC ( writeCs )
import CmmLint ( cmmLint )
import Packages
+import PackageConfig ( rtsPackageId )
import Util
import FastString ( unpackFS )
-import Cmm ( Cmm )
+import Cmm ( RawCmm )
import HscTypes
import DynFlags
+
import ErrUtils ( dumpIfSet_dyn, showPass, ghcExit )
import Outputable
import Pretty ( Mode(..), printDoc )
-import Module ( Module, ModLocation(..) )
+import Module ( Module, ModLocation(..), moduleName )
import List ( nub )
import Maybes ( firstJust )
-> ModLocation
-> ForeignStubs
-> [PackageId]
- -> [Cmm] -- Compiled C--
+ -> [RawCmm] -- Compiled C--
-> IO (Bool{-stub_h_exists-}, Bool{-stub_c_exists-})
codeOutput dflags this_mod location foreign_stubs pkg_deps flat_abstractC
#else
panic "Java support not compiled into this ghc";
#endif
- HscILX ->
-#ifdef ILX
- let tycons = typeEnvTyCons type_env in
- outputIlx dflags filenm mod_name tycons stg_binds;
-#else
- panic "ILX support not compiled into this ghc";
-#endif
}
; return stubs_exist
}
-- * -#include options from the cmdline and OPTIONS pragmas
-- * the _stub.h file, if there is one.
--
- pkg_configs <- getExplicitPackagesAnd dflags packages
+ pkg_configs <- getPreloadPackagesAnd dflags packages
let pkg_names = map (showPackageId.package) pkg_configs
c_includes <- getPackageCIncludes pkg_configs
ffi_decl_headers
= case foreign_stubs of
- NoStubs -> []
- ForeignStubs _ _ fdhs _ -> map unpackFS (nub fdhs)
+ NoStubs -> []
+ ForeignStubs _ _ fdhs -> map unpackFS (nub fdhs)
-- Remove duplicates, because distinct foreign import decls
-- may cite the same #include. Order doesn't matter.
all_headers = c_includes
++ reverse cmdline_includes
++ ffi_decl_headers
-
+
let cc_injects = unlines (map mk_include all_headers)
mk_include h_file =
case h_file of
hPutStrLn h ("#include \"" ++ (filenameOf stub_h) ++ "\"")
writeCs dflags h flat_absC
where
- (_, stub_h) = mkStubPaths dflags mod location
+ (_, stub_h) = mkStubPaths dflags (moduleName mod) location
\end{code}
#ifndef OMIT_NATIVE_CODEGEN
= do ncg_uniqs <- mkSplitUniqSupply 'n'
- 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
+
+ {-# SCC "OutputAsm" #-} doOutput filenm $
+ \f -> {-# SCC "NativeCodeGen" #-}
+ nativeCodeGen dflags f ncg_uniqs flat_absC
where
#else /* OMIT_NATIVE_CODEGEN */
%************************************************************************
%* *
-\subsection{Ilx}
-%* *
-%************************************************************************
-
-\begin{code}
-#ifdef ILX
-outputIlx dflags filename mod tycons stg_binds
- = doOutput filename (\ f -> printForC f pp_ilx)
- where
- pp_ilx = ilxGen mod tycons stg_binds
-#endif
-\end{code}
-
-
-%************************************************************************
-%* *
\subsection{Foreign import/export}
%* *
%************************************************************************
stub_h_exists <- doesFileExist stub_h
return (stub_h_exists, stub_c_exists)
- | ForeignStubs h_code c_code _ _ <- stubs
+ | ForeignStubs h_code c_code _ <- stubs
= do
let
stub_c_output_d = pprCode CStyle c_code
"Foreign export header file" stub_h_output_d
-- we need the #includes from the rts package for the stub files
- let rtsid = rtsPackageId (pkgState dflags)
- rts_includes
- | ExtPackage pid <- rtsid =
- let rts_pkg = getPackageDetails (pkgState dflags) pid in
- concatMap mk_include (includes rts_pkg)
- | otherwise = []
+ let rts_includes =
+ let rts_pkg = getPackageDetails (pkgState dflags) rtsPackageId in
+ concatMap mk_include (includes rts_pkg)
mk_include i = "#include \"" ++ i ++ "\"\n"
stub_h_file_exists
return (stub_h_file_exists, stub_c_file_exists)
where
- (stub_c, stub_h) = mkStubPaths dflags mod location
+ (stub_c, stub_h) = mkStubPaths dflags (moduleName mod) location
cplusplus_hdr = "#ifdef __cplusplus\nextern \"C\" {\n#endif\n"
cplusplus_ftr = "#ifdef __cplusplus\n}\n#endif\n"