[klibc] [kvm-unit-tests PATCH v3 1/4] Kbuild: add support for clang builds

Bill Wendling morbo at google.com
Sun Mar 29 16:45:46 PDT 2020


On Sun, Mar 29, 2020 at 4:38 AM Bill Wendling <morbo at google.com> wrote:
>
> Add cc-name to klibc/scripts/Kbuild.include.
>
> Make optimization flags not supported by clang conditional on cc-name.
>
> Use "--print-file-name=include" and "--print-libgcc-file-name" when
> using clang.
>
> Use cc-option to enable compiler-specific flags.
>
> Mark "bcmp" as not a builtin to prevent clang from using it.
>
> Signed-off-by: Bill Wendling <morbo at google.com>
> ---
>  scripts/Kbuild.include        |  8 ++++++--
>  scripts/Kbuild.klibc          | 13 +++++++++----
>  usr/klibc/Kbuild              |  4 ++--
>  usr/klibc/arch/x86_64/MCONFIG |  6 ++++--
>  4 files changed, 21 insertions(+), 10 deletions(-)
>
> diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include
> index a048ec7a..5604b3e3 100644
> --- a/scripts/Kbuild.include
> +++ b/scripts/Kbuild.include
> @@ -110,12 +110,12 @@ as-instr = $(call try-run,\
>  # Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586)
>
>  cc-option = $(call try-run,\
> -       $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -xc /dev/null -o "$$TMP",$(1),$(2))
> +       $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -Werror -c -xc /dev/null -o "$$TMP",$(1),$(2))
>
>  # cc-option-yn
>  # Usage: flag := $(call cc-option-yn,-march=winchip-c6)
>  cc-option-yn = $(call try-run,\
> -       $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -xc /dev/null -o "$$TMP",y,n)
> +       $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -Werror -c -xc /dev/null -o "$$TMP",y,n)
>
>  # cc-option-align
>  # Prefix align with either -falign or -malign
> @@ -127,6 +127,10 @@ cc-option-align = $(subst -functions=0,,\
>  cc-disable-warning = $(call try-run,\
>         $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) -W$(strip $(1)) -c -xc /dev/null -o "$$TMP",-Wno-$(strip $(1)))
>
> +# cc-name
> +# Expands to either gcc or clang
> +cc-name = $(shell $(CC) -v 2>&1 | grep -q "clang version" && echo clang || echo gcc)
> +
>  # cc-version
>  # Usage gcc-ver := $(call cc-version)
>  cc-version = $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-version.sh $(CC))
> diff --git a/scripts/Kbuild.klibc b/scripts/Kbuild.klibc
> index afc9a546..ca2539d6 100644
> --- a/scripts/Kbuild.klibc
> +++ b/scripts/Kbuild.klibc
> @@ -69,6 +69,7 @@ include $(srctree)/scripts/Kbuild.include
>  KLIBCREQFLAGS     := $(call cc-option, -fno-stack-protector, ) \
>                       $(call cc-option, -fwrapv, ) \
>                       $(call cc-option, -fno-PIE, ) \
> +                     $(call cc-option, -fno-builtin-bcmp, ) \
>                       -ggdb
>  KLIBCARCHREQFLAGS :=
>  KLIBCOPTFLAGS     :=
> @@ -108,10 +109,14 @@ KLIBCOBJDUMP     := $(OBJDUMP)
>
>  # klibc include paths
>  KLIBCCPPFLAGS    := -nostdinc -iwithprefix include \
> -                   -I$(KLIBCINC)/arch/$(KLIBCARCHDIR)  \
> +                    -I$(KLIBCINC)/arch/$(KLIBCARCHDIR) \
>                      -I$(KLIBCINC)/bits$(KLIBCBITSIZE)  \
> -                   -I$(KLIBCOBJ)/../include            \
> +                    -I$(KLIBCOBJ)/../include           \
>                      -I$(KLIBCINC)
> +ifeq ($(cc-name),clang)
> +KLIBCCPPFLAGS    += -I$(shell $(KLIBCCC) $(KLIBCCFLAGS) --print-file-name=include)
> +endif
> +
>  # kernel include paths
>  KLIBCKERNELSRC  ?= $(srctree)
>  KLIBCCPPFLAGS    += -I$(KLIBCKERNELSRC)/include                \
> @@ -128,8 +133,8 @@ KLIBCCFLAGS      += $(KLIBCCPPFLAGS) $(KLIBCREQFLAGS) $(KLIBCARCHREQFLAGS)  \
>  KLIBCAFLAGS      += -D__ASSEMBLY__ -Wa,--noexecstack $(KLIBCCFLAGS)
>  KLIBCSTRIPFLAGS  += --strip-all -R .comment -R .note
>
> -KLIBCLIBGCC_DEF  := $(shell $(KLIBCCC) $(KLIBCCFLAGS) --print-libgcc)
> -KLIBCLIBGCC     ?= $(KLIBCLIBGCC_DEF)
> +KLIBCLIBGCC_DEF  := $(shell $(KLIBCCC) $(KLIBCCFLAGS) $(if $(filter gcc,$(cc-name)),--print-libgcc,--print-libgcc-file-name))

