From b0d92a677939eb4826c029d3c7d854bdc9579c9a Mon Sep 17 00:00:00 2001 From: Moritz Angermann Date: Mon, 8 Sep 2025 11:47:14 +0900 Subject: [PATCH] feat: Drop GHC's LLVM version check This check incurs significant complexity and is mostly a nuissance to users, who end up bypassing it. Orignal Author: Andrea Bedini --- compiler/GHC/CmmToLlvm.hs | 34 ++------------------- compiler/GHC/CmmToLlvm/Base.hs | 14 +++------ compiler/GHC/CmmToLlvm/Config.hs | 1 - compiler/GHC/CmmToLlvm/Version.hs | 8 ----- compiler/GHC/CmmToLlvm/Version/Bounds.hs.in | 19 ------------ compiler/GHC/Driver/Config/CmmToLlvm.hs | 1 - compiler/GHC/Driver/Errors/Ppr.hs | 8 +---- compiler/GHC/Driver/Flags.hs | 3 -- compiler/GHC/Driver/Session.hs | 1 - compiler/GHC/SysTools/Tasks.hs | 2 +- compiler/ghc.cabal.in | 1 - hadrian/src/Hadrian/Haskell/Cabal/Parse.hs | 3 +- hadrian/src/Rules/Generate.hs | 9 +----- hadrian/src/Rules/Lint.hs | 3 +- testsuite/tests/driver/all.T | 2 +- 15 files changed, 14 insertions(+), 95 deletions(-) delete mode 100644 compiler/GHC/CmmToLlvm/Version/Bounds.hs.in diff --git a/compiler/GHC/CmmToLlvm.hs b/compiler/GHC/CmmToLlvm.hs index 72a3161dec36..b85d620433b3 100644 --- a/compiler/GHC/CmmToLlvm.hs +++ b/compiler/GHC/CmmToLlvm.hs @@ -38,8 +38,8 @@ import GHC.Utils.Panic import GHC.Utils.Logger import qualified GHC.Data.Stream as Stream -import Control.Monad ( when, forM_ ) -import Data.Maybe ( fromMaybe, catMaybes, isNothing ) +import Control.Monad ( forM_ ) +import Data.Maybe ( catMaybes ) import System.IO -- ----------------------------------------------------------------------------- @@ -57,36 +57,8 @@ llvmCodeGen logger cfg h dus cmm_stream -- Pass header showPass logger "LLVM CodeGen" - -- get llvm version, cache for later use - let mb_ver = llvmCgLlvmVersion cfg - - -- warn if unsupported - forM_ mb_ver $ \ver -> do - debugTraceMsg logger 2 - (text "Using LLVM version:" <+> text (llvmVersionStr ver)) - let doWarn = llvmCgDoWarn cfg - when (not (llvmVersionSupported ver) && doWarn) $ putMsg logger $ - "You are using an unsupported version of LLVM!" $$ - "Currently only" <+> text (llvmVersionStr supportedLlvmVersionLowerBound) <+> - "up to" <+> text (llvmVersionStr supportedLlvmVersionUpperBound) <+> "(non inclusive) is supported." <+> - "System LLVM version: " <> text (llvmVersionStr ver) $$ - "We will try though..." - - when (isNothing mb_ver) $ do - let doWarn = llvmCgDoWarn cfg - when doWarn $ putMsg logger $ - "Failed to detect LLVM version!" $$ - "Make sure LLVM is installed correctly." $$ - "We will try though..." - - -- HACK: the Nothing case here is potentially wrong here but we - -- currently don't use the LLVM version to guide code generation - -- so this is okay. - let llvm_ver :: LlvmVersion - llvm_ver = fromMaybe supportedLlvmVersionLowerBound mb_ver - -- run code generation - (a, _) <- runLlvm logger cfg llvm_ver bufh dus $ + (a, _) <- runLlvm logger cfg bufh dus $ llvmCodeGen' cfg cmm_stream bFlush bufh diff --git a/compiler/GHC/CmmToLlvm/Base.hs b/compiler/GHC/CmmToLlvm/Base.hs index 23f9e911520d..d3e46b664072 100644 --- a/compiler/GHC/CmmToLlvm/Base.hs +++ b/compiler/GHC/CmmToLlvm/Base.hs @@ -18,7 +18,7 @@ module GHC.CmmToLlvm.Base ( LlvmM, runLlvm, withClearVars, varLookup, varInsert, markStackReg, checkStackReg, - funLookup, funInsert, getLlvmVer, + funLookup, funInsert, dumpIfSetLlvm, renderLlvm, markUsedVar, getUsedVars, ghcInternalFunctions, getPlatform, getConfig, @@ -277,8 +277,7 @@ llvmPtrBits platform = widthInBits $ typeWidth $ gcWord platform -- data LlvmEnv = LlvmEnv - { envVersion :: LlvmVersion -- ^ LLVM version - , envConfig :: !LlvmCgConfig -- ^ Configuration for LLVM code gen + { envConfig :: !LlvmCgConfig -- ^ Configuration for LLVM code gen , envLogger :: !Logger -- ^ Logger , envOutput :: BufHandle -- ^ Output buffer , envTag :: !Char -- ^ Tag for creating unique values @@ -331,8 +330,8 @@ liftUDSMT m = LlvmM $ \env -> do x <- m return (x, env) -- | Get initial Llvm environment. -runLlvm :: Logger -> LlvmCgConfig -> LlvmVersion -> BufHandle -> DSM.DUniqSupply -> LlvmM a -> IO (a, DSM.DUniqSupply) -runLlvm logger cfg ver out us m = do +runLlvm :: Logger -> LlvmCgConfig -> BufHandle -> DSM.DUniqSupply -> LlvmM a -> IO (a, DSM.DUniqSupply) +runLlvm logger cfg out us m = do ((a, _), us') <- DSM.runUDSMT us $ runLlvmM m env return (a, us') where env = LlvmEnv { envFunMap = emptyUFM @@ -340,7 +339,6 @@ runLlvm logger cfg ver out us m = do , envStackRegs = [] , envUsedVars = [] , envAliases = emptyUniqSet - , envVersion = ver , envConfig = cfg , envLogger = logger , envOutput = out @@ -388,10 +386,6 @@ getMetaUniqueId :: LlvmM MetaId getMetaUniqueId = LlvmM $ \env -> return (envFreshMeta env, env { envFreshMeta = succ $ envFreshMeta env }) --- | Get the LLVM version we are generating code for -getLlvmVer :: LlvmM LlvmVersion -getLlvmVer = getEnv envVersion - -- | Dumps the document if the corresponding flag has been set by the user dumpIfSetLlvm :: DumpFlag -> String -> DumpFormat -> Outp.SDoc -> LlvmM () dumpIfSetLlvm flag hdr fmt doc = do diff --git a/compiler/GHC/CmmToLlvm/Config.hs b/compiler/GHC/CmmToLlvm/Config.hs index 1e7e04144f96..e1ef61a52a2a 100644 --- a/compiler/GHC/CmmToLlvm/Config.hs +++ b/compiler/GHC/CmmToLlvm/Config.hs @@ -25,7 +25,6 @@ data LlvmCgConfig = LlvmCgConfig , llvmCgAvxEnabled :: !Bool , llvmCgBmiVersion :: Maybe BmiVersion -- ^ (x86) BMI instructions , llvmCgLlvmVersion :: Maybe LlvmVersion -- ^ version of Llvm we're using - , llvmCgDoWarn :: !Bool -- ^ True ==> warn unsupported Llvm version , llvmCgLlvmTarget :: !String -- ^ target triple passed to LLVM , llvmCgLlvmConfig :: !LlvmConfig -- ^ Supported LLVM configurations. -- see Note [LLVM configuration] diff --git a/compiler/GHC/CmmToLlvm/Version.hs b/compiler/GHC/CmmToLlvm/Version.hs index 9c3412f93160..a77977e47c4e 100644 --- a/compiler/GHC/CmmToLlvm/Version.hs +++ b/compiler/GHC/CmmToLlvm/Version.hs @@ -1,9 +1,6 @@ module GHC.CmmToLlvm.Version ( LlvmVersion(..) - , supportedLlvmVersionLowerBound - , supportedLlvmVersionUpperBound , parseLlvmVersion - , llvmVersionSupported , llvmVersionStr , llvmVersionList ) @@ -12,7 +9,6 @@ where import GHC.Prelude import GHC.CmmToLlvm.Version.Type -import GHC.CmmToLlvm.Version.Bounds import Data.Char (isDigit) import Data.List (intercalate) @@ -32,10 +28,6 @@ parseLlvmVersion = where (ver_str, rest) = span isDigit s -llvmVersionSupported :: LlvmVersion -> Bool -llvmVersionSupported v = - v >= supportedLlvmVersionLowerBound && v < supportedLlvmVersionUpperBound - llvmVersionStr :: LlvmVersion -> String llvmVersionStr = intercalate "." . map show . llvmVersionList diff --git a/compiler/GHC/CmmToLlvm/Version/Bounds.hs.in b/compiler/GHC/CmmToLlvm/Version/Bounds.hs.in deleted file mode 100644 index 19f4e4d37a91..000000000000 --- a/compiler/GHC/CmmToLlvm/Version/Bounds.hs.in +++ /dev/null @@ -1,19 +0,0 @@ -module GHC.CmmToLlvm.Version.Bounds - ( supportedLlvmVersionLowerBound - , supportedLlvmVersionUpperBound - ) -where - -import GHC.Prelude () - -import GHC.CmmToLlvm.Version.Type - -import qualified Data.List.NonEmpty as NE - --- | The (inclusive) lower bound on the LLVM Version that is currently supported. -supportedLlvmVersionLowerBound :: LlvmVersion -supportedLlvmVersionLowerBound = LlvmVersion (@LlvmMinVersion@ NE.:| []) - --- | The (not-inclusive) upper bound bound on the LLVM Version that is currently supported. -supportedLlvmVersionUpperBound :: LlvmVersion -supportedLlvmVersionUpperBound = LlvmVersion (@LlvmMaxVersion@ NE.:| []) diff --git a/compiler/GHC/Driver/Config/CmmToLlvm.hs b/compiler/GHC/Driver/Config/CmmToLlvm.hs index c0a21c9cb1f9..666e4342250a 100644 --- a/compiler/GHC/Driver/Config/CmmToLlvm.hs +++ b/compiler/GHC/Driver/Config/CmmToLlvm.hs @@ -29,7 +29,6 @@ initLlvmCgConfig logger config_cache dflags = do ArchX86 -> bmiVersion dflags _ -> Nothing , llvmCgLlvmVersion = version - , llvmCgDoWarn = wopt Opt_WarnUnsupportedLlvmVersion dflags , llvmCgLlvmTarget = platformMisc_llvmTarget $! platformMisc dflags , llvmCgLlvmConfig = llvm_config } diff --git a/compiler/GHC/Driver/Errors/Ppr.hs b/compiler/GHC/Driver/Errors/Ppr.hs index 3ac28cd65042..66a1d9ab824f 100644 --- a/compiler/GHC/Driver/Errors/Ppr.hs +++ b/compiler/GHC/Driver/Errors/Ppr.hs @@ -34,7 +34,6 @@ import GHC.HsToCore.Errors.Types (DsMessage) import GHC.Iface.Errors.Types import GHC.Tc.Errors.Ppr () -- instance Diagnostic TcRnMessage import GHC.Iface.Errors.Ppr () -- instance Diagnostic IfaceMessage -import GHC.CmmToLlvm.Version (llvmVersionStr, supportedLlvmVersionLowerBound, supportedLlvmVersionUpperBound) -- -- Suggestions @@ -276,12 +275,7 @@ instance Diagnostic DriverMessage where , nest 2 $ ppr node ] DriverNoConfiguredLLVMToolchain -> mkSimpleDecorated $ - text "GHC was not configured with a supported LLVM toolchain" $$ - text ("Make sure you have installed LLVM between [" - ++ llvmVersionStr supportedLlvmVersionLowerBound - ++ " and " - ++ llvmVersionStr supportedLlvmVersionUpperBound - ++ ") and reinstall GHC to ensure -fllvm works") + text "GHC was not configured with a supported LLVM toolchain" diagnosticReason = \case DriverUnknownMessage m diff --git a/compiler/GHC/Driver/Flags.hs b/compiler/GHC/Driver/Flags.hs index 6b7365b0e003..90299fb79927 100644 --- a/compiler/GHC/Driver/Flags.hs +++ b/compiler/GHC/Driver/Flags.hs @@ -1041,7 +1041,6 @@ data WarningFlag = | Opt_WarnMissedSpecs | Opt_WarnAllMissedSpecs | Opt_WarnUnsupportedCallingConventions - | Opt_WarnUnsupportedLlvmVersion | Opt_WarnMissedExtraSharedLib | Opt_WarnInlineRuleShadowing | Opt_WarnTypedHoles @@ -1175,7 +1174,6 @@ warnFlagNames wflag = case wflag of Opt_WarnMisplacedPragmas -> "misplaced-pragmas" :| [] Opt_WarnUnsafe -> "unsafe" :| [] Opt_WarnUnsupportedCallingConventions -> "unsupported-calling-conventions" :| [] - Opt_WarnUnsupportedLlvmVersion -> "unsupported-llvm-version" :| [] Opt_WarnMissedExtraSharedLib -> "missed-extra-shared-lib" :| [] Opt_WarnUntickedPromotedConstructors -> "unticked-promoted-constructors" :| [] Opt_WarnUnusedDoBind -> "unused-do-bind" :| [] @@ -1350,7 +1348,6 @@ standardWarnings -- see Note [Documenting warning flags] Opt_WarnDodgyForeignImports, Opt_WarnInlineRuleShadowing, Opt_WarnAlternativeLayoutRuleTransitional, - Opt_WarnUnsupportedLlvmVersion, Opt_WarnMissedExtraSharedLib, Opt_WarnTabs, Opt_WarnUnrecognisedWarningFlags, diff --git a/compiler/GHC/Driver/Session.hs b/compiler/GHC/Driver/Session.hs index 34da4bbf5c2a..abc48b359841 100644 --- a/compiler/GHC/Driver/Session.hs +++ b/compiler/GHC/Driver/Session.hs @@ -2337,7 +2337,6 @@ wWarningFlagsDeps = [minBound..maxBound] >>= \x -> case x of Opt_WarnMisplacedPragmas -> warnSpec x Opt_WarnUnsafe -> warnSpec' x setWarnUnsafe Opt_WarnUnsupportedCallingConventions -> warnSpec x - Opt_WarnUnsupportedLlvmVersion -> warnSpec x Opt_WarnMissedExtraSharedLib -> warnSpec x Opt_WarnUntickedPromotedConstructors -> warnSpec x Opt_WarnUnusedDoBind -> warnSpec x diff --git a/compiler/GHC/SysTools/Tasks.hs b/compiler/GHC/SysTools/Tasks.hs index 32e0803e4d9d..76002ef73285 100644 --- a/compiler/GHC/SysTools/Tasks.hs +++ b/compiler/GHC/SysTools/Tasks.hs @@ -31,7 +31,7 @@ module GHC.SysTools.Tasks import GHC.Prelude import GHC.ForeignSrcLang -import GHC.CmmToLlvm.Version (LlvmVersion, llvmVersionStr, supportedLlvmVersionUpperBound, parseLlvmVersion, supportedLlvmVersionLowerBound) +import GHC.CmmToLlvm.Version (LlvmVersion, parseLlvmVersion) import GHC.Settings diff --git a/compiler/ghc.cabal.in b/compiler/ghc.cabal.in index d5e60a8d94c1..6e2ff82d6d48 100644 --- a/compiler/ghc.cabal.in +++ b/compiler/ghc.cabal.in @@ -353,7 +353,6 @@ Library GHC.CmmToLlvm.Ppr GHC.CmmToLlvm.Regs GHC.CmmToLlvm.Version - GHC.CmmToLlvm.Version.Bounds GHC.CmmToLlvm.Version.Type GHC.Cmm.Dominators GHC.Cmm.Reducibility diff --git a/hadrian/src/Hadrian/Haskell/Cabal/Parse.hs b/hadrian/src/Hadrian/Haskell/Cabal/Parse.hs index 1a0177d8cfc5..2a9ce973caa6 100644 --- a/hadrian/src/Hadrian/Haskell/Cabal/Parse.hs +++ b/hadrian/src/Hadrian/Haskell/Cabal/Parse.hs @@ -126,8 +126,9 @@ biModules pd = go [ comp | comp@(bi,_,_,_) <- -- -- Put another way, while Hadrian knows these are generated, Cabal -- should just think they are regular source files. +-- TODO: Review if this is necessary extraPreConfigureDeps :: [String] -extraPreConfigureDeps = ["compiler/GHC/CmmToLlvm/Version/Bounds.hs"] +extraPreConfigureDeps = [] -- TODO: Track command line arguments and package configuration flags. -- | Configure a package using the Cabal library by collecting all the command diff --git a/hadrian/src/Rules/Generate.hs b/hadrian/src/Rules/Generate.hs index 883b8bb53a3c..e1107e34764e 100644 --- a/hadrian/src/Rules/Generate.hs +++ b/hadrian/src/Rules/Generate.hs @@ -78,9 +78,6 @@ rtsDependencies = do compilerDependencies :: Expr [FilePath] compilerDependencies = do - let fixed = ("compiler" -/-) <$> - [ "GHC/CmmToLlvm/Version/Bounds.hs" - ] stage <- getStage ghcPath <- expr $ buildPath (vanillaContext stage compiler) let buildSpecific = (ghcPath -/-) <$> @@ -105,7 +102,7 @@ compilerDependencies = do , "GHC/Platform/Constants.hs" , "GHC/Settings/Config.hs" ] - pure $ fixed ++ buildSpecific + pure buildSpecific generatedDependencies :: Expr [FilePath] generatedDependencies = do @@ -389,10 +386,6 @@ templateRules = do , interpolateSetting "LlvmMinVersion" LlvmMinVersion , interpolateSetting "LlvmMaxVersion" LlvmMaxVersion ] - templateRule "compiler/GHC/CmmToLlvm/Version/Bounds.hs" $ mconcat - [ interpolateVar "LlvmMinVersion" $ replaceEq '.' ',' <$> setting LlvmMinVersion - , interpolateVar "LlvmMaxVersion" $ replaceEq '.' ',' <$> setting LlvmMaxVersion - ] bindistRules bindistRules :: Rules () diff --git a/hadrian/src/Rules/Lint.hs b/hadrian/src/Rules/Lint.hs index a8b1660556a9..65b703685cd1 100644 --- a/hadrian/src/Rules/Lint.hs +++ b/hadrian/src/Rules/Lint.hs @@ -91,8 +91,7 @@ compiler = do let compilerDir = "compiler" let ghcautoconf = stage1RtsInc "ghcautoconf.h" let ghcplatform = stage1RtsInc "ghcplatform.h" - let ghcLlvmVersion = compilerDir "GHC/CmmToLlvm/Version/Bounds.hs" - need $ mconcat [[ghcautoconf, ghcplatform, ghcLlvmVersion], hsIncls stage1Compiler, [machDeps]] + need $ mconcat [[ghcautoconf, ghcplatform], hsIncls stage1Compiler, [machDeps]] let includeDirs = [ stage1RtsInc , compilerDir diff --git a/testsuite/tests/driver/all.T b/testsuite/tests/driver/all.T index 611b2379770f..ad50275bed37 100644 --- a/testsuite/tests/driver/all.T +++ b/testsuite/tests/driver/all.T @@ -277,7 +277,7 @@ test('T12971', [when(opsys('mingw32'), fragile(17945)), ignore_stdout], makefile test('json_dump', normal, compile_fail, ['-ddump-json']) test('json', normalise_version('ghc'), compile_fail, ['-fdiagnostics-as-json']) test('json_warn', normalise_version('ghc'), compile, ['-fdiagnostics-as-json -Wunused-matches -Wx-partial']) -test('json2', normalise_version('ghc-internal', 'base','ghc-prim'), compile, ['-ddump-types -ddump-json -Wno-unsupported-llvm-version']) +test('json2', normalise_version('ghc-internal', 'base','ghc-prim'), compile, ['-ddump-types -ddump-json']) test('T16167', [normalise_version('ghc'),req_interp,exit_code(1)], run_command, ['{compiler} -x hs -e ":set prog T16167.hs" -ddump-json T16167.hs']) test('T13604', [], makefile_test, [])