summaryrefslogtreecommitdiff
path: root/ghc
diff options
context:
space:
mode:
authorNorman Ramsey <nr@cs.tufts.edu>2022-02-07 10:42:36 -0500
committerCheng Shao <astrohavoc@gmail.com>2022-05-21 03:11:04 +0000
commit4aa3c5bde8c54f6ab8cbb2a574f7654590c077ca (patch)
tree43e79b6f797f12a3eb040252a20ac80659c55514 /ghc
parent36b8a57cb30c1374cce749b6f1554a2d438336b9 (diff)
downloadhaskell-4aa3c5bde8c54f6ab8cbb2a574f7654590c077ca.tar.gz
Change `Backend` type and remove direct dependencieswip/backend-as-record
With this change, `Backend` becomes an abstract type (there are no more exposed value constructors). Decisions that were formerly made by asking "is the current back end equal to (or different from) this named value constructor?" are now made by interrogating the back end about its properties, which are functions exported by `GHC.Driver.Backend`. There is a description of how to migrate code using `Backend` in the user guide. Clients using the GHC API can find a backdoor to access the Backend datatype in GHC.Driver.Backend.Internal. Bumps haddock submodule. Fixes #20927
Diffstat (limited to 'ghc')
-rw-r--r--ghc/Main.hs18
1 files changed, 10 insertions, 8 deletions
diff --git a/ghc/Main.hs b/ghc/Main.hs
index 8e30d1a765..45dd5fede1 100644
--- a/ghc/Main.hs
+++ b/ghc/Main.hs
@@ -16,9 +16,10 @@ module Main (main) where
-- The official GHC API
import qualified GHC
-import GHC (parseTargetFiles, Ghc, GhcMonad(..), Backend (..),
+import GHC (parseTargetFiles, Ghc, GhcMonad(..),
LoadHowMuch(..) )
+import GHC.Driver.Backend
import GHC.Driver.CmdLine
import GHC.Driver.Env
import GHC.Driver.Errors
@@ -175,9 +176,9 @@ main' postLoadMode units dflags0 args flagWarnings = do
let dflt_backend = backend dflags0
(mode, bcknd, link)
= case postLoadMode of
- DoInteractive -> (CompManager, Interpreter, LinkInMemory)
- DoEval _ -> (CompManager, Interpreter, LinkInMemory)
- DoRun -> (CompManager, Interpreter, LinkInMemory)
+ DoInteractive -> (CompManager, interpreterBackend, LinkInMemory)
+ DoEval _ -> (CompManager, interpreterBackend, LinkInMemory)
+ DoRun -> (CompManager, interpreterBackend, LinkInMemory)
DoMake -> (CompManager, dflt_backend, LinkBinary)
DoBackpack -> (CompManager, dflt_backend, LinkBinary)
DoMkDependHS -> (MkDepend, dflt_backend, LinkBinary)
@@ -217,8 +218,9 @@ main' postLoadMode units dflags0 args flagWarnings = do
(dflags3, fileish_args, dynamicFlagWarnings) <-
GHC.parseDynamicFlags logger2 dflags2 args'
- let dflags4 = case bcknd of
- Interpreter | not (gopt Opt_ExternalInterpreter dflags3) ->
+ let dflags4 = if backendNeedsFullWays bcknd &&
+ not (gopt Opt_ExternalInterpreter dflags3)
+ then
let platform = targetPlatform dflags3
dflags3a = dflags3 { targetWays_ = hostFullWays }
dflags3b = foldl gopt_set dflags3a
@@ -228,7 +230,7 @@ main' postLoadMode units dflags0 args flagWarnings = do
$ concatMap (wayUnsetGeneralFlags platform)
hostFullWays
in dflags3c
- _ ->
+ else
dflags3
let logger4 = setLogFlags logger2 (initLogFlags dflags4)
@@ -364,7 +366,7 @@ checkOptions mode dflags srcs objs units = do
else do
case mode of
- StopBefore StopC | backend dflags /= ViaC
+ StopBefore StopC | not (backendGeneratesHc (backend dflags))
-> throwGhcException $ UsageError $
"the option -C is only available with an unregisterised GHC"
StopBefore StopAs | ghcLink dflags == NoLink