I was doing some late night hacking and just realized that this change
is in contradiction to your other email asking that gcc and clang
options be placed in separate "ifeq" sections. I was being too clever
for my own good. Let me know if you'd like me to submit a v4 of these
patches.

> +KLIBCLIBGCC      ?= $(KLIBCLIBGCC_DEF)
>  KLIBCCRT0        := $(KLIBCOBJ)/arch/$(KLIBCARCHDIR)/crt0.o
>  KLIBCLIBC        := $(KLIBCOBJ)/libc.a
>  KLIBCCRTSHARED   := $(KLIBCOBJ)/interp.o
> diff --git a/usr/klibc/Kbuild b/usr/klibc/Kbuild
> index 24bad07d..c3ebff99 100644
> --- a/usr/klibc/Kbuild
> +++ b/usr/klibc/Kbuild
> @@ -85,8 +85,8 @@ endif
>
>  # These pass a huge maximum length to the corresponding length-limiting
>  # functions
> -KLIBCCFLAGS_sprintf.o += -Wno-format-truncation
> -KLIBCCFLAGS_vsprintf.o += -Wno-format-truncation
> +KLIBCCFLAGS_sprintf.o += $(call cc-option,-Wno-format-truncation, )
> +KLIBCCFLAGS_vsprintf.o += $(call cc-option,-Wno-format-truncation, )
>
>  # sigsuspend.c includes <klibc/havesyscall.h> generated by syscalls/
>  # build, so require that to build first
> diff --git a/usr/klibc/arch/x86_64/MCONFIG b/usr/klibc/arch/x86_64/MCONFIG
> index c5f2fa26..7eed8847 100644
> --- a/usr/klibc/arch/x86_64/MCONFIG
> +++ b/usr/klibc/arch/x86_64/MCONFIG
> @@ -15,8 +15,10 @@
>  # debugging using gdb.
>  #
>  KLIBCARCHREQFLAGS = -m64
> -KLIBCOPTFLAGS  += -Os -fomit-frame-pointer -mno-sse \
> -               -falign-functions=1 -falign-jumps=1 -falign-loops=1
> +KLIBCOPTFLAGS     += -Os -fomit-frame-pointer -mno-sse \
> +                     $(call cc-option,-falign-functions=1, )   \
> +                     $(call cc-option,-falign-jumps=1, )       \
> +                     $(call cc-option,-falign-loops=1, )
>  ifeq ($(DEBUG),y)
>  KLIBCOPTFLAGS     += -g
>  else
> --
> 2.26.0.rc2.310.g2932bb562d-goog
>


More information about the klibc mailing list