| SplitMangle -- after mangler if splitting
| SplitAs
| As
- | LlvmAs -- LLVM assembly to bitcode file
- | LlvmOpt -- Run LLVM opt tool over llvm assembly
- | LlvmLlc -- LLVM bitcode to native assembly
+ | LlvmOpt -- Run LLVM opt tool over llvm assembly
+ | LlvmLlc -- LLVM bitcode to native assembly
| CmmCpp -- pre-process Cmm source
| Cmm -- parse & compile Cmm code
eqPhase SplitMangle SplitMangle = True
eqPhase SplitAs SplitAs = True
eqPhase As As = True
-eqPhase LlvmAs LlvmAs = True
eqPhase LlvmOpt LlvmOpt = True
eqPhase LlvmLlc LlvmLlc = True
eqPhase CmmCpp CmmCpp = True
nextPhase Mangle = SplitMangle
nextPhase SplitMangle = As
nextPhase As = SplitAs
-nextPhase LlvmAs = LlvmOpt
-nextPhase LlvmOpt = LlvmLlc
-nextPhase LlvmLlc = As
+nextPhase LlvmOpt = LlvmLlc
+nextPhase LlvmLlc = As
nextPhase SplitAs = StopLn
nextPhase Ccpp = As
nextPhase Cc = As
startPhase "split_s" = SplitMangle
startPhase "s" = As
startPhase "S" = As
-startPhase "ll" = LlvmAs
-startPhase "bc" = LlvmOpt
-startPhase "opt_bc" = LlvmLlc
+startPhase "ll" = LlvmOpt
+startPhase "bc" = LlvmLlc
startPhase "o" = StopLn
startPhase "cmm" = CmmCpp
startPhase "cmmcpp" = Cmm
phaseInputExt Mangle = "raw_s"
phaseInputExt SplitMangle = "split_s" -- not really generated
phaseInputExt As = "s"
-phaseInputExt LlvmAs = "ll"
-phaseInputExt LlvmOpt = "bc"
-phaseInputExt LlvmLlc = "opt_bc"
+phaseInputExt LlvmOpt = "ll"
+phaseInputExt LlvmLlc = "bc"
phaseInputExt SplitAs = "split_s" -- not really generated
phaseInputExt CmmCpp = "cmm"
phaseInputExt Cmm = "cmmcpp"
haskellish_src_suffixes = haskellish_user_src_suffixes ++
[ "hspp", "hscpp", "hcr", "cmm" ]
haskellish_suffixes = haskellish_src_suffixes ++ ["hc", "raw_s"]
-cish_suffixes = [ "c", "cpp", "C", "cc", "cxx", "s", "S", "ll", "bc", "opt_bc" ]
+cish_suffixes = [ "c", "cpp", "C", "cc", "cxx", "s", "S", "ll", "bc" ]
extcoreish_suffixes = [ "hcr" ]
-- Will not be deleted as temp files:
haskellish_user_src_suffixes = [ "hs", "lhs", "hs-boot", "lhs-boot" ]
keep_hc = dopt Opt_KeepHcFiles dflags
keep_raw_s = dopt Opt_KeepRawSFiles dflags
keep_s = dopt Opt_KeepSFiles dflags
- keep_bc = dopt Opt_KeepLlvmFiles dflags
+ keep_bc = dopt Opt_KeepLlvmFiles dflags
myPhaseInputExt HCc = hcsuf
myPhaseInputExt StopLn = osuf
StopLn -> True
Mangle | keep_raw_s -> True
As | keep_s -> True
- LlvmAs | keep_bc -> True
- LlvmOpt | keep_bc -> True
+ LlvmOpt | keep_bc -> True
HCc | keep_hc -> True
_other -> False
-----------------------------------------------------------------------------
--- LlvmAs phase
+-- LlvmOpt phase
-runPhase LlvmAs _stop hsc_env _basename _suff input_fn get_output_fn maybe_loc
+runPhase LlvmOpt _stop hsc_env _basename _suff input_fn get_output_fn maybe_loc
= liftIO $ do
- let dflags = hsc_dflags hsc_env
- let la_opts = getOpts dflags opt_la
-
- output_fn <- get_output_fn dflags LlvmOpt maybe_loc
-
- SysTools.runLlvmAs dflags
- (map SysTools.Option la_opts
- ++ [ SysTools.FileOption "" input_fn,
- SysTools.Option "-o", SysTools.FileOption "" output_fn])
-
- return (LlvmOpt, dflags, maybe_loc, output_fn)
+ let dflags = hsc_dflags hsc_env
+ let lo_opts = getOpts dflags opt_lo
+ let opt_lvl = max 0 (min 2 $ optLevel dflags)
+ output_fn <- get_output_fn dflags LlvmLlc maybe_loc
------------------------------------------------------------------------------
--- LlvmOpt phase
+ SysTools.runLlvmOpt dflags
+ (map SysTools.Option lo_opts
+ ++ [ SysTools.FileOption "" input_fn,
+ SysTools.Option (llvmOpts !! opt_lvl),
+ SysTools.Option "-o",
+ SysTools.FileOption "" output_fn])
-runPhase LlvmOpt _stop hsc_env _basename _suff input_fn get_output_fn maybe_loc
- = liftIO $ do
- let dflags = hsc_dflags hsc_env
- let lo_opts = getOpts dflags opt_lo
- let opt_lvl = max 0 (min 2 $ optLevel dflags)
-
- -- only run if > 0 OR opt options given by user
- if opt_lvl /= 0 || lo_opts /= []
- then do
- output_fn <- get_output_fn dflags LlvmLlc maybe_loc
-
- SysTools.runLlvmOpt dflags
- (map SysTools.Option lo_opts
- ++ [ SysTools.FileOption "" input_fn,
- SysTools.Option (llvmOpts !! opt_lvl),
- SysTools.Option "-o",
- SysTools.FileOption "" output_fn])
-
- return (LlvmLlc, dflags, maybe_loc, output_fn)
-
- else
- return (LlvmLlc, dflags, maybe_loc, input_fn)
+ return (LlvmLlc, dflags, maybe_loc, output_fn)
where
- llvmOpts = ["-O1", "-O2", "-O3"]
+ -- we always run Opt since we rely on it to fix up some pretty
+ -- big deficiencies in the code we generate
+ llvmOpts = ["-mem2reg", "-O1", "-O2"]
-----------------------------------------------------------------------------
runPhase LlvmLlc _stop hsc_env _basename _suff input_fn get_output_fn maybe_loc
= liftIO $ do
- let dflags = hsc_dflags hsc_env
- let lc_opts = getOpts dflags opt_lc
- let opt_lvl = max 0 (min 2 $ optLevel dflags)
+ let dflags = hsc_dflags hsc_env
+ let lc_opts = getOpts dflags opt_lc
+ let opt_lvl = max 0 (min 2 $ optLevel dflags)
- output_fn <- get_output_fn dflags As maybe_loc
+ output_fn <- get_output_fn dflags As maybe_loc
- SysTools.runLlvmLlc dflags
- (map SysTools.Option lc_opts
- ++ [ -- SysTools.Option "-tailcallopt",
+ SysTools.runLlvmLlc dflags
+ (map SysTools.Option lc_opts
+ ++ [ -- SysTools.Option "-tailcallopt",
SysTools.Option (llvmOpts !! opt_lvl),
SysTools.FileOption "" input_fn,
- SysTools.Option "-o", SysTools.FileOption "" output_fn])
+ SysTools.Option "-o", SysTools.FileOption "" output_fn])
- return (As, dflags, maybe_loc, output_fn)
+ return (As, dflags, maybe_loc, output_fn)
where
- llvmOpts = ["", "-O2", "-O3"]
+ llvmOpts = ["-O1", "-O2", "-O3"]
-- warning suppression
HscC -> HCc
HscAsm | dopt Opt_SplitObjs dflags -> SplitMangle
| otherwise -> As
- HscLlvm -> LlvmAs
+ HscLlvm -> LlvmOpt
HscNothing -> StopLn
HscInterpreted -> StopLn
_other -> StopLn
opt_a :: [String],
opt_l :: [String],
opt_windres :: [String],
- opt_la :: [String], -- LLVM: llvm-as assembler
opt_lo :: [String], -- LLVM: llvm optimiser
opt_lc :: [String], -- LLVM: llc static compiler
pgm_T :: String,
pgm_sysman :: String,
pgm_windres :: String,
- pgm_la :: (String,[Option]), -- LLVM: llvm-as assembler
pgm_lo :: (String,[Option]), -- LLVM: opt llvm optimiser
pgm_lc :: (String,[Option]), -- LLVM: llc static compiler
opt_m = [],
opt_l = [],
opt_windres = [],
- opt_la = [],
opt_lo = [],
opt_lc = [],
pgm_T = panic "defaultDynFlags: No pgm_T",
pgm_sysman = panic "defaultDynFlags: No pgm_sysman",
pgm_windres = panic "defaultDynFlags: No pgm_windres",
- pgm_la = panic "defaultDynFlags: No pgm_la",
pgm_lo = panic "defaultDynFlags: No pgm_lo",
pgm_lc = panic "defaultDynFlags: No pgm_lc",
-- end of initSysTools values
setObjectDir, setHiDir, setStubDir, setOutputDir, setDylibInstallName,
setObjectSuf, setHiSuf, setHcSuf, parseDynLibLoaderMode,
setPgmP, setPgmL, setPgmF, setPgmc, setPgmm, setPgms, setPgma, setPgml, setPgmdll, setPgmwindres,
- setPgmla, setPgmlo, setPgmlc,
- addOptL, addOptP, addOptF, addOptc, addOptm, addOpta, addOptl, addOptwindres, addOptla, addOptlo,
- addOptlc, addCmdlineFramework, addHaddockOpts
+ setPgmlo, setPgmlc,
+ addOptL, addOptP, addOptF, addOptc, addOptm, addOpta, addOptl, addOptwindres, addOptlo, addOptlc,
+ addCmdlineFramework, addHaddockOpts
:: String -> DynFlags -> DynFlags
setOutputFile, setOutputHi, setDumpPrefixForce
:: Maybe String -> DynFlags -> DynFlags
setPgml f d = d{ pgm_l = (f,[])}
setPgmdll f d = d{ pgm_dll = (f,[])}
setPgmwindres f d = d{ pgm_windres = f}
-setPgmla f d = d{ pgm_la = (f,[])}
setPgmlo f d = d{ pgm_lo = (f,[])}
setPgmlc f d = d{ pgm_lc = (f,[])}
addOpta f d = d{ opt_a = f : opt_a d}
addOptl f d = d{ opt_l = f : opt_l d}
addOptwindres f d = d{ opt_windres = f : opt_windres d}
-addOptla f d = d{ opt_la = f : opt_la d}
addOptlo f d = d{ opt_lo = f : opt_lo d}
addOptlc f d = d{ opt_lc = f : opt_lc d}
------- Specific phases --------------------------------------------
-- need to appear before -pgmL to be parsed as LLVM flags.
- , Flag "pgmla" (HasArg (upd . setPgmla)) Supported
, Flag "pgmlo" (HasArg (upd . setPgmlo)) Supported
, Flag "pgmlc" (HasArg (upd . setPgmlc)) Supported
, Flag "pgmwindres" (HasArg (upd . setPgmwindres)) Supported
-- need to appear before -optl/-opta to be parsed as LLVM flags.
- , Flag "optla" (HasArg (upd . addOptla)) Supported
, Flag "optlo" (HasArg (upd . addOptlo)) Supported
, Flag "optlc" (HasArg (upd . addOptlc)) Supported
runAs, runLink, -- [Option] -> IO ()
runMkDLL,
runWindres,
- runLlvmAs,
runLlvmOpt,
runLlvmLlc,
ld_prog = gcc_prog
-- figure out llvm location. (TODO: Acutally implement).
- ; let la_prog = "llvm-as"
- lc_prog = "llc"
+ ; let lc_prog = "llc"
lo_prog = "opt"
; return dflags1{
pgm_T = touch_path,
pgm_sysman = top_dir ++ "/ghc/rts/parallel/SysMan",
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
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