From 5f84a3003f2797064218f7dcfec1698324cf0b76 Mon Sep 17 00:00:00 2001 From: MSVSphere Packaging Team Date: Wed, 1 May 2024 03:41:20 +0300 Subject: [PATCH] import gcc-toolset-12-gcc-12.2.1-7.6.el9_4 --- SOURCES/gcc12-pr113960.patch | 107 +++++++++++++++++++++++++++++++++++ SPECS/gcc.spec | 15 +++-- 2 files changed, 118 insertions(+), 4 deletions(-) create mode 100644 SOURCES/gcc12-pr113960.patch diff --git a/SOURCES/gcc12-pr113960.patch b/SOURCES/gcc12-pr113960.patch new file mode 100644 index 0000000..98d2f86 --- /dev/null +++ b/SOURCES/gcc12-pr113960.patch @@ -0,0 +1,107 @@ +commit 6f5dcea85a31845ec6f4b6886734b0f02e013718 +Author: Jonathan Wakely +Date: Tue Feb 27 17:50:34 2024 +0000 + + libstdc++: Fix conditions for using memcmp in std::lexicographical_compare_three_way [PR113960] + + The change in r11-2981-g2f983fa69005b6 meant that + std::lexicographical_compare_three_way started to use memcmp for + unsigned integers on big endian targets, but for that to be valid we + need the two value types to have the same size and we need to use that + size to compute the length passed to memcmp. + + I already defined a __is_memcmp_ordered_with trait that does the right + checks, std::lexicographical_compare_three_way just needs to use it. + + libstdc++-v3/ChangeLog: + + PR libstdc++/113960 + * include/bits/stl_algobase.h (__is_byte_iter): Replace with ... + (__memcmp_ordered_with): New concept. + (lexicographical_compare_three_way): Use __memcmp_ordered_with + instead of __is_byte_iter. Use correct length for memcmp. + * testsuite/25_algorithms/lexicographical_compare_three_way/113960.cc: + New test. + + (cherry picked from commit f5cdda8acb06c20335855ed353ab9a441c12128a) + +diff --git a/libstdc++-v3/include/bits/stl_algobase.h b/libstdc++-v3/include/bits/stl_algobase.h +index 7664301a208..6e648e48ad0 100644 +--- a/libstdc++-v3/include/bits/stl_algobase.h ++++ b/libstdc++-v3/include/bits/stl_algobase.h +@@ -1780,11 +1780,14 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO + } + + #if __cpp_lib_three_way_comparison +- // Iter points to a contiguous range of unsigned narrow character type +- // or std::byte, suitable for comparison by memcmp. +- template +- concept __is_byte_iter = contiguous_iterator<_Iter> +- && __is_memcmp_ordered>::__value; ++ // Both iterators refer to contiguous ranges of unsigned narrow characters, ++ // or std::byte, or big-endian unsigned integers, suitable for comparison ++ // using memcmp. ++ template ++ concept __memcmp_ordered_with ++ = (__is_memcmp_ordered_with, ++ iter_value_t<_Iter2>>::__value) ++ && contiguous_iterator<_Iter1> && contiguous_iterator<_Iter2>; + + // Return a struct with two members, initialized to the smaller of x and y + // (or x if they compare equal) and the result of the comparison x <=> y. +@@ -1834,20 +1837,20 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO + if (!std::__is_constant_evaluated()) + if constexpr (same_as<_Comp, __detail::_Synth3way> + || same_as<_Comp, compare_three_way>) +- if constexpr (__is_byte_iter<_InputIter1>) +- if constexpr (__is_byte_iter<_InputIter2>) +- { +- const auto [__len, __lencmp] = _GLIBCXX_STD_A:: +- __min_cmp(__last1 - __first1, __last2 - __first2); +- if (__len) +- { +- const auto __c +- = __builtin_memcmp(&*__first1, &*__first2, __len) <=> 0; +- if (__c != 0) +- return __c; +- } +- return __lencmp; +- } ++ if constexpr (__memcmp_ordered_with<_InputIter1, _InputIter2>) ++ { ++ const auto [__len, __lencmp] = _GLIBCXX_STD_A:: ++ __min_cmp(__last1 - __first1, __last2 - __first2); ++ if (__len) ++ { ++ const auto __blen = __len * sizeof(*__first1); ++ const auto __c ++ = __builtin_memcmp(&*__first1, &*__first2, __blen) <=> 0; ++ if (__c != 0) ++ return __c; ++ } ++ return __lencmp; ++ } + + while (__first1 != __last1) + { +diff --git a/libstdc++-v3/testsuite/25_algorithms/lexicographical_compare_three_way/113960.cc b/libstdc++-v3/testsuite/25_algorithms/lexicographical_compare_three_way/113960.cc +new file mode 100644 +index 00000000000..d51ae1a3d50 +--- /dev/null ++++ b/libstdc++-v3/testsuite/25_algorithms/lexicographical_compare_three_way/113960.cc +@@ -0,0 +1,15 @@ ++// { dg-do run { target c++20 } } ++ ++// PR libstdc++/113960 ++// std::map with std::vector as input overwrites itself with c++20, on s390x ++ ++#include ++#include ++ ++int main() ++{ ++ unsigned short a1[] { 1, 2, 3 }; ++ unsigned short a2[] { 1, 2, 4 }; ++ // Incorrect memcmp comparison for big endian targets. ++ VERIFY( std::lexicographical_compare_three_way(a1, a1+3, a2, a2+3) < 0 ); ++} diff --git a/SPECS/gcc.spec b/SPECS/gcc.spec index a68524d..d9942ba 100644 --- a/SPECS/gcc.spec +++ b/SPECS/gcc.spec @@ -147,7 +147,7 @@ Summary: GCC version 12 Name: %{?scl_prefix}gcc Version: %{gcc_version} -Release: %{gcc_release}.4%{?dist} +Release: %{gcc_release}.6%{?dist} # libgcc, libgfortran, libgomp, libstdc++ and crtstuff have # GCC Runtime Exception. License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ with exceptions and LGPLv2+ and BSD @@ -193,10 +193,8 @@ URL: http://gcc.gnu.org # Need binutils which support -plugin # Need binutils which support .loc view >= 2.30 # Need binutils which support --generate-missing-build-notes=yes >= 2.31 -%if 0%{?scl:1} BuildRequires: %{?scl_prefix}binutils >= 2.31 BuildRequires: %{?scl_prefix}gdb >= 7.4.50 -%endif # While gcc doesn't include statically linked binaries, during testing # -static is used several times. BuildRequires: glibc-static @@ -351,6 +349,7 @@ Patch11: gcc12-d-shared-libphobos.patch Patch12: gcc12-pr107468.patch Patch15: gcc12-static-libquadmath.patch Patch16: gcc12-FMA-chains.patch +Patch17: gcc12-pr113960.patch Patch100: gcc12-fortran-fdec-duplicates.patch Patch101: gcc12-fortran-flogical-as-integer.patch @@ -731,6 +730,7 @@ so that there cannot be any synchronization problems. %patch12 -p0 -b .pr107468~ %patch15 -p0 -b .static-libquadmath~ %patch16 -p1 -b .fma~ +%patch17 -p1 -b .pr113960~ %if 0%{?rhel} >= 6 %patch100 -p1 -b .fortran-fdec-duplicates~ @@ -2990,7 +2990,14 @@ fi %endif %changelog -* Wed Mar 15 2023 MSVSphere Packaging Team - 12.1.1-3.2 +* Wed Apr 3 2024 Marek Polacek 12.2.1-7.6 +- bump NVR (RHEL-30832) + +* Thu Mar 28 2024 Marek Polacek 12.2.1-7.5 +- fix conditions for using memcmp in + std::lexicographical_compare_three_way (PR libstdc++/113960, RHEL-30832) + +* Wed Mar 15 2023 MSVSphere Packaging Team - 12.2.1-7.4 - Rebuilt for MSVSphere 9.1. * Fri Feb 10 2023 Marek Polacek 12.2.1-7.4