Re: [PATCH v1 1/2] LoongArch: Make LTO case independent in Makefile

From: Tiezhu Yang

Date: Sat Sep 20 2025 - 06:22:21 EST


On 9/20/25 17:19, Tiezhu Yang wrote:
On 9/20/25 16:23, Huacai Chen wrote:
On Sat, Sep 20, 2025 at 2:15 PM Nathan Chancellor <nathan@xxxxxxxxxx> wrote:

Hi Tiezhu,

On Tue, Sep 09, 2025 at 05:27:06PM +0800, Tiezhu Yang wrote:
LTO is not only used for Clang, it maybe used for Rust, make LTO case out
of CONFIG_CC_HAS_ANNOTATE_TABLEJUMP in Makefile.

This is preparation for later patch, no function changes.

Suggested-by: WANG Rui <wangrui@xxxxxxxxxxx>
Signed-off-by: Tiezhu Yang <yangtiezhu@xxxxxxxxxxx>
---
  arch/loongarch/Makefile | 10 +++++-----
  1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/arch/loongarch/Makefile b/arch/loongarch/Makefile
index a3a9759414f4..9d80af7f75c8 100644
--- a/arch/loongarch/Makefile
+++ b/arch/loongarch/Makefile
@@ -102,16 +102,16 @@ KBUILD_CFLAGS                   += $(call cc-option,-mthin-add-sub) $(call cc-option,-Wa$(comma)

  ifdef CONFIG_OBJTOOL
  ifdef CONFIG_CC_HAS_ANNOTATE_TABLEJUMP
+KBUILD_CFLAGS                        += -mannotate-tablejump
+else
+KBUILD_CFLAGS                        += -fno-jump-tables # keep compatibility with older compilers
+endif
+ifdef CONFIG_LTO_CLANG
  # The annotate-tablejump option can not be passed to LLVM backend when LTO is enabled.
  # Ensure it is aware of linker with LTO, '--loongarch-annotate-tablejump' also needs to
  # be passed via '-mllvm' to ld.lld.
-KBUILD_CFLAGS                        += -mannotate-tablejump
-ifdef CONFIG_LTO_CLANG
  KBUILD_LDFLAGS                       += -mllvm --loongarch-annotate-tablejump
  endif
-else
-KBUILD_CFLAGS                        += -fno-jump-tables # keep compatibility with older compilers
-endif
  endif

  KBUILD_RUSTFLAGS             += --target=loongarch64-unknown-none-softfloat -Ccode-model=small
--
2.42.0


This change is now in -next as commit b15212824a01 ("LoongArch: Make LTO
case independent in Makefile"), where it breaks the build for clang-18,
as '--loongarch-annotate-tablejump' is unimplemented there but there is
no version check before using it.

   $ make -skj"$(nproc)" ARCH=loongarch LLVM=1 mrproper defconfig

   $ scripts/config -d LTO_NONE -e LTO_CLANG_THIN

   $ make -skj"$(nproc)" ARCH=loongarch LLVM=1 olddefconfig vmlinuz.efi
   ld.lld: error: -mllvm: ld.lld: Unknown command line argument '--loongarch-annotate-tablejump'.
   ...

   $ scripts/config -s CC_HAS_ANNOTATE_TABLEJUMP
   undef
Hmm, maybe we need this?
diff --git a/arch/loongarch/Makefile b/arch/loongarch/Makefile
index ae419e32f22e..fcfa793f9bb0 100644
--- a/arch/loongarch/Makefile
+++ b/arch/loongarch/Makefile
@@ -115,7 +115,7 @@ ifdef CONFIG_LTO_CLANG
  # The annotate-tablejump option can not be passed to LLVM backend
when LTO is enabled.
  # Ensure it is aware of linker with LTO,
'--loongarch-annotate-tablejump' also needs to
  # be passed via '-mllvm' to ld.lld.
-KBUILD_LDFLAGS                 += -mllvm
--loongarch-annotate-tablejump
+KBUILD_LDFLAGS                 += $(call ld-option,-mllvm
--loongarch-annotate-tablejump)
  endif
  endif

We need to handle the other case to use -fno-jump-tables if llvm does
not support -loongarch-annotate-tablejump.

So, it is better to update the minimal version of llvm to 20, which
includes the following two important commits:

[LoongArch] Add options for annotate tablejump
https://github.com/llvm/llvm-project/commit/4c2c17756739

[LoongArch] Avoid indirect branch jumps using the ra register
https://github.com/llvm/llvm-project/commit/21ef17c62645

If you are OK, I will send a patch to modify the following file:

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/scripts/min-tool-version.sh#n29

and keep arch/loongarch/Makefile as is.

The other way is to keep scripts/min-tool-version.sh as is, and only
modify arch/loongarch/Makefile, something like this (not tested):

config LLD_HAS_ANNOTATE_TABLEJUMP
def_bool LLD_VERSION >= 200000

ifdef CONFIG_LTO_CLANG
ifdef CONFIG_LLD_HAS_ANNOTATE_TABLEJUMP
KBUILD_LDFLAGS += -mllvm --loongarch-annotate-tablejump
else
KBUILD_LDFLAGS += -mllvm --no-jump-tables
endif

Update the minimal llvm version or change Makefile to compat various
llvm versions, which one do you prefer? Pease let me know.

Thanks,
Tiezhu