# HG changeset patch # User Tim Deegan # Date 1299496871 0 # Node ID d91e6a8d36ad3dbf89f42264334baec0cb37063f # Parent 804007170cf03ea832022e2d589507a3bc0505dc xen: add "clang=y" option to build Xen with clang/llvm instead of gcc. Tested with svn snapshot of clang and llvm from 17 February 2011. Only x86_64 hypervisor builds (make dist-xen clang=y) are supported and I haven't even begun to look at cross-compiling. Signed-off-by: Tim Deegan diff -r 804007170cf0 -r d91e6a8d36ad Config.mk --- a/Config.mk Mon Mar 07 11:21:11 2011 +0000 +++ b/Config.mk Mon Mar 07 11:21:11 2011 +0000 @@ -148,6 +148,13 @@ CFLAGS += -Wall -Wstrict-prototypes # result of any casted expression causes a warning. CFLAGS += -Wno-unused-value +ifeq ($(clang),y) +# Clang complains about macros that expand to 'if ( ( foo == bar ) ) ...' +CFLAGS += -Wno-parentheses +# And is over-zealous with the printf format lint +CFLAGS += -Wno-format +endif + $(call cc-option-add,HOSTCFLAGS,HOSTCC,-Wdeclaration-after-statement) $(call cc-option-add,CFLAGS,CC,-Wdeclaration-after-statement) diff -r 804007170cf0 -r d91e6a8d36ad config/StdGNU.mk --- a/config/StdGNU.mk Mon Mar 07 11:21:11 2011 +0000 +++ b/config/StdGNU.mk Mon Mar 07 11:21:11 2011 +0000 @@ -1,6 +1,11 @@ AS = $(CROSS_COMPILE)as +ifeq ($(clang),y) +LD = $(CROSS_COMPILE)gold +CC = $(CROSS_COMPILE)clang +else LD = $(CROSS_COMPILE)ld CC = $(CROSS_COMPILE)gcc +endif CPP = $(CC) -E AR = $(CROSS_COMPILE)ar RANLIB = $(CROSS_COMPILE)ranlib @@ -69,5 +74,8 @@ ifneq ($(debug),y) CFLAGS += -O2 -fomit-frame-pointer else # Less than -O1 produces bad code and large stack frames -CFLAGS += -O1 -fno-omit-frame-pointer -fno-optimize-sibling-calls +CFLAGS += -O1 -fno-omit-frame-pointer +ifneq ($(clang),y) +CFLAGS += -fno-optimize-sibling-calls endif +endif diff -r 804007170cf0 -r d91e6a8d36ad xen/Makefile --- a/xen/Makefile Mon Mar 07 11:21:11 2011 +0000 +++ b/xen/Makefile Mon Mar 07 11:21:11 2011 +0000 @@ -88,7 +88,7 @@ include/xen/compile.h: include/xen/compi -e 's/@@whoami@@/$(XEN_WHOAMI)/g' \ -e 's/@@domain@@/$(XEN_DOMAIN)/g' \ -e 's/@@hostname@@/$(shell hostname)/g' \ - -e 's!@@compiler@@!$(shell $(CC) $(CFLAGS) -v 2>&1 | tail -1)!g' \ + -e 's!@@compiler@@!$(shell $(CC) $(CFLAGS) -v 2>&1 | grep version | tail -1)!g' \ -e 's/@@version@@/$(XEN_VERSION)/g' \ -e 's/@@subversion@@/$(XEN_SUBVERSION)/g' \ -e 's/@@extraversion@@/$(XEN_EXTRAVERSION)/g' \ diff -r 804007170cf0 -r d91e6a8d36ad xen/Rules.mk --- a/xen/Rules.mk Mon Mar 07 11:21:11 2011 +0000 +++ b/xen/Rules.mk Mon Mar 07 11:21:11 2011 +0000 @@ -62,6 +62,9 @@ endif AFLAGS-y += -D__ASSEMBLY__ +# Clang's built-in assembler can't handle .code16/.code32/.code64 yet +AFLAGS-$(clang) += -no-integrated-as + ALL_OBJS := $(ALL_OBJS-y) # Get gcc to generate the dependencies for us. diff -r 804007170cf0 -r d91e6a8d36ad xen/arch/x86/Rules.mk --- a/xen/arch/x86/Rules.mk Mon Mar 07 11:21:11 2011 +0000 +++ b/xen/arch/x86/Rules.mk Mon Mar 07 11:21:11 2011 +0000 @@ -12,9 +12,12 @@ xenoprof := y supervisor_mode_kernel ?= n # Solaris grabs stdarg.h and friends from the system include directory. +# Clang likewise. ifneq ($(XEN_OS),SunOS) +ifneq ($(clang),y) CFLAGS += -nostdinc endif +endif CFLAGS += -fno-builtin -fno-common -Wredundant-decls CFLAGS += -iwithprefix include -Werror -Wno-pointer-arith -pipe @@ -49,5 +52,7 @@ x86_32 := n x86_64 := y endif +ifneq ($(clang),y) # Require GCC v3.4+ (to avoid issues with alignment constraints in Xen headers) $(call cc-ver-check,CC,0x030400,"Xen requires at least gcc-3.4") +endif