s390x/DYNAMIC_ARCH: generalize detecting supported archs for clang
authorMarius Hillenbrand <mhillen@linux.ibm.com>
Fri, 4 Sep 2020 14:32:45 +0000 (16:32 +0200)
committerMarius Hillenbrand <mhillen@linux.ibm.com>
Tue, 8 Sep 2020 17:34:18 +0000 (19:34 +0200)
Simplify detection of which kernels we can compile on s390x. Instead of
decoding the gcc version in a complicated manner, just check if CC
supports a given -march=archXY flag. Together with the next patch, we
thereby gain support for builds with LLVM/clang with DYNAMIC_ARCH=1.

Signed-off-by: Marius Hillenbrand <mhillen@linux.ibm.com>
Makefile.system

index e7d3dc4..f4a42f7 100644 (file)
@@ -295,7 +295,6 @@ endif
 ifeq ($(C_COMPILER), GCC)
 GCCVERSIONGTEQ4 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 4)
 GCCVERSIONGT4 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \> 4)
-GCCVERSIONEQ5 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` = 5)
 GCCVERSIONGT5 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \> 5)
 GCCVERSIONGTEQ7 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 7)
 GCCVERSIONGTEQ9 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 9)
@@ -594,34 +593,34 @@ endif
 ifeq ($(ARCH), zarch)
 DYNAMIC_CORE = ZARCH_GENERIC
 
-# Z13 is supported since gcc-5.2, gcc-6, and in RHEL 7.3 and newer
-ifeq ($(GCCVERSIONGT5), 1)
-       ZARCH_SUPPORT_Z13 := 1
-else ifeq ($(GCCVERSIONEQ5), 1)
-ifeq ($(GCCMINORVERSIONGTEQ2), 1)
-       ZARCH_SUPPORT_Z13 := 1
-endif
-endif
-
-ifeq ($(wildcard /etc/redhat-release), /etc/redhat-release)
-ifeq ($(shell source /etc/os-release ; expr $$VERSION_ID \>= "7.3"), 1)
-       ZARCH_SUPPORT_Z13 := 1
-endif
-endif
-
-ifeq ($(ZARCH_SUPPORT_Z13), 1)
+# if the compiler accepts -march=arch11 or -march=z13 and can compile a file
+# with z13-specific inline assembly, then we can include support for Z13.
+# note: -march=z13 is equivalent to -march=arch11 yet some compiler releases
+# only support one or the other.
+# note: LLVM version 6.x supported -march=z13 yet could not handle vector
+# registers in inline assembly, so the check for supporting the -march flag is
+# not enough.
+ZARCH_TEST_COMPILE=-c $(TOPDIR)/kernel/zarch/damin_z13.c -I$(TOPDIR) -o /dev/null > /dev/null 2> /dev/null
+ZARCH_CC_SUPPORTS_ARCH11=$(shell $(CC) -march=arch11 $(ZARCH_TEST_COMPILE) && echo 1)
+ZARCH_CC_SUPPORTS_Z13=$(shell $(CC) -march=z13 $(ZARCH_TEST_COMPILE) && echo 1)
+
+ifeq ($(or $(ZARCH_CC_SUPPORTS_ARCH11), $(ZARCH_CC_SUPPORTS_Z13)), 1)
 DYNAMIC_CORE += Z13
 else
-$(info OpenBLAS: Not building Z13 kernels because gcc is older than 5.2 or 6.x)
+$(info OpenBLAS: Not building Z13 kernels because the compiler $(CC) does not support it)
 endif
 
-ifeq ($(GCCVERSIONGTEQ7), 1)
+# as above for z13, check for -march=arch12 and z14 support in the compiler.
+ZARCH_CC_SUPPORTS_ARCH12=$(shell $(CC) -march=arch12 $(ZARCH_TEST_COMPILE) && echo 1)
+ZARCH_CC_SUPPORTS_Z14=$(shell $(CC) -march=z14 $(ZARCH_TEST_COMPILE) && echo 1)
+ifeq ($(or $(ZARCH_CC_SUPPORTS_ARCH12), $(ZARCH_CC_SUPPORTS_Z14)), 1)
 DYNAMIC_CORE += Z14
 else
-$(info OpenBLAS: Not building Z14 kernels because gcc is older than 7.x)
-endif
+$(info OpenBLAS: Not building Z14 kernels because the compiler $(CC) does not support it)
 endif
 
+endif # ARCH zarch
+
 ifeq ($(ARCH), power)
 DYNAMIC_CORE = POWER6
 DYNAMIC_CORE += POWER8