@@ -39,6 +39,8 @@ import IRTS.CodegenCommon
39-- import RTS.PreC
39-- import RTS.PreC
40-- import RTS.CodegenC
40-- import RTS.CodegenC
42+import LLVM.General.Target
42import System.Console.Haskeline as H
44import System.Console.Haskeline as H
43import System.FilePath
45import System.FilePath
44import System.Exit
46import System.Exit
@@ -155,8 +157,8 @@ ideslaveProcess fn Execute = do process fn Execute
155 iResult ""
157 iResult ""
156ideslaveProcess fn (NewCompile f) = do process fn (NewCompile f)
158ideslaveProcess fn (NewCompile f) = do process fn (NewCompile f)
157 iResult ""
159 iResult ""
158−ideslaveProcess fn (Compile target f) = do process fn (Compile target f)
160+ideslaveProcess fn (Compile codegen f) = do process fn (Compile codegen f)
159− iResult ""
161+ iResult ""
160ideslaveProcess fn (LogLvl i) = do process fn (LogLvl i)
162ideslaveProcess fn (LogLvl i) = do process fn (LogLvl i)
161 iResult ""
163 iResult ""
162ideslaveProcess fn (Pattelab t) = process fn (Pattelab t)
164ideslaveProcess fn (Pattelab t) = process fn (Pattelab t)
@@ -465,7 +467,7 @@ process fn Execute = do (m, _) <- elabVal toplevel False
465-- (PRef (FC "main" 0) (NS (UN "main") ["main"]))
467-- (PRef (FC "main" 0) (NS (UN "main") ["main"]))
466 (tmpn, tmph) <- liftIO tempfile
468 (tmpn, tmph) <- liftIO tempfile
467 liftIO $ hClose tmph
469 liftIO $ hClose tmph
468− t <- target
470+ t <- codegen
469 compile t tmpn m
471 compile t tmpn m
470 liftIO $ system tmpn
472 liftIO $ system tmpn
471 return ()
473 return ()
@@ -476,11 +478,11 @@ process fn (NewCompile f)
476 [pexp $ PRef fc (NS (UN "main") ["Main"])])
478 [pexp $ PRef fc (NS (UN "main") ["Main"])])
477 compileEpic f m
479 compileEpic f m
478 where fc = FC "main" 0
480 where fc = FC "main" 0
479−process fn (Compile target f)
481+process fn (Compile codegen f)
480 = do (m, _) <- elabVal toplevel False
482 = do (m, _) <- elabVal toplevel False
481 (PApp fc (PRef fc (UN "run__IO"))
483 (PApp fc (PRef fc (UN "run__IO"))
482 [pexp $ PRef fc (NS (UN "main") ["Main"])])
484 [pexp $ PRef fc (NS (UN "main") ["Main"])])
483− compile target f m
485+ compile codegen f m
484 where fc = FC "main" 0
486 where fc = FC "main" 0
485process fn (LogLvl i) = setLogLevel i
487process fn (LogLvl i) = setLogLevel i
486-- Elaborate as if LHS of a pattern (debug command)
488-- Elaborate as if LHS of a pattern (debug command)
@@ -560,14 +562,14 @@ displayHelp = let vstr = showVersion version in
560 l ++ take (c1 - length l) (repeat ' ') ++
562 l ++ take (c1 - length l) (repeat ' ') ++
561 m ++ take (c2 - length m) (repeat ' ') ++ r ++ "\n"
563 m ++ take (c2 - length m) (repeat ' ') ++ r ++ "\n"
563−parseTarget :: String -> Target
565+parseCodegen :: String -> Codegen
564−parseTarget "C" = ViaC
566+parseCodegen "C" = ViaC
565−parseTarget "Java" = ViaJava
567+parseCodegen "Java" = ViaJava
566−parseTarget "bytecode" = Bytecode
568+parseCodegen "bytecode" = Bytecode
567−parseTarget "javascript" = ViaJavaScript
569+parseCodegen "javascript" = ViaJavaScript
568−parseTarget "node" = ViaNode
570+parseCodegen "node" = ViaNode
569−parseTarget "llvm" = ViaLLVM
571+parseCodegen "llvm" = ViaLLVM
570−parseTarget _ = error "unknown target" -- FIXME: partial function
572+parseCodegen _ = error "unknown codegen" -- FIXME: partial function
572parseArgs :: [String] -> [Opt]
574parseArgs :: [String] -> [Opt]
573parseArgs [] = []
575parseArgs [] = []
@@ -605,10 +607,17 @@ parseArgs ("-S":ns) = OutputTy Raw : (parseArgs ns)
605parseArgs ("-c":ns) = OutputTy Object : (parseArgs ns)
607parseArgs ("-c":ns) = OutputTy Object : (parseArgs ns)
606parseArgs ("--dumpdefuns":n:ns) = DumpDefun n : (parseArgs ns)
608parseArgs ("--dumpdefuns":n:ns) = DumpDefun n : (parseArgs ns)
607parseArgs ("--dumpcases":n:ns) = DumpCases n : (parseArgs ns)
609parseArgs ("--dumpcases":n:ns) = DumpCases n : (parseArgs ns)
608−parseArgs ("--target":n:ns) = UseTarget (parseTarget n) : (parseArgs ns)
610+parseArgs ("--codegen":n:ns) = UseCodegen (parseCodegen n) : (parseArgs ns)
609parseArgs ["--exec"] = InterpretScript "Main.main" : []
611parseArgs ["--exec"] = InterpretScript "Main.main" : []
610parseArgs ("--exec":expr:ns) = InterpretScript expr : parseArgs ns
612parseArgs ("--exec":expr:ns) = InterpretScript expr : parseArgs ns
611parseArgs ("-XTypeProviders":ns) = Extension TypeProviders : (parseArgs ns)
613parseArgs ("-XTypeProviders":ns) = Extension TypeProviders : (parseArgs ns)
614+parseArgs ("-O3":ns) = OptLevel 3 : parseArgs ns
615+parseArgs ("-O2":ns) = OptLevel 2 : parseArgs ns
616+parseArgs ("-O1":ns) = OptLevel 1 : parseArgs ns
617+parseArgs ("-O0":ns) = OptLevel 0 : parseArgs ns
618+parseArgs ("-O":n:ns) = OptLevel (read n) : parseArgs ns
619+parseArgs ("--target":n:ns) = TargetTriple n : parseArgs ns
620+parseArgs ("--cpu":n:ns) = TargetCPU n : parseArgs ns
612parseArgs (n:ns) = Filename n : (parseArgs ns)
621parseArgs (n:ns) = Filename n : (parseArgs ns)
614helphead =
623helphead =
@@ -637,10 +646,16 @@ idrisMain opts =
637 let bcs = opt getBC opts
646 let bcs = opt getBC opts
638 let vm = opt getFOVM opts
647 let vm = opt getFOVM opts
639 let pkgdirs = opt getPkgDir opts
648 let pkgdirs = opt getPkgDir opts
649+ trpl <- case opt getTriple opts of
650+ [] -> liftIO $ getDefaultTargetTriple
651+ xs -> return (last xs)
652+ tcpu <- case opt getCPU opts of
653+ [] -> liftIO $ getHostCPUName
654+ xs -> return (last xs)
640 let outty = case opt getOutputTy opts of
655 let outty = case opt getOutputTy opts of
641 [] -> Executable
656 [] -> Executable
642 xs -> last xs
657 xs -> last xs
643− let tgt = case opt getTarget opts of
658+ let cgn = case opt getCodegen opts of
644 [] -> ViaC
659 [] -> ViaC
645 xs -> last xs
660 xs -> last xs
646 script <- case opt getExecScript opts of
661 script <- case opt getExecScript opts of
@@ -657,13 +672,15 @@ idrisMain opts =
657 setVerbose runrepl
672 setVerbose runrepl
658 setCmdLine opts
673 setCmdLine opts
659 setOutputTy outty
674 setOutputTy outty
660− setTarget tgt
675+ setCodegen cgn
676+ setTargetTriple trpl
661 when (Verbose `elem` opts) $ setVerbose True
678 when (Verbose `elem` opts) $ setVerbose True
662 mapM_ makeOption opts
679 mapM_ makeOption opts
663 -- if we have the --fovm flag, drop into the first order VM testing
680 -- if we have the --fovm flag, drop into the first order VM testing
664 case vm of
681 case vm of
665 [] -> return ()
682 [] -> return ()
666− xs -> liftIO $ mapM_ (fovm tgt outty) xs
683+ xs -> liftIO $ mapM_ (fovm cgn outty) xs
667 -- if we have the --bytecode flag, drop into the bytecode assembler
684 -- if we have the --bytecode flag, drop into the bytecode assembler
668 case bcs of
685 case bcs of
669 [] -> return ()
686 [] -> return ()
@@ -684,7 +701,7 @@ idrisMain opts =
684 ok <- noErrors
701 ok <- noErrors
685 when ok $ case output of
702 when ok $ case output of
686 [] -> return ()
703 [] -> return ()
687− (o:_) -> process "" (Compile tgt o)
704+ (o:_) -> process "" (Compile cgn o)
688 when ok $ case newoutput of
705 when ok $ case newoutput of
689 [] -> return ()
706 [] -> return ()
690 (o:_) -> process "" (NewCompile o)
707 (o:_) -> process "" (NewCompile o)
@@ -758,9 +775,9 @@ getPkgClean :: Opt -> Maybe String
758getPkgClean (PkgClean str) = Just str
775getPkgClean (PkgClean str) = Just str
759getPkgClean _ = Nothing
776getPkgClean _ = Nothing
761−getTarget :: Opt -> Maybe Target
778+getCodegen :: Opt -> Maybe Codegen
762−getTarget (UseTarget x) = Just x
779+getCodegen (UseCodegen x) = Just x
763−getTarget _ = Nothing
780+getCodegen _ = Nothing
765getExecScript :: Opt -> Maybe String
782getExecScript :: Opt -> Maybe String
766getExecScript (InterpretScript expr) = Just expr
783getExecScript (InterpretScript expr) = Just expr
@@ -774,6 +791,14 @@ getLanguageExt :: Opt -> Maybe LanguageExt
774getLanguageExt (Extension e) = Just e
791getLanguageExt (Extension e) = Just e
775getLanguageExt _ = Nothing
792getLanguageExt _ = Nothing
794+getTriple :: Opt -> Maybe String
795+getTriple (TargetTriple x) = Just x
796+getTriple _ = Nothing
798+getCPU :: Opt -> Maybe String
799+getCPU (TargetCPU x) = Just x
777opt :: (Opt -> Maybe a) -> [Opt] -> [a]
802opt :: (Opt -> Maybe a) -> [Opt] -> [a]
778opt = mapMaybe
803opt = mapMaybe