@@ -39,6 +39,8 @@ import IRTS.CodegenCommon
3939-- import RTS.PreC
4040-- import RTS.CodegenC
4141
42+import LLVM.General.Target
43+
4244import System.Console.Haskeline as H
4345import System.FilePath
4446import System.Exit
@@ -155,8 +157,8 @@ ideslaveProcess fn Execute = do process fn Execute
155157 iResult ""
156158ideslaveProcess fn (NewCompile f) = do process fn (NewCompile f)
157159 iResult ""
158−ideslaveProcess fn (Compile target f) = do process fn (Compile target f)
159− iResult ""
160+ideslaveProcess fn (Compile codegen f) = do process fn (Compile codegen f)
161+ iResult ""
160162ideslaveProcess fn (LogLvl i) = do process fn (LogLvl i)
161163 iResult ""
162164ideslaveProcess fn (Pattelab t) = process fn (Pattelab t)
@@ -465,7 +467,7 @@ process fn Execute = do (m, _) <- elabVal toplevel False
465467-- (PRef (FC "main" 0) (NS (UN "main") ["main"]))
466468 (tmpn, tmph) <- liftIO tempfile
467469 liftIO $ hClose tmph
468− t <- target
470+ t <- codegen
469471 compile t tmpn m
470472 liftIO $ system tmpn
471473 return ()
@@ -476,11 +478,11 @@ process fn (NewCompile f)
476478 [pexp $ PRef fc (NS (UN "main") ["Main"])])
477479 compileEpic f m
478480 where fc = FC "main" 0
479−process fn (Compile target f)
481+process fn (Compile codegen f)
480482 = do (m, _) <- elabVal toplevel False
481483 (PApp fc (PRef fc (UN "run__IO"))
482484 [pexp $ PRef fc (NS (UN "main") ["Main"])])
483− compile target f m
485+ compile codegen f m
484486 where fc = FC "main" 0
485487process fn (LogLvl i) = setLogLevel i
486488-- Elaborate as if LHS of a pattern (debug command)
@@ -560,14 +562,14 @@ displayHelp = let vstr = showVersion version in
560562 l ++ take (c1 - length l) (repeat ' ') ++
561563 m ++ take (c2 - length m) (repeat ' ') ++ r ++ "\n"
562564
563−parseTarget :: String -> Target
564−parseTarget "C" = ViaC
565−parseTarget "Java" = ViaJava
566−parseTarget "bytecode" = Bytecode
567−parseTarget "javascript" = ViaJavaScript
568−parseTarget "node" = ViaNode
569−parseTarget "llvm" = ViaLLVM
570−parseTarget _ = error "unknown target" -- FIXME: partial function
565+parseCodegen :: String -> Codegen
566+parseCodegen "C" = ViaC
567+parseCodegen "Java" = ViaJava
568+parseCodegen "bytecode" = Bytecode
569+parseCodegen "javascript" = ViaJavaScript
570+parseCodegen "node" = ViaNode
571+parseCodegen "llvm" = ViaLLVM
572+parseCodegen _ = error "unknown codegen" -- FIXME: partial function
571573
572574parseArgs :: [String] -> [Opt]
573575parseArgs [] = []
@@ -605,10 +607,17 @@ parseArgs ("-S":ns) = OutputTy Raw : (parseArgs ns)
605607parseArgs ("-c":ns) = OutputTy Object : (parseArgs ns)
606608parseArgs ("--dumpdefuns":n:ns) = DumpDefun n : (parseArgs ns)
607609parseArgs ("--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)
609611parseArgs ["--exec"] = InterpretScript "Main.main" : []
610612parseArgs ("--exec":expr:ns) = InterpretScript expr : parseArgs ns
611613parseArgs ("-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
612621parseArgs (n:ns) = Filename n : (parseArgs ns)
613622
614623helphead =
@@ -637,10 +646,16 @@ idrisMain opts =
637646 let bcs = opt getBC opts
638647 let vm = opt getFOVM opts
639648 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)
640655 let outty = case opt getOutputTy opts of
641656 [] -> Executable
642657 xs -> last xs
643− let tgt = case opt getTarget opts of
658+ let cgn = case opt getCodegen opts of
644659 [] -> ViaC
645660 xs -> last xs
646661 script <- case opt getExecScript opts of
@@ -657,13 +672,15 @@ idrisMain opts =
657672 setVerbose runrepl
658673 setCmdLine opts
659674 setOutputTy outty
660− setTarget tgt
675+ setCodegen cgn
676+ setTargetTriple trpl
677+ setTargetCPU tcpu
661678 when (Verbose `elem` opts) $ setVerbose True
662679 mapM_ makeOption opts
663680 -- if we have the --fovm flag, drop into the first order VM testing
664681 case vm of
665682 [] -> return ()
666− xs -> liftIO $ mapM_ (fovm tgt outty) xs
683+ xs -> liftIO $ mapM_ (fovm cgn outty) xs
667684 -- if we have the --bytecode flag, drop into the bytecode assembler
668685 case bcs of
669686 [] -> return ()
@@ -684,7 +701,7 @@ idrisMain opts =
684701 ok <- noErrors
685702 when ok $ case output of
686703 [] -> return ()
687− (o:_) -> process "" (Compile tgt o)
704+ (o:_) -> process "" (Compile cgn o)
688705 when ok $ case newoutput of
689706 [] -> return ()
690707 (o:_) -> process "" (NewCompile o)
@@ -758,9 +775,9 @@ getPkgClean :: Opt -> Maybe String
758775getPkgClean (PkgClean str) = Just str
759776getPkgClean _ = Nothing
760777
761−getTarget :: Opt -> Maybe Target
762−getTarget (UseTarget x) = Just x
763−getTarget _ = Nothing
778+getCodegen :: Opt -> Maybe Codegen
779+getCodegen (UseCodegen x) = Just x
780+getCodegen _ = Nothing
764781
765782getExecScript :: Opt -> Maybe String
766783getExecScript (InterpretScript expr) = Just expr
@@ -774,6 +791,14 @@ getLanguageExt :: Opt -> Maybe LanguageExt
774791getLanguageExt (Extension e) = Just e
775792getLanguageExt _ = Nothing
776793
794+getTriple :: Opt -> Maybe String
795+getTriple (TargetTriple x) = Just x
796+getTriple _ = Nothing
797+
798+getCPU :: Opt -> Maybe String
799+getCPU (TargetCPU x) = Just x
800+getCPU _ = Nothing
801+
777802opt :: (Opt -> Maybe a) -> [Opt] -> [a]
778803opt = mapMaybe
779804