#include "HsVersions.h"
#ifndef OMIT_NATIVE_CODEGEN
+import UniqSupply ( mkSplitUniqSupply )
import AsmCodeGen ( nativeCodeGen )
#endif
import TyCon ( TyCon )
import Id ( Id )
-import Class ( Class )
import CoreSyn ( CoreBind )
+import OccurAnal ( occurAnalyseBinds )
import StgSyn ( StgBinding )
import AbsCSyn ( AbstractC )
import PprAbsC ( dumpRealC, writeRealC )
-import UniqSupply ( UniqSupply )
import Module ( Module )
import CmdLineOpts
-import ErrUtils ( dumpIfSet_dyn )
+import ErrUtils ( dumpIfSet_dyn, showPass )
import Outputable
import CmdLineOpts ( DynFlags, HscLang(..), dopt_OutName )
import TmpFiles ( newTempName )
-import UniqSupply ( mkSplitUniqSupply )
import IO ( IOMode(..), hClose, openFile, Handle )
+import IO ( hPutStr, stderr) -- Debugging
\end{code}
-- Dunno if the above comment is still meaningful now. JRS 001024.
- do let filenm = dopt_OutName dflags
- stub_names <- outputForeignStubs dflags c_code h_code
- case dopt_HscLang dflags of
- HscInterpreted -> return stub_names
- HscAsm -> outputAsm dflags filenm flat_abstractC
- >> return stub_names
- HscC -> outputC dflags filenm flat_abstractC
- >> return stub_names
- HscJava -> outputJava dflags filenm mod_name tycons core_binds
- >> return stub_names
+ do { showPass dflags "CodeOutput"
+ ; let filenm = dopt_OutName dflags
+ ; stub_names <- outputForeignStubs dflags c_code h_code
+ ; case dopt_HscLang dflags of
+ HscInterpreted -> return stub_names
+ HscAsm -> outputAsm dflags filenm flat_abstractC
+ >> return stub_names
+ HscC -> outputC dflags filenm flat_abstractC
+ >> return stub_names
+ HscJava -> outputJava dflags filenm mod_name tycons core_binds
+ >> return stub_names
+#ifdef ILX
+ HscILX -> outputIlx dflags filenm mod_name tycons stg_binds
+ >> return stub_names
+#endif
+ }
doOutput :: String -> (Handle -> IO ()) -> IO ()
doOutput filenm io_action
- = (do handle <- openFile filenm WriteMode
+ = (do hPutStr stderr ("Writing to" ++ filenm)
+ handle <- openFile filenm WriteMode
io_action handle
hClose handle)
`catch` (\err -> pprPanic "Failed to open or write code output file"
#ifndef OMIT_NATIVE_CODEGEN
= do ncg_uniqs <- mkSplitUniqSupply 'n'
- let (stix_final, ncg_output_d) = nativeCodeGen flat_absC ncg_uniqs
+ 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
dumpIfSet_dyn dflags Opt_D_dump_asm "Asm code" ncg_output_d
- doOutput filenm ( \f -> printForAsm f ncg_output_d)
+ _scc_ "OutputAsm" doOutput filenm ( \f -> printForAsm f ncg_output_d)
where
#else /* OMIT_NATIVE_CODEGEN */
\begin{code}
outputJava dflags filenm mod tycons core_binds
- = doOutput filenm (\ f -> printForUser f pp_java)
+ = doOutput filenm (\ f -> printForUser f alwaysQualify pp_java)
-- User style printing for now to keep indentation
where
- java_code = javaGen mod [{- Should be imports-}] tycons core_binds
+ occ_anal_binds = occurAnalyseBinds core_binds
+ -- Make sure we have up to date dead-var information
+ java_code = javaGen mod [{- Should be imports-}] tycons occ_anal_binds
pp_java = PrintJava.compilationUnit java_code
\end{code}
%************************************************************************
%* *
+\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}
%* *
%************************************************************************
-- turn out to be empty, in which case no file should be created.
outputForeignStubs_help is_header "" = return Nothing
outputForeignStubs_help is_header doc_str
- = newTempName suffix >>= \ fname ->
- writeFile fname (include_prefix ++ doc_str) >>
- return (Just suffix)
+ = do fname <- newTempName suffix
+ writeFile fname (include_prefix ++ doc_str)
+ return (Just fname)
where
suffix
| is_header = "h_stub"
| otherwise = "c_stub"
include_prefix
- | is_header = "#include \"Rts.h\"\n"
+ | is_header = "#include \"HsFFI.h\"\n"
| otherwise = "#include \"RtsAPI.h\"\n"
\end{code}