diff options
author | Sylvain Henry <sylvain@haskus.fr> | 2020-06-29 19:58:56 +0200 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2020-07-22 20:19:59 -0400 |
commit | 735f9d6bac316a0c1c68a8b49bba465f07b01cdd (patch) | |
tree | a4b5eeb8963ff7e51c8b16bfe2ba4e15bf054262 /compiler/GHC/Driver | |
parent | e079bb721e25dbc19e1adf8c8051b6ea03752962 (diff) | |
download | haskell-735f9d6bac316a0c1c68a8b49bba465f07b01cdd.tar.gz |
Replace ghcWithNativeCodeGen with a proper Backend datatype
* Represent backends with a `Backend` datatype in GHC.Driver.Backend
* Don't detect the default backend to use for the target platform at
compile time in Hadrian/make but at runtime. It makes "Settings"
simpler and it is a step toward making GHC multi-target.
* The latter change also fixes hadrian which has not been updated to
take into account that the NCG now supports AIX and PPC64 (cf
df26b95559fd467abc0a3a4151127c95cb5011b9 and
d3c1dda60d0ec07fc7f593bfd83ec9457dfa7984)
* Also we don't treat iOS specifically anymore (cf
cb4878ffd18a3c70f98bdbb413cd3c4d1f054e1f)
Diffstat (limited to 'compiler/GHC/Driver')
-rw-r--r-- | compiler/GHC/Driver/Backend.hs | 43 | ||||
-rw-r--r-- | compiler/GHC/Driver/Session.hs | 42 |
2 files changed, 68 insertions, 17 deletions
diff --git a/compiler/GHC/Driver/Backend.hs b/compiler/GHC/Driver/Backend.hs new file mode 100644 index 0000000000..8f227d2a2b --- /dev/null +++ b/compiler/GHC/Driver/Backend.hs @@ -0,0 +1,43 @@ +{-# LANGUAGE MultiWayIf #-} + +-- | Code generation backends +module GHC.Driver.Backend + ( Backend (..) + , platformDefaultBackend + , platformNcgSupported + ) +where + +import GHC.Prelude +import GHC.Platform + +-- | Backend +data Backend + = NCG -- ^ Native code generator backend + | LLVM -- ^ LLVM backend + | ViaC -- ^ Via-C backend + | Interpreter -- ^ Interpreter + deriving (Eq,Ord,Show,Read) + +-- | Default backend to use for the given platform. +platformDefaultBackend :: Platform -> Backend +platformDefaultBackend platform = if + | platformUnregisterised platform -> ViaC + | platformNcgSupported platform -> NCG + | otherwise -> LLVM + + +-- | Is the platform supported by the Native Code Generator? +platformNcgSupported :: Platform -> Bool +platformNcgSupported platform = if + | platformUnregisterised platform -> False -- NCG doesn't support unregisterised ABI + | ncgValidArch -> True + | otherwise -> False + where + ncgValidArch = case platformArch platform of + ArchX86 -> True + ArchX86_64 -> True + ArchPPC -> True + ArchPPC_64 {} -> True + ArchSPARC -> True + _ -> False diff --git a/compiler/GHC/Driver/Session.hs b/compiler/GHC/Driver/Session.hs index 04ff23d5fe..7d5c72ba74 100644 --- a/compiler/GHC/Driver/Session.hs +++ b/compiler/GHC/Driver/Session.hs @@ -253,6 +253,7 @@ import {-# SOURCE #-} GHC.Unit.State (UnitState, emptyUnitState, UnitDatabase, u import GHC.Driver.Phases ( Phase(..), phaseInputExt ) import GHC.Driver.Flags import GHC.Driver.Ways +import GHC.Driver.Backend import GHC.Settings.Config import GHC.Utils.CliOption import GHC.Driver.CmdLine hiding (WarnReason(..)) @@ -1151,16 +1152,15 @@ instance Outputable PackageFlag where -- | The 'HscTarget' value corresponding to the default way to create -- object files on the current platform. -defaultHscTarget :: Platform -> PlatformMisc -> HscTarget -defaultHscTarget platform pMisc - | platformUnregisterised platform = HscC - | platformMisc_ghcWithNativeCodeGen pMisc = HscAsm +defaultHscTarget :: Platform -> HscTarget +defaultHscTarget platform + | platformUnregisterised platform = HscC + | NCG <- platformDefaultBackend platform = HscAsm | otherwise = HscLlvm defaultObjectTarget :: DynFlags -> HscTarget defaultObjectTarget dflags = defaultHscTarget (targetPlatform dflags) - (platformMisc dflags) data DynLibLoader = Deployable @@ -1272,7 +1272,7 @@ defaultDynFlags mySettings llvmConfig = DynFlags { ghcMode = CompManager, ghcLink = LinkBinary, - hscTarget = defaultHscTarget (sTargetPlatform mySettings) (sPlatformMisc mySettings), + hscTarget = defaultHscTarget (sTargetPlatform mySettings), verbosity = 0, optLevel = 0, debugLevel = 0, @@ -4856,7 +4856,8 @@ compilerInfo dflags ("Target platform", platformMisc_targetPlatformString $ platformMisc dflags), ("Have interpreter", showBool $ platformMisc_ghcWithInterpreter $ platformMisc dflags), ("Object splitting supported", showBool False), - ("Have native code generator", showBool $ platformMisc_ghcWithNativeCodeGen $ platformMisc dflags), + ("Have native code generator", showBool $ platformNcgSupported (targetPlatform dflags)), + ("Target default backend", show $ platformDefaultBackend (targetPlatform dflags)), -- Whether or not we support @-dynamic-too@ ("Support dynamic-too", showBool $ not isWindows), -- Whether or not we support the @-j@ flag with @--make@. @@ -4951,28 +4952,35 @@ makeDynFlagsConsistent dflags = let dflags' = gopt_unset dflags Opt_BuildDynamicToo warn = "-dynamic-too is not supported on Windows" in loop dflags' warn + + -- Via-C backend only supports unregisterised convention. Switch to a backend + -- supporting it if possible. | hscTarget dflags == HscC && not (platformUnregisterised (targetPlatform dflags)) - = if platformMisc_ghcWithNativeCodeGen $ platformMisc dflags - then let dflags' = dflags { hscTarget = HscAsm } - warn = "Compiler not unregisterised, so using native code generator rather than compiling via C" - in loop dflags' warn - else let dflags' = dflags { hscTarget = HscLlvm } - warn = "Compiler not unregisterised, so using LLVM rather than compiling via C" - in loop dflags' warn + = case platformDefaultBackend (targetPlatform dflags) of + NCG -> let dflags' = dflags { hscTarget = HscAsm } + warn = "Target platform doesn't use unregisterised ABI, so using native code generator rather than compiling via C" + in loop dflags' warn + LLVM -> let dflags' = dflags { hscTarget = HscLlvm } + warn = "Target platform doesn't use unregisterised ABI, so using LLVM rather than compiling via C" + in loop dflags' warn + _ -> pgmError "Compiling via C is only supported with unregisterised ABI but target platform doesn't use it." | gopt Opt_Hpc dflags && hscTarget dflags == HscInterpreted = let dflags' = gopt_unset dflags Opt_Hpc warn = "Hpc can't be used with byte-code interpreter. Ignoring -fhpc." in loop dflags' warn + | hscTarget dflags `elem` [HscAsm, HscLlvm] && platformUnregisterised (targetPlatform dflags) = loop (dflags { hscTarget = HscC }) - "Compiler unregisterised, so compiling via C" + "Target platform uses unregisterised ABI, so compiling via C" + | hscTarget dflags == HscAsm && - not (platformMisc_ghcWithNativeCodeGen $ platformMisc dflags) + not (platformNcgSupported $ targetPlatform dflags) = let dflags' = dflags { hscTarget = HscLlvm } - warn = "No native code generator, so using LLVM" + warn = "Native code generator doesn't support target platform, so using LLVM" in loop dflags' warn + | not (osElfTarget os) && gopt Opt_PIE dflags = loop (gopt_unset dflags Opt_PIE) "Position-independent only supported on ELF platforms" |