From: Roger Pau Monne Date: Fri, 23 Feb 2018 14:11:00 +0000 (+0000) Subject: x86/clang: allow integrated assembler usage X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=e3c6e1b8c2c1054d4b88f26c0b065ee59b109bc5;p=people%2Fdariof%2Fxen.git x86/clang: allow integrated assembler usage If the required features are present. Modify as-option-add to add an option in case the test fails, and use it to detect whether the required clang integrated assembler features are present. This patch has been tested with clang 3.5, clang 6, gcc 6.4.0 without retpoline support and gcc 7.3.1 with retpoline support. Signed-off-by: Andrew Cooper Signed-off-by: Roger Pau Monné Acked-by: Jan Beulich Acked-by: Wei Liu --- diff --git a/Config.mk b/Config.mk index ab05286630..b5ca57ce90 100644 --- a/Config.mk +++ b/Config.mk @@ -163,13 +163,14 @@ as-insn = $(if $(shell echo 'void _(void) { asm volatile ( $(2) ); }' \ | $(filter-out -M% %.d -include %/include/xen/config.h,$(1)) \ -c -x c -o /dev/null - 2>&1),$(4),$(3)) -# as-option-add: Add an option to compilation flags, but only if insn is -# supported by assembler. -# Usage: $(call as-option-add,CFLAGS,CC,"insn",option-yes) -as-option-add = $(eval $(call as-option-add-closure,$(1),$(2),$(3),$(4))) +# as-option-add: Conditionally add options to flags +# Usage: $(call as-option-add,CFLAGS,CC,"insn",option-yes,option-no) +as-option-add = $(eval $(call as-option-add-closure,$(1),$(2),$(3),$(4),$(5))) define as-option-add-closure ifeq ($$(call as-insn,$$($(2)) $$($(1)),$(3),y,n),y) $(1) += $(4) + else + $(1) += $(5) endif endef diff --git a/xen/Rules.mk b/xen/Rules.mk index ef26b8d1bb..5337e206ee 100644 --- a/xen/Rules.mk +++ b/xen/Rules.mk @@ -70,8 +70,12 @@ endif AFLAGS-y += -D__ASSEMBLY__ -# Clang's built-in assembler can't handle embedded .include's -CFLAGS-$(clang) += -no-integrated-as +# Older clang's built-in assembler doesn't understand .skip with labels: +# https://bugs.llvm.org/show_bug.cgi?id=27369 +ifeq ($(clang),y) +$(call as-option-add,CFLAGS,CC,".L0:\n.L1:\n.skip (.L1 - .L0)",,\ + -no-integrated-as) +endif ALL_OBJS := $(ALL_OBJS-y) diff --git a/xen/arch/x86/Rules.mk b/xen/arch/x86/Rules.mk index 4561713368..9897deaab9 100644 --- a/xen/arch/x86/Rules.mk +++ b/xen/arch/x86/Rules.mk @@ -44,3 +44,18 @@ endif # Set up the assembler include path properly for older toolchains. CFLAGS += -Wa,-I$(BASEDIR)/include + +ifeq ($(clang),y) +# Note: Any test which adds -no-integrated-as will cause subsequent tests to +# succeed, and not trigger further additions. + +# Check whether clang asm()-s support .include. +$(call as-option-add,CFLAGS,CC,".include \"asm/indirect_thunk_asm.h\"",,\ + -no-integrated-as) + +# Check whether clang keeps .macro-s between asm()-s: +# https://bugs.llvm.org/show_bug.cgi?id=36110 +$(call as-option-add,CFLAGS,CC,\ + ".macro FOO\n.endm\"); asm volatile (\".macro FOO\n.endm",\ + -no-integrated-as) +endif