Add new LLVM code generator to GHC. (Version 2)
[ghc-hetmet.git] / compiler / main / SysTools.lhs
index cfa43ff..29889db 100644 (file)
@@ -18,6 +18,9 @@ module SysTools (
         runAs, runLink,          -- [Option] -> IO ()
         runMkDLL,
         runWindres,
+        runLlvmAs,
+        runLlvmOpt,
+        runLlvmLlc,
 
         touch,                  -- String -> String -> IO ()
         copy,
@@ -159,6 +162,7 @@ initSysTools mbMinusB dflags0
         ; let installed :: FilePath -> FilePath
               installed file = top_dir </> file
               installed_mingw_bin file = top_dir </> ".." </> "mingw" </> "bin" </> file
+              installed_perl_bin file = top_dir </> ".." </> "perl" </> file
 
         ; let pkgconfig_path = installed "package.conf.d"
               ghc_usage_msg_path  = installed "ghc-usage.txt"
@@ -184,7 +188,7 @@ initSysTools mbMinusB dflags0
                 | isWindowsHost = installed_mingw_bin "gcc"
                 | otherwise     = cGCC
               perl_path
-                | isWindowsHost = installed cGHC_PERL
+                | isWindowsHost = installed_perl_bin cGHC_PERL
                 | otherwise     = cGHC_PERL
               -- 'touch' is a GHC util for Windows
               touch_path
@@ -218,6 +222,11 @@ initSysTools mbMinusB dflags0
         ; let   as_prog  = gcc_prog
                 ld_prog  = gcc_prog
 
+        -- figure out llvm location. (TODO: Acutally implement).
+        ; let la_prog = "llvm-as"
+              lc_prog = "llc"
+              lo_prog = "opt"
+
         ; return dflags1{
                         ghcUsagePath = ghc_usage_msg_path,
                         ghciUsagePath = ghci_usage_msg_path,
@@ -234,7 +243,10 @@ initSysTools mbMinusB dflags0
                         pgm_dll = (mkdll_prog,mkdll_args),
                         pgm_T   = touch_path,
                         pgm_sysman = top_dir ++ "/ghc/rts/parallel/SysMan",
-                        pgm_windres = windres_path
+                        pgm_windres = windres_path,
+                        pgm_la  = (la_prog,[]),
+                        pgm_lo  = (lo_prog,[]),
+                        pgm_lc  = (lc_prog,[])
                         -- Hans: this isn't right in general, but you can
                         -- elaborate it in the same way as the others
                 }
@@ -380,6 +392,21 @@ runAs dflags args = do
   mb_env <- getGccEnv args1
   runSomethingFiltered dflags id "Assembler" p args1 mb_env
 
+runLlvmAs :: DynFlags -> [Option] -> IO ()
+runLlvmAs dflags args = do
+  let (p,args0) = pgm_la dflags
+  runSomething dflags "LLVM Assembler" p (args0++args)
+
+runLlvmOpt :: DynFlags -> [Option] -> IO ()
+runLlvmOpt dflags args = do
+  let (p,args0) = pgm_lo dflags
+  runSomething dflags "LLVM Optimiser" p (args0++args)
+
+runLlvmLlc :: DynFlags -> [Option] -> IO ()
+runLlvmLlc dflags args = do
+  let (p,args0) = pgm_lc dflags
+  runSomething dflags "LLVM Compiler" p (args0++args)
+
 runLink :: DynFlags -> [Option] -> IO ()
 runLink dflags args = do
   let (p,args0) = pgm_l dflags
@@ -479,7 +506,7 @@ newTempName :: DynFlags -> Suffix -> IO FilePath
 newTempName dflags extn
   = do d <- getTempDir dflags
        x <- getProcessID
-       findTempName (d ++ "/ghc" ++ show x ++ "_") 0
+       findTempName (d </> "ghc" ++ show x ++ "_") 0
   where
     findTempName :: FilePath -> Integer -> IO FilePath
     findTempName prefix x
@@ -499,7 +526,7 @@ getTempDir dflags@(DynFlags{tmpDir=tmp_dir})
        case lookupFM mapping tmp_dir of
            Nothing ->
                do x <- getProcessID
-                  let prefix = tmp_dir ++ "/ghc" ++ show x ++ "_"
+                  let prefix = tmp_dir </> "ghc" ++ show x ++ "_"
                   let
                       mkTempDir :: Integer -> IO FilePath
                       mkTempDir x