On 10/19/2014 3:03 PM, Marcin Cieslak wrote:

On Sun, 19 Oct 2014, Matthew Grooms wrote:

[...]

I have recently managed to compile Xen (4.5 unstable from git master) using
few patches in the source code (I posted them to xen-devel@, most of them
are almost the same as some earlier work by Julien Grall).


Hi Marcin,

I pulled in a few patches that were posted on the xen-devel list to get things to compile. Attached was the subset that I needed to get Xen 4.5 to build with the clang 3.4.1 ( with seabios disabled ).

I have used clang version 3.5.0 (trunk) from ports just for the .code16
support, other than that clang 3.4.1 was fine.


Do you have a link to your patch set? I sifted through the ones posted by Julien and I probably saw most of yours as well. My goal was to get as much as possible to compile with the existing system compiler so I didn't try 3.5.0. Maybe that's a better bet.

Xen kernel compiled this way even boots successfully and starts Debian
dom0.


I was able to boot a FreeBSD PVH dom0 based on Rogers instructions. Pretty amazing that it all works with a GENERIC kernel. Was mostly focusing on getting the compile clean enough for a port/pkg of the final 4.5 release.

[mgrooms@xen2 ~]$ uname -a
FreeBSD xen2.shrew.lab 11.0-CURRENT FreeBSD 11.0-CURRENT #0 a50212f(pvh_dom0_v7): Sun Oct 19 09:57:23 CDT 2014 r...@xen2.shrew.lab:/usr/obj/usr/src/sys/GENERIC amd64
[root@xen2 ~]# xl list
Name ID Mem VCPUs State Time(s) Domain-0 0 1024 2 r----- 7.1

This command was used to compile with 3.4.1 (without hvmloader):
env CFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib gmake clang=y
CC=clang-devel HOSTCC=clang-devel CONFIG_SEABIOS=y CONFIG_HVMLOADER=n
SEABIOS_PATH=$HOME/qemu/bios.bin-1.7.5 CONFIG_QEMU=n "$@"


Thanks for that. I hope the Xen devs can get the yajl and signed int patches committed. Those were the only C level code changes I ran into and would clean up the build significantly for clang users. Tho only other knit was the ...

register unsigned long sp asm("rsp");

... assembly but maybe that compiles with 3.5 as well?

http://llvm.org/bugs/show_bug.cgi?id=11255

Everything else was build level compiler flag fiddling.

-Matthew
diff --git a/Config.mk b/Config.mk
index 6324237..0cd3553 100644
--- a/Config.mk
+++ b/Config.mk
@@ -36,10 +36,13 @@ CONFIG_$(XEN_OS) := y
 SHELL     ?= /bin/sh
 
 # Tools to run on system hosting the build
-HOSTCC      = gcc
+HOSTCC      = cc
 HOSTCFLAGS  = -Wall -Werror -Wstrict-prototypes -O2 -fomit-frame-pointer
 HOSTCFLAGS += -fno-strict-aliasing
 
+# Clang specific
+HOSTCFLAGS += -Wno-ignored-attributes
+
 DISTDIR     ?= $(XEN_ROOT)/dist
 DESTDIR     ?= /
 
@@ -54,7 +57,6 @@ else
 gcc := n
 endif
 
-
 include $(XEN_ROOT)/config/$(XEN_OS).mk
 include $(XEN_ROOT)/config/$(XEN_TARGET_ARCH).mk
 
@@ -193,6 +195,7 @@ CFLAGS += -Wall -Wstrict-prototypes
 # and is over-zealous with the printf format lint
 # and is a bit too fierce about unused return values
 CFLAGS-$(clang) += -Wno-parentheses -Wno-format -Wno-unused-value
+CFLAGS-$(clang) += -Wno-ignored-attributes -Qunused-arguments
 
 $(call cc-option-add,HOSTCFLAGS,HOSTCC,-Wdeclaration-after-statement)
 $(call cc-option-add,CFLAGS,CC,-Wdeclaration-after-statement)
diff --git a/tools/Rules.mk b/tools/Rules.mk
index 87a56dc..ab47f54 100644
--- a/tools/Rules.mk
+++ b/tools/Rules.mk
@@ -17,6 +17,10 @@ XEN_LIBXENSTAT     = $(XEN_ROOT)/tools/xenstat/libxenstat/src
 XEN_BLKTAP2        = $(XEN_ROOT)/tools/blktap2
 XEN_LIBVCHAN       = $(XEN_ROOT)/tools/libvchan
 
+CFLAGS-$(clang) += -Wno-ignored-attributes -Wno-header-guard
+CFLAGS-$(clang) += -no-integrated-as
+CFLAGS-$(clang) += -DYAJL_MAJOR=2
+
 CFLAGS_xeninclude = -I$(XEN_INCLUDE)
 
 XENSTORE_XENSTORED ?= y
@@ -70,6 +74,10 @@ CFLAGS_libxenlight = -I$(XEN_XENLIGHT) $(CFLAGS_libxenctrl) 
$(CFLAGS_xeninclude)
 LDLIBS_libxenlight = $(XEN_XENLIGHT)/libxenlight$(libextension) 
