Add support of TNTC to llvm backend
[ghc-hetmet.git] / compiler / main / CodeOutput.lhs
index d2d7c7f..bc2dd1e 100644 (file)
@@ -9,9 +9,11 @@ module CodeOutput( codeOutput, outputForeignStubs ) where
 #include "HsVersions.h"
 
 #ifndef OMIT_NATIVE_CODEGEN
-import UniqSupply      ( mkSplitUniqSupply )
 import AsmCodeGen      ( nativeCodeGen )
 #endif
+import LlvmCodeGen ( llvmCodeGen )
+
+import UniqSupply      ( mkSplitUniqSupply )
 
 #ifdef JAVA
 import JavaGen         ( javaGen )
@@ -27,17 +29,18 @@ import Util
 import Cmm             ( RawCmm )
 import HscTypes
 import DynFlags
+import Config
 
 import ErrUtils                ( dumpIfSet_dyn, showPass, ghcExit )
 import Outputable
 import Module
 import Maybes          ( firstJust )
 
-import Distribution.Text
-import Directory       ( doesFileExist )
-import Monad           ( when )
-import IO
+import Control.Exception
+import Control.Monad
+import System.Directory
 import System.FilePath
+import System.IO
 \end{code}
 
 %************************************************************************
@@ -80,6 +83,7 @@ codeOutput dflags this_mod location foreign_stubs pkg_deps flat_abstractC
              HscInterpreted -> return ();
              HscAsm         -> outputAsm dflags filenm flat_abstractC;
              HscC           -> outputC dflags filenm flat_abstractC pkg_deps;
+             HscLlvm        -> outputLlvm dflags filenm flat_abstractC;
              HscJava        -> 
 #ifdef JAVA
                               outputJava dflags filenm mod_name tycons core_binds;
@@ -127,7 +131,7 @@ outputC dflags filenm flat_absC packages
                       _          -> "#include \""++h_file++"\""
 
        pkg_configs <- getPreloadPackagesAnd dflags packages
-       let pkg_names = map (display.package) pkg_configs
+       let pkg_names = map (display.sourcePackageId) pkg_configs
 
        doOutput filenm $ \ h -> do
          hPutStr h ("/* GHC_PACKAGES " ++ unwords pkg_names ++ "\n*/\n")
@@ -144,10 +148,10 @@ outputC dflags filenm flat_absC packages
 
 \begin{code}
 outputAsm :: DynFlags -> FilePath -> [RawCmm] -> IO ()
-outputAsm dflags filenm flat_absC
 
 #ifndef OMIT_NATIVE_CODEGEN
 
+outputAsm dflags filenm flat_absC
   = do ncg_uniqs <- mkSplitUniqSupply 'n'
 
        {-# SCC "OutputAsm" #-} doOutput filenm $
@@ -157,6 +161,7 @@ outputAsm dflags filenm flat_absC
 
 #else /* OMIT_NATIVE_CODEGEN */
 
+outputAsm _ _ _
   = pprPanic "This compiler was built without a native code generator"
             (text "Use -fvia-C instead")
 
@@ -166,6 +171,20 @@ outputAsm dflags filenm flat_absC
 
 %************************************************************************
 %*                                                                     *
+\subsection{LLVM}
+%*                                                                     *
+%************************************************************************
+
+\begin{code}
+outputLlvm :: DynFlags -> FilePath -> [RawCmm] -> IO ()
+outputLlvm dflags filenm flat_absC
+  = do ncg_uniqs <- mkSplitUniqSupply 'n'
+       doOutput filenm $ \f -> llvmCodeGen dflags f ncg_uniqs flat_absC
+\end{code}
+
+
+%************************************************************************
+%*                                                                     *
 \subsection{Java}
 %*                                                                     *
 %************************************************************************
@@ -224,6 +243,10 @@ outputForeignStubs dflags mod location stubs
               concatMap mk_include (includes rts_pkg)
            mk_include i = "#include \"" ++ i ++ "\"\n"
 
+            -- wrapper code mentions the ffi_arg type, which comes from ffi.h
+            ffi_includes | cLibFFI   = "#include \"ffi.h\"\n"
+                         | otherwise = ""
+
        stub_h_file_exists
            <- outputForeignStubs_help stub_h stub_h_output_w
                ("#include \"HsFFI.h\"\n" ++ cplusplus_hdr) cplusplus_ftr
@@ -236,6 +259,7 @@ outputForeignStubs dflags mod location stubs
                ("#define IN_STG_CODE 0\n" ++ 
                 "#include \"Rts.h\"\n" ++
                 rts_includes ++
+                ffi_includes ++
                 cplusplus_hdr)
                 cplusplus_ftr
           -- We're adding the default hc_header to the stub file, but this