Cheng Shao pushed to branch wip/fix-llvm-split-sections at Glasgow Haskell Compiler / GHC
Commits:
-
41074dd7
by Cheng Shao at 2026-01-14T03:28:25+01:00
3 changed files:
Changes:
| ... | ... | @@ -271,7 +271,7 @@ cmmUsedLlvmGens = do |
| 271 | 271 | -- used if we didn't provide these hints. This will generate a
|
| 272 | 272 | -- definition of the form
|
| 273 | 273 | --
|
| 274 | - -- @llvm.used = appending global [42 x i8*] [i8* bitcast <var> to i8*, ...]
|
|
| 274 | + -- @llvm.compiler.used = appending global [42 x i8*] [i8* bitcast <var> to i8*, ...]
|
|
| 275 | 275 | --
|
| 276 | 276 | -- Which is the LLVM way of protecting them against getting removed.
|
| 277 | 277 | ivars <- getUsedVars
|
| ... | ... | @@ -279,7 +279,7 @@ cmmUsedLlvmGens = do |
| 279 | 279 | ty = LMArray (length ivars) i8Ptr
|
| 280 | 280 | usedArray = LMStaticArray (map cast ivars) ty
|
| 281 | 281 | sectName = Just $ fsLit "llvm.metadata"
|
| 282 | - lmUsedVar = LMGlobalVar (fsLit "llvm.used") ty Appending sectName Nothing Constant
|
|
| 282 | + lmUsedVar = LMGlobalVar (fsLit "llvm.compiler.used") ty Appending sectName Nothing Constant
|
|
| 283 | 283 | lmUsed = LMGlobal lmUsedVar (Just usedArray)
|
| 284 | 284 | if null ivars
|
| 285 | 285 | then return ()
|
| ... | ... | @@ -286,7 +286,7 @@ data LlvmEnv = LlvmEnv |
| 286 | 286 | , envUniqMeta :: UniqFM Unique MetaId -- ^ Global metadata nodes
|
| 287 | 287 | , envFunMap :: LlvmEnvMap -- ^ Global functions so far, with type
|
| 288 | 288 | , envAliases :: UniqSet LMString -- ^ Globals that we had to alias, see [Llvm Forward References]
|
| 289 | - , envUsedVars :: [LlvmVar] -- ^ Pointers to be added to llvm.used (see @cmmUsedLlvmGens@)
|
|
| 289 | + , envUsedVars :: [LlvmVar] -- ^ Pointers to be added to llvm.compiler.used (see @cmmUsedLlvmGens@)
|
|
| 290 | 290 | |
| 291 | 291 | -- the following get cleared for every function (see @withClearVars@)
|
| 292 | 292 | , envVarMap :: LlvmEnvMap -- ^ Local variables so far, with type
|
| ... | ... | @@ -934,6 +934,14 @@ llvmOptions llvm_config llvm_version dflags = |
| 934 | 934 | [("-relocation-model=" ++ rmodel
|
| 935 | 935 | ,"-relocation-model=" ++ rmodel) | not (null rmodel)]
|
| 936 | 936 | |
| 937 | + -- Both llc/opt need these flags for split sections
|
|
| 938 | + ++ [ ("--data-sections", "--data-sections")
|
|
| 939 | + | gopt Opt_SplitSections dflags
|
|
| 940 | + ]
|
|
| 941 | + ++ [ ("--function-sections", "--function-sections")
|
|
| 942 | + | gopt Opt_SplitSections dflags
|
|
| 943 | + ]
|
|
| 944 | + |
|
| 937 | 945 | -- Additional llc flags
|
| 938 | 946 | ++ [("", "-mcpu=" ++ mcpu) | not (null mcpu)
|
| 939 | 947 | , not (any (isInfixOf "-mcpu") (getOpts dflags opt_lc)) ]
|