$(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(SHLIB_libblktapctl)
 SHLIB_libxenlight  = -Wl,-rpath-link=$(XEN_XENLIGHT)
 
+CFLAGS_libxenlight += -I/usr/local/include
+CFLAGS_libxenlight += -Wno-format-nonliteral
+LDFLAGS_libxenlight += -L/usr/local/lib
+
 CFLAGS += -D__XEN_TOOLS__
 
 # Get gcc to generate the dependencies for us.
diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile
index df08c8a..a68f15a 100644
--- a/tools/libxl/Makefile
+++ b/tools/libxl/Makefile
@@ -12,7 +12,7 @@ XLUMAJOR = 4.3
 XLUMINOR = 0
 
 CFLAGS += -Werror -Wno-format-zero-length -Wmissing-declarations \
-       -Wno-declaration-after-statement -Wformat-nonliteral
+       -Wno-declaration-after-statement
 CFLAGS += -I. -fPIC
 
 ifeq ($(CONFIG_Linux),y)
@@ -25,6 +25,7 @@ ifeq ($(CONFIG_REMUS_NETBUF),y)
 LIBXL_LIBS += $(LIBNL3_LIBS)
 endif
 
+CFLAGS_LIBXL = $(CFLAGS_libxenlight)
 CFLAGS_LIBXL += $(CFLAGS_libxenctrl)
 CFLAGS_LIBXL += $(CFLAGS_libxenguest)
 CFLAGS_LIBXL += $(CFLAGS_libxenstore)
@@ -37,7 +38,7 @@ CFLAGS_LIBXL += -Wshadow
 LIBXL_LIBS-$(CONFIG_ARM) += -lfdt
 
 CFLAGS += $(PTHREAD_CFLAGS)
-LDFLAGS += $(PTHREAD_LDFLAGS)
+LDFLAGS += $(PTHREAD_LDFLAGS) $(LDFLAGS_libxenlight)
 LIBXL_LIBS += $(PTHREAD_LIBS)
 LIBXL_LIBS += $(LIBXL_LIBS-y)
 
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index 7ed601e..ba66a66 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -1773,7 +1773,7 @@ libxl__json_map_node *libxl__json_map_node_get(const 
libxl__json_object *o,
 _hidden const libxl__json_object *libxl__json_map_get(const char *key,
                                           const libxl__json_object *o,
                                           libxl__json_node_type expected_type);
-_hidden yajl_status libxl__json_object_to_yajl_gen(libxl__gc *gc_opt,
+_hidden yajl_gen_status libxl__json_object_to_yajl_gen(libxl__gc *gc_opt,
                                                    yajl_gen hand,
                                                    libxl__json_object *param);
 _hidden void libxl__json_object_free(libxl__gc *gc_opt,
diff --git a/tools/libxl/libxl_json.c b/tools/libxl/libxl_json.c
index ceb014a..6f64be9 100644
--- a/tools/libxl/libxl_json.c
+++ b/tools/libxl/libxl_json.c
@@ -610,12 +610,12 @@ const libxl__json_object *libxl__json_map_get(const char 
*key,
     return NULL;
 }
 
-yajl_status libxl__json_object_to_yajl_gen(libxl__gc *gc,
+yajl_gen_status libxl__json_object_to_yajl_gen(libxl__gc *gc,
                                            yajl_gen hand,
                                            libxl__json_object *obj)
 {
     int idx = 0;
-    yajl_status rc;
+    yajl_gen_status rc;
 
     switch (obj->type) {
     case JSON_NULL:
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
index 988ee28..61eda4c 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -3360,7 +3360,7 @@ static void list_domains(int verbose, int context, int 
claim, int numa,
     printf("\n");
     for (i = 0; i < nb_domain; i++) {
         char *domname;
-        unsigned shutdown_reason;
+        int shutdown_reason;
         domname = libxl_domid_to_name(ctx, info[i].domid);
         shutdown_reason = info[i].shutdown ? info[i].shutdown_reason : 0;
         printf("%-40s %5d %5lu %5d     %c%c%c%c%c%c  %8.1f",
@@ -4908,7 +4908,7 @@ static void output_xeninfo(void)
         return;
     }
 
-    if ((sched = libxl_get_scheduler(ctx)) < 0) {
+    if ((int)(sched = libxl_get_scheduler(ctx)) < 0) {
         fprintf(stderr, "get_scheduler sysctl failed.\n");
         return;
     }
@@ -6913,7 +6913,7 @@ int main_cpupoolcreate(int argc, char **argv)
             goto out_cfg;
         }
     } else {
-        if ((sched = libxl_get_scheduler(ctx)) < 0) {
+        if ((int)(sched = libxl_get_scheduler(ctx)) < 0) {
             fprintf(stderr, "get_scheduler sysctl failed.\n");
             goto out_cfg;
         }
diff --git a/xen/Rules.mk b/xen/Rules.mk
index a97405c..85b1eb3 100644
--- a/xen/Rules.mk
+++ b/xen/Rules.mk
@@ -74,8 +74,12 @@ endif
 
 AFLAGS-y                += -D__ASSEMBLY__ -include 
$(BASEDIR)/include/xen/config.h
 
+# Clang complains without these
+CFLAGS-$(clang)                += -Wno-unused-function 
-Wno-initializer-overrides
+
 # Clang's built-in assembler can't handle .code16/.code32/.code64 yet
 AFLAGS-$(clang)         += -no-integrated-as
+CFLAGS-$(clang)         += -no-integrated-as -v
 
 ALL_OBJS := $(ALL_OBJS-y)
 
diff --git a/xen/include/asm-x86/current.h b/xen/include/asm-x86/current.h
index b95fd79..f884493 100644
--- a/xen/include/asm-x86/current.h
+++ b/xen/include/asm-x86/current.h
@@ -27,6 +27,8 @@ static inline struct cpu_info *get_cpu_info(void)
 {
     register unsigned long sp asm("rsp");
 
+    asm("" : "=r" (sp));
+
     return (struct cpu_info *)((sp & ~(STACK_SIZE-1)) + STACK_SIZE) - 1;
 }
 
_______________________________________________
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"

Reply via email to