xen: add "clang=y" option to build Xen with clang/llvm instead of gcc.
authorTim Deegan <Tim.Deegan@citrix.com>
Mon, 7 Mar 2011 11:21:11 +0000 (11:21 +0000)
committerTim Deegan <Tim.Deegan@citrix.com>
Mon, 7 Mar 2011 11:21:11 +0000 (11:21 +0000)
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 <Tim.Deegan@citrix.com>
Acked-by: Keir Fraser <keir@xen.org>
Config.mk
config/StdGNU.mk
xen/Makefile
xen/Rules.mk
xen/arch/x86/Rules.mk

index 753d3327c3c8e5c18e3d735f6ecad0df29f857aa..aee6e5b8adcb6270251dc5cd5ed5914609de2836 100644 (file)
--- a/Config.mk
+++ b/Config.mk
@@ -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)
 
index f27bdc59f524e82dcafcae0c794fd74721e10a73..d73e644bbfb8fa1b53b8c768b582f3dcabda06b4 100644 (file)
@@ -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
index 8b04f8b10738de3180b9ce69d4f04a8e84a0007a..64f73cb64c6b9b0a128eca5f14793bd58cc914e6 100644 (file)
@@ -88,7 +88,7 @@ include/xen/compile.h: include/xen/compile.h.in .banner
            -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' \
index d3348144c06e8a6bf88f0c5bcffa49dd77a0faca..59d0dc7c3173736bd4a2655e8fd3ff7423fcaf6b 100644 (file)
@@ -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.
index ec3abdd2beac7b1ce2468dd66b4e35fb5149384d..f951398b60f8ac8c689ac0071f7aa7a4f62f78bb 100644 (file)
@@ -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