LoongArch: Error out if clang version is less than 17.0.0

Message ID 1690871446-23713-1-git-send-email-yangtiezhu@loongson.cn
State New
Headers
Series LoongArch: Error out if clang version is less than 17.0.0 |

Commit Message

Tiezhu Yang Aug. 1, 2023, 6:30 a.m. UTC
  On my test machine, the clang version is 16.0.4, when build kernel
with clang:

  make CC=clang loongson3_defconfig
  make CC=clang

there exist many errors such as:

  clang-16: error: argument unused during compilation: '-mabi=lp64s'
  error: unknown register name 'a0' in asm
  error: unknown register name 't0' in asm

the above issues have been fixed in the upstream llvm project recently,
it works well when update clang version to 17.0.0:

  make CC=clang loongson3_defconfig
  make CC=clang menuconfig (set CONFIG_MODULES=n and CONFIG_RELOCATABLE=n)
  make CC=clang

thus 17.0.0 is the minimal clang version to build kernel on LoongArch,
it is better to error out if clang version is less than 17.0.0, then
we can do the right thing to update clang version and avoid wasting
time to analysis kernel errors.

By the way, the clang 17.0.0 still have some issues to build kernel on
LoongArch, you need to unset CONFIG_MODULES and CONFIG_RELOCATABLE to
avoid build errors. Additionally, if you want a workable kernel, some
modules should be set as y instead of m if CONFIG_MODULES=n.

Link: https://github.com/ClangBuiltLinux/linux/issues/1787
Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
---
 arch/loongarch/Makefile | 6 ++++++
 1 file changed, 6 insertions(+)
  

Comments

Nathan Chancellor Aug. 1, 2023, 1:40 p.m. UTC | #1
Hi Tiezhu,

On Tue, Aug 01, 2023 at 02:30:46PM +0800, Tiezhu Yang wrote:
> On my test machine, the clang version is 16.0.4, when build kernel
> with clang:
> 
>   make CC=clang loongson3_defconfig
>   make CC=clang
> 
> there exist many errors such as:
> 
>   clang-16: error: argument unused during compilation: '-mabi=lp64s'
>   error: unknown register name 'a0' in asm
>   error: unknown register name 't0' in asm
> 
> the above issues have been fixed in the upstream llvm project recently,
> it works well when update clang version to 17.0.0:
> 
>   make CC=clang loongson3_defconfig
>   make CC=clang menuconfig (set CONFIG_MODULES=n and CONFIG_RELOCATABLE=n)
>   make CC=clang
> 
> thus 17.0.0 is the minimal clang version to build kernel on LoongArch,
> it is better to error out if clang version is less than 17.0.0, then
> we can do the right thing to update clang version and avoid wasting
> time to analysis kernel errors.
> 
> By the way, the clang 17.0.0 still have some issues to build kernel on
> LoongArch, you need to unset CONFIG_MODULES and CONFIG_RELOCATABLE to
> avoid build errors. Additionally, if you want a workable kernel, some
> modules should be set as y instead of m if CONFIG_MODULES=n.
> 
> Link: https://github.com/ClangBuiltLinux/linux/issues/1787
> Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
> ---
>  arch/loongarch/Makefile | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/arch/loongarch/Makefile b/arch/loongarch/Makefile
> index b1e5db5..f07f62a 100644
> --- a/arch/loongarch/Makefile
> +++ b/arch/loongarch/Makefile
> @@ -10,6 +10,12 @@ KBUILD_DEFCONFIG := loongson3_defconfig
>  image-name-y			:= vmlinux
>  image-name-$(CONFIG_EFI_ZBOOT)	:= vmlinuz
>  
> +ifdef CONFIG_CC_IS_CLANG
> +  ifneq ($(call clang-min-version, 170000),y)
> +    $(error Sorry, you need a newer clang version >= 17.0.0)
> +  endif
> +endif
> +

Thanks for the patch! I agree that we should restrict LoongArch to LLVM
17 and newer. However, there is already existing infrastructure for this
type of check in Kconfig, so we don't need to add anything to
arch/loongarch. Just modify scripts/min-tool-version.sh like so then
there will be a message during configuration time that the compiler is
too old.

diff --git a/scripts/min-tool-version.sh b/scripts/min-tool-version.sh
index 2ade63149466..572c0526ad61 100755
--- a/scripts/min-tool-version.sh
+++ b/scripts/min-tool-version.sh
@@ -26,6 +26,8 @@ gcc)
 llvm)
 	if [ "$SRCARCH" = s390 ]; then
 		echo 15.0.0
+	elif [ "$SRCARCH" = loongarch ]; then
+		echo 17.0.0
 	else
 		echo 11.0.0
 	fi

***
*** C compiler is too old.
***   Your Clang version:    16.0.6
***   Minimum Clang version: 17.0.0
***
scripts/Kconfig.include:44: Sorry, this C compiler is not supported.

>  ifndef CONFIG_EFI_STUB
>  KBUILD_IMAGE	:= $(boot)/vmlinux.elf
>  else
> -- 
> 2.1.0
> 
> 

