The package rpms/mono.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/mono.git/commit/?id=cb2069e8baa68....
Change:
+%ifarch ppc ppc64 ppc64le s390x
Thanks.
Full change:
============
commit cb2069e8baa6814a1094b4ac700047ee42139f16
Author: Dan Hork <dan(a)danny.cz>
Date: Wed Mar 27 07:12:57 2019 -0400
fix build on s390x
diff --git a/mono-5.18.1-s390x-build.patch b/mono-5.18.1-s390x-build.patch
new file mode 100644
index 0000000..6877129
--- /dev/null
+++ b/mono-5.18.1-s390x-build.patch
@@ -0,0 +1,124 @@
+From 6d07dd66f1412b8f7eaadbcd9d660859d4227954 Mon Sep 17 00:00:00 2001
+From: Neale Ferguson <neale(a)sinenomine.net>
+Date: Sat, 11 Aug 2018 19:33:58 -0400
+Subject: [PATCH] =?UTF-8?q?Fix=20s390x=20build=20broken=20by=20incorrect?=
+ =?UTF-8?q?=20specification=20of=20the=20msgfi=20instuc=E2=80=A6=20(#10026?=
+ =?UTF-8?q?)?=
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Fix s390x build broken by incorrect specification of the msgfi instruction used in
MUL_IMM type operations. The instruction had been encoded as its 32-bit counterpart
(msfi).
+
+In addition, the s390x microcode makes the mono_strength_reduction_division unnecessary
so this can be bypassed.
+
+The change to basic.make is just to avoid error messages when basic-profile-check.exe
hasn't been built yet.
+---
+ mcs/build/profiles/basic.make | 2 +-
+ mono/arch/s390x/s390x-codegen.h | 4 ++--
+ mono/mini/local-propagation.c | 9 +++------
+ mono/mini/mini-s390x.h | 1 +
+ mono/mini/mini.c | 3 +++
+ mono/mini/mini.h | 1 +
+ 6 files changed, 11 insertions(+), 9 deletions(-)
+
+diff --git a/mcs/build/profiles/basic.make b/mcs/build/profiles/basic.make
+index eb2264efd457..7dd7770fc512 100644
+--- a/mcs/build/profiles/basic.make
++++ b/mcs/build/profiles/basic.make
+@@ -122,7 +122,7 @@ $(PROFILE_EXE): $(topdir)/build/common/basic-profile-check.cs
$(GENSOURCES_CS)
+ $(BOOTSTRAP_MCS) /noconfig /langversion:latest /r:mscorlib.dll /r:System.dll
/r:System.Core.dll /out:$(GENSOURCES_EXE).tmp $(GENSOURCES_CS)
+ - rm $(GENSOURCES_EXE)
+ mv $(GENSOURCES_EXE).tmp $(GENSOURCES_EXE)
+- - rm $@
++ - rm -f $@
+ mv $@.tmp $@
+
+ $(PROFILE_OUT): $(PROFILE_EXE)
+diff --git a/mono/arch/s390x/s390x-codegen.h b/mono/arch/s390x/s390x-codegen.h
+index 49fc120f7d49..12fdd2894eaa 100644
+--- a/mono/arch/s390x/s390x-codegen.h
++++ b/mono/arch/s390x/s390x-codegen.h
+@@ -1393,8 +1393,8 @@ typedef struct {
+ #define s390_mlr(c, r1, r2) S390_RRE(c, 0xb996, r1, r2)
+ #define s390_mr(c, r1, r2) S390_RR(c, 0x1c, r1, r2)
+ #define s390_ms(c, r, x, b, d) S390_RX(c, 0x71, r, x, b, d)
+-#define s390_msfi(c, r, v) S390_RIL_1(c, 0xc20, r, v)
+-#define s390_msgfi(c, r, v) S390_RIL_1(c, 0xc21, r, v)
++#define s390_msfi(c, r, v) S390_RIL_1(c, 0xc21, r, v)
++#define s390_msgfi(c, r, v) S390_RIL_1(c, 0xc20, r, v)
+ #define s390_msgfr(c, r1, r2) S390_RRE(c, 0xb91c, r1, r2)
+ #define s390_msgr(c, r1, r2) S390_RRE(c, 0xb90c, r1, r2)
+ #define s390_msgrkc(c, r1, r2, r3) S390_RRF_1(c, 0xb9ed, r1, r2, r3)
+diff --git a/mono/mini/local-propagation.c b/mono/mini/local-propagation.c
+index 4b5e02ff28f0..d8e8461291aa 100644
+--- a/mono/mini/local-propagation.c
++++ b/mono/mini/local-propagation.c
+@@ -370,7 +370,7 @@ mono_strength_reduction_ins (MonoCompile *cfg, MonoInst *ins, const
char **spec)
+ }
+ case OP_IDIV_UN_IMM:
+ case OP_IDIV_IMM: {
+- if (!COMPILE_LLVM (cfg))
++ if ((!COMPILE_LLVM (cfg)) && (!cfg->backend->optimized_div))
+ allocated_vregs = mono_strength_reduction_division (cfg, ins);
+ break;
+ }
+@@ -383,10 +383,8 @@ mono_strength_reduction_ins (MonoCompile *cfg, MonoInst *ins, const
char **spec)
+ ins->opcode = OP_ICONST;
+ MONO_INST_NULLIFY_SREGS (ins);
+ ins->inst_c0 = 0;
+-#if __s390__
+- }
+-#else
+- } else if ((ins->inst_imm > 0) && (ins->inst_imm < (1LL <<
32)) && (power != -1)) {
++ } else if ((ins->inst_imm > 0) && (ins->inst_imm < (1LL <<
32)) &&
++ (power != -1) && (!cfg->backend->optimized_div)) {
+ gboolean is_long = ins->opcode == OP_LREM_IMM;
+ int compensator_reg = alloc_ireg (cfg);
+ int intermediate_reg;
+@@ -411,7 +409,6 @@ mono_strength_reduction_ins (MonoCompile *cfg, MonoInst *ins, const
char **spec)
+
+ allocated_vregs = TRUE;
+ }
+-#endif
+ break;
+ }
+ #if SIZEOF_REGISTER == 4
+diff --git a/mono/mini/mini-s390x.h b/mono/mini/mini-s390x.h
+index 464ddb117894..9323182c0cc7 100644
+--- a/mono/mini/mini-s390x.h
++++ b/mono/mini/mini-s390x.h
+@@ -65,6 +65,7 @@ typedef struct
+ #define MONO_ARCH_HAVE_OP_GENERIC_CLASS_INIT 1
+ #define MONO_ARCH_HAVE_SETUP_ASYNC_CALLBACK 1
+ #define MONO_ARCH_HAVE_TRACK_FPREGS 1
++#define MONO_ARCH_HAVE_OPTIMIZED_DIV 1
+
+ #define S390_STACK_ALIGNMENT 8
+ #define S390_FIRST_ARG_REG s390_r2
+diff --git a/mono/mini/mini.c b/mono/mini/mini.c
+index 9fdf34bd2a98..fa7608daebfe 100644
+--- a/mono/mini/mini.c
++++ b/mono/mini/mini.c
+@@ -3045,6 +3045,9 @@ init_backend (MonoBackend *backend)
+ #ifdef MONO_ARCH_EXPLICIT_NULL_CHECKS
+ backend->explicit_null_checks = 1;
+ #endif
++#ifdef MONO_ARCH_HAVE_OPTIMIZED_DIV
++ backend->optimized_div = 1;
++#endif
+ }
+
+ /*
+diff --git a/mono/mini/mini.h b/mono/mini/mini.h
+index 780208ed8a57..fb217b3194b7 100644
+--- a/mono/mini/mini.h
++++ b/mono/mini/mini.h
+@@ -1150,6 +1150,7 @@ typedef struct {
+ guint no_unaligned_access : 1;
+ guint disable_div_with_mul : 1;
+ guint explicit_null_checks : 1;
++ guint optimized_div : 1;
+ int monitor_enter_adjustment;
+ int dyn_call_param_area;
+ } MonoBackend;
diff --git a/mono.spec b/mono.spec
index f11cc0c..150caa3 100644
--- a/mono.spec
+++ b/mono.spec
@@ -46,6 +46,7 @@ Patch8: mono-5.18.0-use-v471.patch
Patch9: mono-5.18.0-reference-assemblies-fix.patch
Patch10: mono-5.18.0-sharpziplib-parent-path-traversal.patch
Patch11: mono-4.8.0-python-shebang.patch
+Patch12: mono-5.18.1-s390x-build.patch
BuildRequires: bison
BuildRequires: python
@@ -321,7 +322,7 @@ not install anything from outside the mono source (XSP, mono-basic,
etc.).
%setup -q -n %{name}-%{version}.%{xamarinrelease}
%patch0 -p1
-%ifarch ppc ppc64 ppc64le
+%ifarch ppc ppc64 ppc64le s390x
%patch1 -p1
%endif
%patch2 -p1
@@ -334,6 +335,7 @@ not install anything from outside the mono source (XSP, mono-basic,
etc.).
%patch9 -p1
%patch10 -p1
%patch11 -p1
+%patch12 -p1
# Remove hardcoded lib directory for libMonoPosixHelper.so from the config
sed -i 's|$mono_libdir/||g' data/config.in
@@ -353,9 +355,7 @@ cd external/binary-reference-assemblies && mv v4.7.1
v4.7.1.tobuild && ln -s /us
%build
%ifarch s390x
-# workaround a gcc bug -
https://bugzilla.redhat.com/show_bug.cgi?id=1397948
-RPM_OPT_FLAGS=$(echo $RPM_OPT_FLAGS | sed -e
's/-march=z[[:alnum:]]\+/-march=z9-109/g' -e
's/-mtune=z[[:alnum:]]\+/-mtune=z10/g')
-# so either mono C code relies on undefined behaviour or gcc is even more broken than
earlier
+# either mono C code relies on undefined behaviour or gcc is even more broken than
earlier
RPM_OPT_FLAGS=$(echo $RPM_OPT_FLAGS | sed -e 's/-O2 /-O1 /g')
%endif
export CFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing"