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 <andrew.cooper3@citrix.com>
Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Wei Liu <wei.liu2@citrix.com>
| $(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
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)
# 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