Cheers,
Nathan
  
Huacai Chen Aug. 2, 2023, 2:45 a.m. UTC | #2
Hi,

On Tue, Aug 1, 2023 at 9:40 PM Nathan Chancellor <nathan@kernel.org> wrote:
>
> Hi Tiezhu,
>
> On Tue, Aug 01, 2023 at 02:30:46PM +0800, Tiezhu Yang wrote:
> > On my test machine, the clang version is 16.0.4, when build kernel
> > with clang:
> >
> >   make CC=clang loongson3_defconfig
> >   make CC=clang
> >
> > there exist many errors such as:
> >
> >   clang-16: error: argument unused during compilation: '-mabi=lp64s'
> >   error: unknown register name 'a0' in asm
> >   error: unknown register name 't0' in asm
> >
> > the above issues have been fixed in the upstream llvm project recently,
> > it works well when update clang version to 17.0.0:
> >
> >   make CC=clang loongson3_defconfig
> >   make CC=clang menuconfig (set CONFIG_MODULES=n and CONFIG_RELOCATABLE=n)
> >   make CC=clang
> >
> > thus 17.0.0 is the minimal clang version to build kernel on LoongArch,
> > it is better to error out if clang version is less than 17.0.0, then
> > we can do the right thing to update clang version and avoid wasting
> > time to analysis kernel errors.
> >
> > By the way, the clang 17.0.0 still have some issues to build kernel on
> > LoongArch, you need to unset CONFIG_MODULES and CONFIG_RELOCATABLE to
> > avoid build errors. Additionally, if you want a workable kernel, some
> > modules should be set as y instead of m if CONFIG_MODULES=n.
> >
> > Link: https://github.com/ClangBuiltLinux/linux/issues/1787
> > Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
> > ---
> >  arch/loongarch/Makefile | 6 ++++++
> >  1 file changed, 6 insertions(+)
> >
> > diff --git a/arch/loongarch/Makefile b/arch/loongarch/Makefile
> > index b1e5db5..f07f62a 100644
> > --- a/arch/loongarch/Makefile
> > +++ b/arch/loongarch/Makefile
> > @@ -10,6 +10,12 @@ KBUILD_DEFCONFIG := loongson3_defconfig
> >  image-name-y                 := vmlinux
> >  image-name-$(CONFIG_EFI_ZBOOT)       := vmlinuz
> >
> > +ifdef CONFIG_CC_IS_CLANG
> > +  ifneq ($(call clang-min-version, 170000),y)
> > +    $(error Sorry, you need a newer clang version >= 17.0.0)
> > +  endif
> > +endif
> > +
>
> Thanks for the patch! I agree that we should restrict LoongArch to LLVM
> 17 and newer. However, there is already existing infrastructure for this
> type of check in Kconfig, so we don't need to add anything to
> arch/loongarch. Just modify scripts/min-tool-version.sh like so then
> there will be a message during configuration time that the compiler is
> too old.
>
> diff --git a/scripts/min-tool-version.sh b/scripts/min-tool-version.sh
> index 2ade63149466..572c0526ad61 100755
> --- a/scripts/min-tool-version.sh
> +++ b/scripts/min-tool-version.sh
> @@ -26,6 +26,8 @@ gcc)
>  llvm)
>         if [ "$SRCARCH" = s390 ]; then
>                 echo 15.0.0
> +       elif [ "$SRCARCH" = loongarch ]; then
> +               echo 17.0.0
>         else
>                 echo 11.0.0
>         fi
>
> ***
> *** C compiler is too old.
> ***   Your Clang version:    16.0.6
> ***   Minimum Clang version: 17.0.0
> ***
> scripts/Kconfig.include:44: Sorry, this C compiler is not supported.
This method is better, but since Clang17 cannot build a
full-functional kernel (CONFIG_MODULES, may be solved in Clang18), I
suggest "fix" it in future until all features can be enabled.

Huacai
>
> >  ifndef CONFIG_EFI_STUB
> >  KBUILD_IMAGE := $(boot)/vmlinux.elf
> >  else
> > --
> > 2.1.0
> >
> >
>
> Cheers,
> Nathan
  

Patch

diff --git a/arch/loongarch/Makefile b/arch/loongarch/Makefile
index b1e5db5..f07f62a 100644
--- a/arch/loongarch/Makefile
+++ b/arch/loongarch/Makefile
@@ -10,6 +10,12 @@  KBUILD_DEFCONFIG := loongson3_defconfig
 image-name-y			:= vmlinux
 image-name-$(CONFIG_EFI_ZBOOT)	:= vmlinuz
 
+ifdef CONFIG_CC_IS_CLANG
+  ifneq ($(call clang-min-version, 170000),y)
+    $(error Sorry, you need a newer clang version >= 17.0.0)
+  endif
+endif
+
 ifndef CONFIG_EFI_STUB
 KBUILD_IMAGE	:= $(boot)/vmlinux.elf
 else