nixpkgs mirror (for testing) github.com/NixOS/nixpkgs
nix
at python-updates 137 lines 5.8 kB view raw
1From 646d62e74c16be785ef08735ae5b24f4af6bcf78 Mon Sep 17 00:00:00 2001 2From: Ben Gamari <ben@smart-cactus.org> 3Date: Tue, 22 Aug 2023 13:26:58 -0400 4Subject: [PATCH] llvmGen: Don't pass stack alignment via command line 5 6As of https://reviews.llvm.org/D103048 LLVM no longer supports the 7`-stack-alignment=...` flag. Instead this information is passed via a 8module flag metadata node. 9 10This requires dropping support for LLVM 11 and 12. 11 12Fixes #23870 13 14(cherry picked from commit e9af2cf3f16ab60b5c79ed91df95359b11784df6) 15--- 16 compiler/GHC/CmmToLlvm.hs | 29 ++++++++++++++++++++++++- 17 compiler/GHC/CmmToLlvm/Config.hs | 1 + 18 compiler/GHC/Driver/Config/CmmToLlvm.hs | 1 + 19 compiler/GHC/Driver/Pipeline/Execute.hs | 7 ------ 20 configure.ac | 2 +- 21 5 files changed, 31 insertions(+), 9 deletions(-) 22 23diff --git a/compiler/GHC/CmmToLlvm.hs b/compiler/GHC/CmmToLlvm.hs 24index 7d48693765..b9036daef1 100644 25--- a/compiler/GHC/CmmToLlvm.hs 26+++ b/compiler/GHC/CmmToLlvm.hs 27@@ -190,7 +190,7 @@ cmmLlvmGen _ = return () 28 29 cmmMetaLlvmPrelude :: LlvmM () 30 cmmMetaLlvmPrelude = do 31- metas <- flip mapM stgTBAA $ \(uniq, name, parent) -> do 32+ tbaa_metas <- flip mapM stgTBAA $ \(uniq, name, parent) -> do 33 -- Generate / lookup meta data IDs 34 tbaaId <- getMetaUniqueId 35 setUniqMeta uniq tbaaId 36@@ -203,9 +203,36 @@ cmmMetaLlvmPrelude = do 37 -- just a name on its own. Previously `null` was accepted as the 38 -- name. 39 Nothing -> [ MetaStr name ] 40+ 41+ platform <- getPlatform 42+ cfg <- getConfig 43+ let stack_alignment_metas = 44+ case platformArch platform of 45+ ArchX86_64 | llvmCgAvxEnabled cfg -> [mkStackAlignmentMeta 32] 46+ _ -> [] 47+ module_flags_metas <- mkModuleFlagsMeta stack_alignment_metas 48+ let metas = tbaa_metas ++ module_flags_metas 49 cfg <- getConfig 50 renderLlvm $ ppLlvmMetas cfg metas 51 52+mkNamedMeta :: LMString -> [MetaExpr] -> LlvmM [MetaDecl] 53+mkNamedMeta name exprs = do 54+ (ids, decls) <- unzip <$> mapM f exprs 55+ return $ decls ++ [MetaNamed name ids] 56+ where 57+ f expr = do 58+ i <- getMetaUniqueId 59+ return (i, MetaUnnamed i expr) 60+ 61+mkModuleFlagsMeta :: [ModuleFlag] -> LlvmM [MetaDecl] 62+mkModuleFlagsMeta = 63+ mkNamedMeta "llvm.module.flags" . map moduleFlagToMetaExpr 64+ 65+mkStackAlignmentMeta :: Integer -> ModuleFlag 66+mkStackAlignmentMeta alignment = 67+ ModuleFlag MFBError "override-stack-alignment" (MetaLit $ LMIntLit alignment i32) 68+ 69+ 70 -- ----------------------------------------------------------------------------- 71 -- | Marks variables as used where necessary 72 -- 73diff --git a/compiler/GHC/CmmToLlvm/Config.hs b/compiler/GHC/CmmToLlvm/Config.hs 74index 649a33c2f6..ecab7fdcc1 100644 75--- a/compiler/GHC/CmmToLlvm/Config.hs 76+++ b/compiler/GHC/CmmToLlvm/Config.hs 77@@ -36,6 +36,7 @@ data LlvmCgConfig = LlvmCgConfig 78 , llvmCgContext :: !SDocContext -- ^ Context for LLVM code generation 79 , llvmCgFillUndefWithGarbage :: !Bool -- ^ Fill undefined literals with garbage values 80 , llvmCgSplitSection :: !Bool -- ^ Split sections 81+ , llvmCgAvxEnabled :: !Bool 82 , llvmCgBmiVersion :: Maybe BmiVersion -- ^ (x86) BMI instructions 83 , llvmCgLlvmVersion :: Maybe LlvmVersion -- ^ version of Llvm we're using 84 , llvmCgDoWarn :: !Bool -- ^ True ==> warn unsupported Llvm version 85diff --git a/compiler/GHC/Driver/Config/CmmToLlvm.hs b/compiler/GHC/Driver/Config/CmmToLlvm.hs 86index 8097bbec7e..752ba987ca 100644 87--- a/compiler/GHC/Driver/Config/CmmToLlvm.hs 88+++ b/compiler/GHC/Driver/Config/CmmToLlvm.hs 89@@ -23,6 +23,7 @@ initLlvmCgConfig logger config_cache dflags = do 90 , llvmCgContext = initSDocContext dflags PprCode 91 , llvmCgFillUndefWithGarbage = gopt Opt_LlvmFillUndefWithGarbage dflags 92 , llvmCgSplitSection = gopt Opt_SplitSections dflags 93+ , llvmCgAvxEnabled = isAvxEnabled dflags 94 , llvmCgBmiVersion = case platformArch (targetPlatform dflags) of 95 ArchX86_64 -> bmiVersion dflags 96 ArchX86 -> bmiVersion dflags 97diff --git a/compiler/GHC/Driver/Pipeline/Execute.hs b/compiler/GHC/Driver/Pipeline/Execute.hs 98index fac2a595f2..4fa72be475 100644 99--- a/compiler/GHC/Driver/Pipeline/Execute.hs 100+++ b/compiler/GHC/Driver/Pipeline/Execute.hs 101@@ -992,8 +992,6 @@ llvmOptions llvm_config dflags = 102 [("-enable-tbaa -tbaa", "-enable-tbaa") | gopt Opt_LlvmTBAA dflags ] 103 ++ [("-relocation-model=" ++ rmodel 104 ,"-relocation-model=" ++ rmodel) | not (null rmodel)] 105- ++ [("-stack-alignment=" ++ (show align) 106- ,"-stack-alignment=" ++ (show align)) | align > 0 ] 107 108 -- Additional llc flags 109 ++ [("", "-mcpu=" ++ mcpu) | not (null mcpu) 110@@ -1012,11 +1010,6 @@ llvmOptions llvm_config dflags = 111 112 platform = targetPlatform dflags 113 114- align :: Int 115- align = case platformArch platform of 116- ArchX86_64 | isAvxEnabled dflags -> 32 117- _ -> 0 118- 119 attrs :: String 120 attrs = intercalate "," $ mattr 121 ++ ["+sse42" | isSse4_2Enabled dflags ] 122diff --git a/configure.ac b/configure.ac 123index 16f2e8b339..0440d5051b 100644 124--- a/configure.ac 125+++ b/configure.ac 126@@ -555,7 +555,7 @@ AC_SUBST(InstallNameToolCmd) 127 # tools we are looking for. In the past, GHC supported a number of 128 # versions of LLVM simultaneously, but that stopped working around 129 # 3.5/3.6 release of LLVM. 130-LlvmMinVersion=11 # inclusive 131+LlvmMinVersion=13 # inclusive 132 LlvmMaxVersion=16 # not inclusive 133 AC_SUBST([LlvmMinVersion]) 134 AC_SUBST([LlvmMaxVersion]) 135-- 1362.50.1 137