Adds smart constructors and support for MIPS `(x)` references.
[hsc2hs.git] / DirectCodegen.hs
index e09cc86..9bfdd42 100644 (file)
@@ -7,20 +7,24 @@ compiled and run; the output of that program is the .hs file.
 -}
 
 import Data.Char                ( isAlphaNum, toUpper )
+import Data.Foldable            ( foldl' )
 import Control.Monad            ( when, forM_ )
 
 import System.Exit              ( ExitCode(..), exitWith )
+import System.FilePath          ( normalise )
 
 import C
 import Common
 import Flags
 import HSCParser
+import UtilsCodegen
 
 outputDirect :: Config -> FilePath -> FilePath -> FilePath -> String -> [Token] -> IO ()
 outputDirect config outName outDir outBase name toks = do
 
     let beVerbose    = cVerbose config
         flags        = cFlags config
+        enableCol    = cColumn config
         cProgName    = outDir++outBase++"_hsc_make.c"
         oProgName    = outDir++outBase++"_hsc_make.o"
         progName     = outDir++outBase++"_hsc_make"
@@ -29,12 +33,12 @@ outputDirect config outName outDir outBase name toks = do
 -- via GHC has changed a few times, so this seems to be the only way...  :-P * * *
                           ++ ".exe"
 #endif
-       outHFile     = outBase++"_hsc.h"
+        outHFile     = outBase++"_hsc.h"
         outHName     = outDir++outHFile
         outCName     = outDir++outBase++"_hsc.c"
 
     let execProgName
-            | null outDir = dosifyPath ("./" ++ progName)
+            | null outDir = normalise ("./" ++ progName)
             | otherwise   = progName
 
     let specials = [(pos, key, arg) | Special pos key arg <- toks]
@@ -51,8 +55,8 @@ outputDirect config outName outDir outBase name toks = do
                       | otherwise    = '_'
 
     when (cCrossSafe config) $
-        forM_ specials (\ (SourcePos file line,key,_) ->
-            when (not $ key `elem` ["const","offset","size","peek","poke","ptr",
+        forM_ specials (\ (SourcePos file line _,key,_) ->
+            when (not $ key `elem` ["const","offset","size","alignment","peek","poke","ptr",
                                     "type","enum","error","warning","include","define","undef",
                                     "if","ifdef","ifndef", "elif","else","endif"]) $
              die (file ++ ":" ++ show line ++ " directive \"" ++ key ++ "\" is not safe for cross-compilation"))
@@ -61,27 +65,28 @@ outputDirect config outName outDir outBase name toks = do
         outTemplateHeaderCProg (cTemplate config)++
         concatMap outFlagHeaderCProg flags++
         concatMap outHeaderCProg specials++
-        "\nint main (int argc, char *argv [])\n{\n"++
+        "\nint main (void)\n{\n"++
         outHeaderHs flags (if needsH then Just outHName else Nothing) specials++
-        outHsLine (SourcePos name 0)++
-        concatMap outTokenHs toks++
+        outHsLine (SourcePos name 0 1)++
+        fst (foldl' (outTokenHs enableCol) (id, (True, True)) toks) ""++
         "    return 0;\n}\n"
 
     when (cNoCompile config) $ exitWith ExitSuccess
 
     rawSystemL ("compiling " ++ cProgName) beVerbose (cCompiler config)
-       (  ["-c"]
+        (  ["-c"]
         ++ [cProgName]
         ++ ["-o", oProgName]
         ++ [f | CompFlag f <- flags]
-       )
-    possiblyRemove cProgName $ do
+        )
+    possiblyRemove cProgName $
+        withUtilsObject config outDir outBase $ \oUtilsName -> do
 
       rawSystemL ("linking " ++ oProgName) beVerbose (cLinker config)
-        (  [oProgName]
+        (  [oProgName, oUtilsName]
         ++ ["-o", progName]
         ++ [f | LinkFlag f <- flags]
-       )
+        )
       possiblyRemove oProgName $ do
 
         rawSystemWithStdOutL ("running " ++ execProgName) beVerbose execProgName [] outName
@@ -90,9 +95,6 @@ outputDirect config outName outDir outBase name toks = do
           when needsH $ writeBinaryFile outHName $
             "#ifndef "++includeGuard++"\n" ++
             "#define "++includeGuard++"\n" ++
-            "#if __GLASGOW_HASKELL__ && __GLASGOW_HASKELL__ < 409\n" ++
-            "#include <Rts.h>\n" ++
-            "#endif\n" ++
             "#include <HsFFI.h>\n" ++
             "#if __NHC__\n" ++
             "#undef HsChar\n" ++
@@ -107,4 +109,3 @@ outputDirect config outName outDir outBase name toks = do
             concatMap outTokenC specials
             -- NB. outHFile not outHName; works better when processed
             -- by gcc or mkdependC.
-