build: fix atomic linking with LTO on s390x

Prior to this change, Fedora and RHEL 9 on s390x would incorrectly pass
the HAVE_CXX11_ATOMIC check. As a consequence, the rest of Ceph would
fail to link because of missing atomic methods "__atomic_load_16",
"__atomic_store_16", "__atomic_compare_exchange_16".

Mark this method so that it is not optimized out, even with LTO. With
this change, s390x properly fails HAVE_CXX11_ATOMIC and falls back to
HAVE_LIBATOMIC.

Move the "BuildRequires: libatomic" RPM line out from the seastar+fedora
conditional and into the main fedora+rhel conditional so that the
HAVE_LIBATOMIC check will pass.

Fixes: https://tracker.ceph.com/issues/54514
Fixes: https://tracker.ceph.com/issues/56492

Co-authored-by: Kaleb S. Keithley <kkeithle@redhat.com>
Signed-off-by: Ken Dreyer <kdreyer@redhat.com>
This commit is contained in:
Ken Dreyer 2022-07-18 15:06:06 -04:00
parent 54a268c183
commit fbb1ccc963
2 changed files with 2 additions and 1 deletions

View File

@ -324,7 +324,6 @@ BuildRequires: systemtap-sdt-devel
%if 0%{?fedora}
BuildRequires: libubsan
BuildRequires: libasan
BuildRequires: libatomic
%endif
%if 0%{?rhel}
BuildRequires: gcc-toolset-11-annobin-plugin-gcc
@ -366,6 +365,7 @@ Requires: systemd
BuildRequires: boost-random
BuildRequires: nss-devel
BuildRequires: keyutils-libs-devel
BuildRequires: libatomic
BuildRequires: libibverbs-devel
BuildRequires: librdmacm-devel
BuildRequires: ninja-build

View File

@ -27,6 +27,7 @@ struct tagged_ptr {
std::size_t tag;
};
void atomic16(std::atomic<tagged_ptr> *ptr) __attribute__ ((used));
void atomic16(std::atomic<tagged_ptr> *ptr)
{
tagged_ptr p{nullptr, 1};