On Tue, 10 Feb 2026 11:04:41 +0800 fanpeng wrote:
Get the patch from upstream directly.
Commit ID: e70d41406b5d5638b42c4d8222cd03e76bbfeb86
--- a/compiler/GHC/CmmToLlvm.hs
+++ b/compiler/GHC/CmmToLlvm.hs
@@ -221,7 +221,12 @@ cmmMetaLlvmPrelude = do
case platformArch platform of
ArchX86_64 | llvmCgAvxEnabled cfg -> [mkStackAlignmentMeta 32]
_ -> []
- module_flags_metas <- mkModuleFlagsMeta stack_alignment_metas
+ let codel_model_metas =
+ case platformArch platform of
+ -- FIXME: We should not rely on LLVM
+ ArchLoongArch64 -> [mkCodeModelMeta CMMedium]
+ _ -> []
+ module_flags_metas <- mkModuleFlagsMeta (stack_alignment_metas ++
codel_model_metas)
let metas = tbaa_metas ++ module_flags_metas
cfg <- getConfig
renderLlvm (ppLlvmMetas cfg metas)
@@ -244,6 +249,15 @@ mkStackAlignmentMeta :: Integer -> ModuleFlag
mkStackAlignmentMeta alignment =
ModuleFlag MFBError "override-stack-alignment" (MetaLit $ LMIntLit
alignment i32)
+-- LLVM's @LLVM::CodeModel::Model@ enumeration
+data CodeModel = CMMedium
+
+-- Pass -mcmodel=medium option to LLVM on LoongArch64
+mkCodeModelMeta :: CodeModel -> ModuleFlag
+mkCodeModelMeta codemodel =
+ ModuleFlag MFBError "Code Model" (MetaLit $ LMIntLit n i32)
+ where
+ n = case codemodel of CMMedium -> 3 -- as of LLVM 8
--
-----------------------------------------------------------------------------
-- | Marks variables as used where necessary
> From e70d41406b5d5638b42c4d8222cd03e76bbfeb86 Mon Sep 17 00:00:00 2001
> From: Xin Wang
> Date: Mon, 13 Dec 2024 10:45:20 +0800
> Subject: [PATCH] llvmGen: Pass mcmodel medium option to LLVM backend
on LoongArch
>
> ---
> compiler/GHC/CmmToLlvm.hs | 17 ++++++++++++++++-
> 1 file changed, 16 insertions(+), 1 deletion(-)
>
> --- a/compiler/GHC/CmmToLlvm.hs
> +++ b/compiler/GHC/CmmToLlvm.hs
> @@ -219,7 +219,13 @@ cmmMetaLlvmPrelude = do
> ArchX86_64 | llvmCgAvxEnabled cfg -> [mkStackAlignmentMeta 32]
> _ -> []
> module_flags_metas <- mkModuleFlagsMeta stack_alignment_metas
> - let metas = tbaa_metas ++ module_flags_metas
> + let code_model_metas =
> + case platformArch platform of
> + -- FIXME: We should not rely on LLVM
> + ArchLoongArch64 -> [mkCodeModelMeta CMMedium]
> + _ -> []
> + mcmodel_flags_metas <- mkModuleFlagsMeta code_model_metas
> + let metas = tbaa_metas ++ module_flags_metas ++ mcmodel_flags_metas
> cfg <- getConfig
> renderLlvm (ppLlvmMetas cfg metas)
> (ppLlvmMetas cfg metas)
> @@ -241,6 +247,15 @@ mkStackAlignmentMeta :: Integer -> ModuleFlag
> mkStackAlignmentMeta alignment =
> ModuleFlag MFBError "override-stack-alignment" (MetaLit $ LMIntLit
alignment i32)
>
> +-- LLVM's @LLVM::CodeModel::Model@ enumeration
> +data CodeModel = CMMedium
> +
> +-- Pass -mcmodel=medium option to LLVM on LoongArch64
> +mkCodeModelMeta :: CodeModel -> ModuleFlag
> +mkCodeModelMeta codemodel =
> + ModuleFlag MFBError "Code Model" (MetaLit $ LMIntLit n i32)
> + where
> + n = case codemodel of CMMedium -> 3 -- as of LLVM 8
>
> --
-----------------------------------------------------------------------------
> -- | Marks variables as used where necessary
>From e70d41406b5d5638b42c4d8222cd03e76bbfeb86 Mon Sep 17 00:00:00 2001
From: Wang Xin <[email protected]>
Date: Tue, 19 Nov 2024 11:10:11 +0000
Subject: [PATCH] Add -mcmodel=medium moduleflag to generated LLVM IR on
LoongArch platform
With the Medium code model, the jump range of the generated jump
instruction is larger than that of the Small code model. It's a
temporary fix of the problem descriped in https://gitlab.haskell
.org/ghc/ghc/-/issues/25495. This commit requires that the LLVM
used contains the code of commit 9dd1d451d9719aa91b3bdd59c0c6679
83e1baf05, i.e., version 8.0 and later. Actually we should not
rely on LLVM, so the only way to solve this problem is to implement
the LoongArch backend.
Add new type for codemodel
---
compiler/GHC/CmmToLlvm.hs | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/compiler/GHC/CmmToLlvm.hs b/compiler/GHC/CmmToLlvm.hs
index 7ab55d975a..372a41acdd 100644
--- a/compiler/GHC/CmmToLlvm.hs
+++ b/compiler/GHC/CmmToLlvm.hs
@@ -221,7 +221,12 @@ cmmMetaLlvmPrelude = do
case platformArch platform of
ArchX86_64 | llvmCgAvxEnabled cfg -> [mkStackAlignmentMeta 32]
_ -> []
- module_flags_metas <- mkModuleFlagsMeta stack_alignment_metas
+ let codel_model_metas =
+ case platformArch platform of
+ -- FIXME: We should not rely on LLVM
+ ArchLoongArch64 -> [mkCodeModelMeta CMMedium]
+ _ -> []
+ module_flags_metas <- mkModuleFlagsMeta (stack_alignment_metas ++ codel_model_metas)
let metas = tbaa_metas ++ module_flags_metas
cfg <- getConfig
renderLlvm (ppLlvmMetas cfg metas)
@@ -244,6 +249,15 @@ mkStackAlignmentMeta :: Integer -> ModuleFlag
mkStackAlignmentMeta alignment =
ModuleFlag MFBError "override-stack-alignment" (MetaLit $ LMIntLit alignment i32)
+-- LLVM's @LLVM::CodeModel::Model@ enumeration
+data CodeModel = CMMedium
+
+-- Pass -mcmodel=medium option to LLVM on LoongArch64
+mkCodeModelMeta :: CodeModel -> ModuleFlag
+mkCodeModelMeta codemodel =
+ ModuleFlag MFBError "Code Model" (MetaLit $ LMIntLit n i32)
+ where
+ n = case codemodel of CMMedium -> 3 -- as of LLVM 8
-- -----------------------------------------------------------------------------
-- | Marks variables as used where necessary
--
2.51.0