Re: [PATCH 7/9] LoongArch: Tweak CFLAGS for Clang compatibility

From: Nick Desaulniers
Date: Fri Jun 23 2023 - 12:39:47 EST


On Fri, Jun 23, 2023 at 6:44 AM WANG Xuerui <kernel@xxxxxxxxxx> wrote:
>
> From: WANG Xuerui <git@xxxxxxxxxx>
>
> Now the arch code is mostly ready for LLVM/Clang consumption, it is time
> to re-organize the CFLAGS a little to actually enable the LLVM build.
>
> A build with !RELOCATABLE && !MODULE is confirmed working within a QEMU
> environment; support for the two features are currently blocked by
> LLVM/Clang, and will come later.
>
> Signed-off-by: WANG Xuerui <git@xxxxxxxxxx>
> ---
> arch/loongarch/Makefile | 14 +++++++++++---
> arch/loongarch/vdso/Makefile | 6 +++++-
> 2 files changed, 16 insertions(+), 4 deletions(-)
>
> diff --git a/arch/loongarch/Makefile b/arch/loongarch/Makefile
> index a27e264bdaa5..efe9b50bd829 100644
> --- a/arch/loongarch/Makefile
> +++ b/arch/loongarch/Makefile
> @@ -46,12 +46,18 @@ ld-emul = $(64bit-emul)
> cflags-y += -mabi=lp64s
> endif
>
> -cflags-y += -G0 -pipe -msoft-float

This seems to drop -msoft-float for GCC. Intentional?

> -LDFLAGS_vmlinux += -G0 -static -n -nostdlib
> +ifndef CONFIG_CC_IS_CLANG
> +cflags-y += -G0
> +LDFLAGS_vmlinux += -G0

Thanks for the patch!

I can understand not passing -G0 to clang if clang doesn't understand
it, but should you be using CONFIG_LD_IS_LLD for LDFLAGS?

What does -G0 do?

Is there a plan to support it in clang and lld?

If so, please file a bug in LLVM's issue tracker
https://github.com/llvm/llvm-project/issues
then link to it in a comment in this Makefile above the relevant condition.

> +endif
> +cflags-y += -pipe
> +LDFLAGS_vmlinux += -static -n -nostdlib
>
> # When the assembler supports explicit relocation hint, we must use it.
> # GCC may have -mexplicit-relocs off by default if it was built with an old
> -# assembler, so we force it via an option.
> +# assembler, so we force it via an option. For LLVM/Clang the desired behavior
> +# is the default, and the flag is not supported, so don't pass it if Clang is
> +# being used.
> #
> # When the assembler does not supports explicit relocation hint, we can't use
> # it. Disable it if the compiler supports it.
> @@ -61,8 +67,10 @@ LDFLAGS_vmlinux += -G0 -static -n -nostdlib
> # combination of a "new" assembler and "old" compiler is not supported. Either
> # upgrade the compiler or downgrade the assembler.
> ifdef CONFIG_AS_HAS_EXPLICIT_RELOCS
> +ifndef CONFIG_CC_IS_CLANG
> cflags-y += -mexplicit-relocs
> KBUILD_CFLAGS_KERNEL += -mdirect-extern-access
> +endif

Why would AS_HAS_EXPLICIT_RELOCS be set if -mexplicit-relocs isn't
supported? Is the kconfig for that broken?

Does AS_HAS_EXPLICIT_RELOCS also need to test for the support for
-mdirect-extern-access or should there be a new config for that?
CC_SUPPORTS_DIRECT_EXTERN_ACCESS

> else
> cflags-y += $(call cc-option,-mno-explicit-relocs)
> KBUILD_AFLAGS_KERNEL += -Wa,-mla-global-with-pcrel
> diff --git a/arch/loongarch/vdso/Makefile b/arch/loongarch/vdso/Makefile
> index 4c859a0e4754..19f6c75a1106 100644
> --- a/arch/loongarch/vdso/Makefile
> +++ b/arch/loongarch/vdso/Makefile
> @@ -25,13 +25,17 @@ endif
> cflags-vdso := $(ccflags-vdso) \
> -isystem $(shell $(CC) -print-file-name=include) \
> $(filter -W%,$(filter-out -Wa$(comma)%,$(KBUILD_CFLAGS))) \
> - -O2 -g -fno-strict-aliasing -fno-common -fno-builtin -G0 \
> + -O2 -g -fno-strict-aliasing -fno-common -fno-builtin \
> -fno-stack-protector -fno-jump-tables -DDISABLE_BRANCH_PROFILING \
> $(call cc-option, -fno-asynchronous-unwind-tables) \
> $(call cc-option, -fno-stack-protector)
> aflags-vdso := $(ccflags-vdso) \
> -D__ASSEMBLY__ -Wa,-gdwarf-2
>
> +ifndef CONFIG_CC_IS_CLANG
> +cflags-vdso += -G0
> +endif
> +
> ifneq ($(c-gettimeofday-y),)
> CFLAGS_vgettimeofday.o += -include $(c-gettimeofday-y)
> endif
> --
> 2.40.0
>
>


--
Thanks,
~Nick Desaulniers