nixpkgs mirror (for testing)
github.com/NixOS/nixpkgs
nix
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