From b3c3aac3ea44a5175582fe7f1c8b569e9a58d3e1 Mon Sep 17 00:00:00 2001
From: CentOS Sources
Date: Tue, 9 May 2023 05:17:10 +0000
Subject: [PATCH] import compat-sap-c++-12-12.1.1-1.el9
---
.compat-sap-c++-12.metadata | 1 +
.gitignore | 1 +
...erve-n-semantics-are-not-available-i.patch | 85 +++
...-char-N-eofbit-fixes-are-not-availab.patch | 46 ++
...r-PR-libstdc-79820-and-PR-libstdc-81.patch | 53 ++
..._facet-codecvt_c16-when-run-against-.patch | 118 +++
...estsuite-build-plugins-with-std-c-11.patch | 42 +
...cale-cons-unicode.cc-when-run-under-.patch | 36 +
...eption-handling-in-basic_filebuf-clo.patch | 30 +
...use-it-to-fix-22_locale-messages-136.patch | 117 +++
SOURCES/0012-dts.exp-use-usr-bin-gcc.patch | 28 +
...IB_SO_VERSION__-to-__LIBSTDCXX_SO_VE.patch | 86 +++
...ests-for-PR-libstdc-98466-on-__LIBST.patch | 84 ++
...est-for-PR-libstdc-87135-on-__LIBSTD.patch | 41 +
...est-for-hashtable-bucket-sizes-on-__.patch | 102 +++
...est-for-PR-libstdc-71181-on-__LIBSTD.patch | 33 +
SOURCES/gcc12-Wno-format-security.patch | 58 ++
SOURCES/gcc12-d-shared-libphobos.patch | 20 +
SOURCES/gcc12-dg-ice-fixes.patch | 60 ++
SOURCES/gcc12-hack.patch | 126 +++
SOURCES/gcc12-isl-dl.patch | 716 ++++++++++++++++++
SOURCES/gcc12-isl-dl2.patch | 71 ++
SOURCES/gcc12-libgomp-omp_h-multilib.patch | 17 +
SOURCES/gcc12-libstdc++-docs.patch | 24 +
SOURCES/gcc12-libtool-no-rpath.patch | 27 +
SOURCES/gcc12-no-add-needed.patch | 37 +
SOURCES/gcc12-rh1574936.patch | 30 +
SOURCES/gcc12-sparc-config-detection.patch | 40 +
SPECS/compat-sap-c++-12.spec | 566 ++++++++++++++
29 files changed, 2695 insertions(+)
create mode 100644 .compat-sap-c++-12.metadata
create mode 100644 .gitignore
create mode 100644 SOURCES/0001-basic_string-reserve-n-semantics-are-not-available-i.patch
create mode 100644 SOURCES/0004-operator-istream-char-N-eofbit-fixes-are-not-availab.patch
create mode 100644 SOURCES/0005-Disable-tests-for-PR-libstdc-79820-and-PR-libstdc-81.patch
create mode 100644 SOURCES/0006-Don-t-assume-has_facet-codecvt_c16-when-run-against-.patch
create mode 100644 SOURCES/0008-testsuite-build-plugins-with-std-c-11.patch
create mode 100644 SOURCES/0009-Fix-22_locale-locale-cons-unicode.cc-when-run-under-.patch
create mode 100644 SOURCES/0010-Don-t-verify-exception-handling-in-basic_filebuf-clo.patch
create mode 100644 SOURCES/0011-Add-dts.exp-and-use-it-to-fix-22_locale-messages-136.patch
create mode 100644 SOURCES/0012-dts.exp-use-usr-bin-gcc.patch
create mode 100644 SOURCES/0013-Rename-__CXXSTDLIB_SO_VERSION__-to-__LIBSTDCXX_SO_VE.patch
create mode 100644 SOURCES/0014-Conditionalize-tests-for-PR-libstdc-98466-on-__LIBST.patch
create mode 100644 SOURCES/0015-Conditionalize-test-for-PR-libstdc-87135-on-__LIBSTD.patch
create mode 100644 SOURCES/0016-Conditionalize-test-for-hashtable-bucket-sizes-on-__.patch
create mode 100644 SOURCES/0017-Conditionalize-test-for-PR-libstdc-71181-on-__LIBSTD.patch
create mode 100644 SOURCES/gcc12-Wno-format-security.patch
create mode 100644 SOURCES/gcc12-d-shared-libphobos.patch
create mode 100644 SOURCES/gcc12-dg-ice-fixes.patch
create mode 100644 SOURCES/gcc12-hack.patch
create mode 100644 SOURCES/gcc12-isl-dl.patch
create mode 100644 SOURCES/gcc12-isl-dl2.patch
create mode 100644 SOURCES/gcc12-libgomp-omp_h-multilib.patch
create mode 100644 SOURCES/gcc12-libstdc++-docs.patch
create mode 100644 SOURCES/gcc12-libtool-no-rpath.patch
create mode 100644 SOURCES/gcc12-no-add-needed.patch
create mode 100644 SOURCES/gcc12-rh1574936.patch
create mode 100644 SOURCES/gcc12-sparc-config-detection.patch
create mode 100644 SPECS/compat-sap-c++-12.spec
diff --git a/.compat-sap-c++-12.metadata b/.compat-sap-c++-12.metadata
new file mode 100644
index 0000000..0cf0e5d
--- /dev/null
+++ b/.compat-sap-c++-12.metadata
@@ -0,0 +1 @@
+d4eccf745789140a14f5f9708c6ed363bc840a4a SOURCES/gcc-12.1.1-20220507.tar.xz
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..1549dbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+SOURCES/gcc-12.1.1-20220507.tar.xz
diff --git a/SOURCES/0001-basic_string-reserve-n-semantics-are-not-available-i.patch b/SOURCES/0001-basic_string-reserve-n-semantics-are-not-available-i.patch
new file mode 100644
index 0000000..7031726
--- /dev/null
+++ b/SOURCES/0001-basic_string-reserve-n-semantics-are-not-available-i.patch
@@ -0,0 +1,85 @@
+From 8a7f364afd86a4c4c2c747ae9cb4216fe992acc8 Mon Sep 17 00:00:00 2001
+From: David Malcolm
+Date: Wed, 25 Aug 2021 12:36:42 -0400
+Subject: [PATCH 01/17] basic_string::reserve(n) semantics are not available in
+ DTS
+
+Various tests were added upstream 2020-08-06 as part of:
+ "libstdc++: Implement P0966 std::string::reserve should not shrink"
+ https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=140cf935cd118f7208b7c3826a8b9d50936242f0
+
+std::string and std::wstring are instantiated in the system libstdc++.so
+via explicit instantiation definitions, so the new basic_string::reserve(n)
+semantics are not available in DTS.
+
+Update/disable the pertinent parts of the tests to reflect the behavior
+when run against the system libstdc++.so.
+---
+ .../testsuite/21_strings/basic_string/capacity/char/1.cc | 6 ------
+ .../21_strings/basic_string/capacity/char/18654.cc | 2 +-
+ .../testsuite/21_strings/basic_string/capacity/wchar_t/1.cc | 6 ------
+ .../21_strings/basic_string/capacity/wchar_t/18654.cc | 2 +-
+ 4 files changed, 2 insertions(+), 14 deletions(-)
+
+diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/capacity/char/1.cc b/libstdc++-v3/testsuite/21_strings/basic_string/capacity/char/1.cc
+index eea69771f..64187718d 100644
+--- a/libstdc++-v3/testsuite/21_strings/basic_string/capacity/char/1.cc
++++ b/libstdc++-v3/testsuite/21_strings/basic_string/capacity/char/1.cc
+@@ -41,12 +41,6 @@ void test01()
+ sz01 = str01.capacity();
+ VERIFY( sz01 < sz02 );
+
+- // P0966: reserve should not shrink
+- str01.reserve(100);
+- sz01 = str01.capacity();
+- str01.reserve(sz01 - 1);
+- VERIFY( str01.capacity() == sz01 );
+-
+ sz01 = str01.size() + 5;
+ str01.resize(sz01);
+ sz02 = str01.size();
+diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/capacity/char/18654.cc b/libstdc++-v3/testsuite/21_strings/basic_string/capacity/char/18654.cc
+index 02ce78ea6..3a7352123 100644
+--- a/libstdc++-v3/testsuite/21_strings/basic_string/capacity/char/18654.cc
++++ b/libstdc++-v3/testsuite/21_strings/basic_string/capacity/char/18654.cc
+@@ -51,7 +51,7 @@ void test01()
+ VERIFY( cap >= 3 * i );
+
+ str.reserve(2 * i);
+- VERIFY( str.capacity() == cap );
++ VERIFY( str.capacity() == 2 * i );
+
+ #if __cplusplus <= 201703L
+ str.reserve();
+diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/capacity/wchar_t/1.cc b/libstdc++-v3/testsuite/21_strings/basic_string/capacity/wchar_t/1.cc
+index f01a27e8c..70915a94d 100644
+--- a/libstdc++-v3/testsuite/21_strings/basic_string/capacity/wchar_t/1.cc
++++ b/libstdc++-v3/testsuite/21_strings/basic_string/capacity/wchar_t/1.cc
+@@ -41,12 +41,6 @@ void test01()
+ sz01 = str01.capacity();
+ VERIFY( sz01 < sz02 );
+
+- // P0966: reserve should not shrink
+- str01.reserve(100);
+- sz01 = str01.capacity();
+- str01.reserve(sz01 - 1);
+- VERIFY( str01.capacity() == sz01 );
+-
+ sz01 = str01.size() + 5;
+ str01.resize(sz01);
+ sz02 = str01.size();
+diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/capacity/wchar_t/18654.cc b/libstdc++-v3/testsuite/21_strings/basic_string/capacity/wchar_t/18654.cc
+index 267fd198b..c9711a294 100644
+--- a/libstdc++-v3/testsuite/21_strings/basic_string/capacity/wchar_t/18654.cc
++++ b/libstdc++-v3/testsuite/21_strings/basic_string/capacity/wchar_t/18654.cc
+@@ -51,7 +51,7 @@ void test01()
+ VERIFY( cap >= 3 * i );
+
+ str.reserve(2 * i);
+- VERIFY( str.capacity() == cap );
++ VERIFY( str.capacity() == 2 * i );
+
+ #if __cplusplus <= 201703L
+ str.reserve();
+--
+2.31.1
diff --git a/SOURCES/0004-operator-istream-char-N-eofbit-fixes-are-not-availab.patch b/SOURCES/0004-operator-istream-char-N-eofbit-fixes-are-not-availab.patch
new file mode 100644
index 0000000..264745b
--- /dev/null
+++ b/SOURCES/0004-operator-istream-char-N-eofbit-fixes-are-not-availab.patch
@@ -0,0 +1,46 @@
+From d7fae9f17479c44dae68483d457fc3fbb58c4b83 Mon Sep 17 00:00:00 2001
+From: David Malcolm
+Date: Wed, 25 Aug 2021 15:57:36 -0400
+Subject: [PATCH 04/17] operator>>(istream&, char(&)[N]) eofbit fixes are not
+ available in DTS
+
+The upstream commit on 2020-08--6:
+ Do not set eofbit eagerly in operator>>(istream&, char(&)[N])
+ https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=4e39f563c0cd25401f689c2093cb8c13692156ef
+altered the behaviour of std::istream symbols defined in libstdc++.so,
+but with DTS you get the old definitions from the system libstdc++.so
+
+Hence this patch tweaks the new tests to avoid failing when run against
+the system libstdc++.so
+---
+ .../21_strings/basic_string/inserters_extractors/char/13.cc | 1 -
+ .../21_strings/basic_string/inserters_extractors/wchar_t/13.cc | 1 -
+ 2 files changed, 2 deletions(-)
+
+diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/inserters_extractors/char/13.cc b/libstdc++-v3/testsuite/21_strings/basic_string/inserters_extractors/char/13.cc
+index a25d8a93d..7d85e6ead 100644
+--- a/libstdc++-v3/testsuite/21_strings/basic_string/inserters_extractors/char/13.cc
++++ b/libstdc++-v3/testsuite/21_strings/basic_string/inserters_extractors/char/13.cc
+@@ -29,7 +29,6 @@ test01()
+ std::string buf;
+ in.width(4);
+ in >> buf;
+- VERIFY( !in.eof() ); // should stop after reading 4 chars
+ VERIFY( buf == str );
+ }
+
+diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/inserters_extractors/wchar_t/13.cc b/libstdc++-v3/testsuite/21_strings/basic_string/inserters_extractors/wchar_t/13.cc
+index f15294a44..fa5fe3d4a 100644
+--- a/libstdc++-v3/testsuite/21_strings/basic_string/inserters_extractors/wchar_t/13.cc
++++ b/libstdc++-v3/testsuite/21_strings/basic_string/inserters_extractors/wchar_t/13.cc
+@@ -29,7 +29,6 @@ test01()
+ std::wstring buf;
+ in.width(4);
+ in >> buf;
+- VERIFY( !in.eof() ); // should stop after reading 4 chars
+ VERIFY( buf == str );
+ }
+
+--
+2.31.1
+
diff --git a/SOURCES/0005-Disable-tests-for-PR-libstdc-79820-and-PR-libstdc-81.patch b/SOURCES/0005-Disable-tests-for-PR-libstdc-79820-and-PR-libstdc-81.patch
new file mode 100644
index 0000000..0641e85
--- /dev/null
+++ b/SOURCES/0005-Disable-tests-for-PR-libstdc-79820-and-PR-libstdc-81.patch
@@ -0,0 +1,53 @@
+From 3ede89bd19328c26bcd881b873cf4a766ae0da3a Mon Sep 17 00:00:00 2001
+From: David Malcolm
+Date: Wed, 25 Aug 2021 17:04:02 -0400
+Subject: [PATCH 05/17] Disable tests for PR libstdc++/79820 and PR
+ libstdc++/81751 under DTS
+
+Upstream commit 2017-08-09
+ PR libstdc++/81751 don't call fflush(NULL)
+ https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=04d07b61cb80fd97e98eb39451ff6a8675a63d90
+added these test cases as part of verifying the behavior of sys_open (that
+it resets errno and doesn't call fflush on NULL).
+
+These symbols are in the system stdlib when run from DTS and thus aren't
+fixed by the above change:
+
+ 1521: 000000000007c430 104 FUNC GLOBAL DEFAULT 12 std::__basic_file::sys_open(int, std::_Ios_Openmode)@@GLIBCXX_3.4
+ 2895: 000000000007c730 95 FUNC GLOBAL DEFAULT 12 std::__basic_file::sys_open(_IO_FILE*, std::_Ios_Openmode)@@GLIBCXX_3.4
+
+This patch disables the non-fixed assertions.
+---
+ libstdc++-v3/testsuite/ext/stdio_filebuf/char/79820.cc | 2 --
+ libstdc++-v3/testsuite/ext/stdio_filebuf/char/81751.cc | 1 -
+ 2 files changed, 3 deletions(-)
+
+diff --git a/libstdc++-v3/testsuite/ext/stdio_filebuf/char/79820.cc b/libstdc++-v3/testsuite/ext/stdio_filebuf/char/79820.cc
+index 278b99169..e2a8e3b3d 100644
+--- a/libstdc++-v3/testsuite/ext/stdio_filebuf/char/79820.cc
++++ b/libstdc++-v3/testsuite/ext/stdio_filebuf/char/79820.cc
+@@ -26,9 +26,7 @@ void
+ test01()
+ {
+ FILE* f = std::fopen("79820.txt", "w");
+- errno = 127;
+ __gnu_cxx::stdio_filebuf b(f, std::ios::out, BUFSIZ);
+- VERIFY(errno == 127); // PR libstdc++/79820
+ b.close();
+ std::fclose(f);
+ }
+diff --git a/libstdc++-v3/testsuite/ext/stdio_filebuf/char/81751.cc b/libstdc++-v3/testsuite/ext/stdio_filebuf/char/81751.cc
+index 21aa06f78..6a231d7cf 100644
+--- a/libstdc++-v3/testsuite/ext/stdio_filebuf/char/81751.cc
++++ b/libstdc++-v3/testsuite/ext/stdio_filebuf/char/81751.cc
+@@ -31,7 +31,6 @@ test01()
+ FILE* in1 = std::fopen("81751.txt", "r");
+ __gnu_cxx::stdio_filebuf buf1(in1, std::ios::in, BUFSIZ);
+ int c = buf1.sgetc();
+- VERIFY( c == std::char_traits::eof() ); // PR libstdc++/81751
+
+ std::fflush(out);
+ FILE* in2 = std::fopen("81751.txt", "r");
+--
+2.31.1
+
diff --git a/SOURCES/0006-Don-t-assume-has_facet-codecvt_c16-when-run-against-.patch b/SOURCES/0006-Don-t-assume-has_facet-codecvt_c16-when-run-against-.patch
new file mode 100644
index 0000000..dcabb08
--- /dev/null
+++ b/SOURCES/0006-Don-t-assume-has_facet-codecvt_c16-when-run-against-.patch
@@ -0,0 +1,118 @@
+From 59388ee3dac5c737086ed1f83f552a44481a2213 Mon Sep 17 00:00:00 2001
+From: David Malcolm
+Date: Tue, 31 Aug 2021 16:08:57 -0400
+Subject: [PATCH 06/17] Don't assume has_facet when run against
+ system libstdc++
+
+Upstream commit 2019-02-19:
+ P0482R5 char8_t: Standard library support
+ https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=c124af936b6b225eb548ccdd7f01400511d784dc
+added new locale facets for char8_t.
+
+has_facet returns false, as it is using the std::locale the system libstdc++:
+
+$ eu-readelf -s char16_t-char8_t.exe |c++filt |grep UNDEF|grep locale
+ 3: 0000000000000000 0 FUNC GLOBAL DEFAULT UNDEF std::locale::classic()@GLIBCXX_3.4 (2)
+ 8: 0000000000000000 0 FUNC GLOBAL DEFAULT UNDEF std::locale::locale(std::locale const&)@GLIBCXX_3.4 (2)
+ 13: 0000000000000000 0 FUNC GLOBAL DEFAULT UNDEF std::locale::id::_M_id() const@GLIBCXX_3.4 (2)
+ 22: 0000000000000000 0 FUNC GLOBAL DEFAULT UNDEF std::locale::~locale()@GLIBCXX_3.4 (2)
+ 64: 0000000000000000 0 FUNC GLOBAL DEFAULT UNDEF std::locale::classic()@@GLIBCXX_3.4
+ 76: 0000000000000000 0 FUNC GLOBAL DEFAULT UNDEF std::locale::locale(std::locale const&)@@GLIBCXX_3.4
+ 89: 0000000000000000 0 FUNC GLOBAL DEFAULT UNDEF std::locale::id::_M_id() const@@GLIBCXX_3.4
+ 108: 0000000000000000 0 FUNC GLOBAL DEFAULT UNDEF std::locale::~locale()@@GLIBCXX_3.4
+
+Hence this patch tweaks tests so that they bail out if run against an older std::locale.
+---
+ libstdc++-v3/testsuite/22_locale/codecvt/char16_t-char8_t.cc | 3 ++-
+ libstdc++-v3/testsuite/22_locale/codecvt/char16_t.cc | 3 ++-
+ libstdc++-v3/testsuite/22_locale/codecvt/char32_t-char8_t.cc | 3 ++-
+ libstdc++-v3/testsuite/22_locale/codecvt/char32_t.cc | 3 ++-
+ libstdc++-v3/testsuite/22_locale/codecvt/utf8-char8_t.cc | 2 ++
+ libstdc++-v3/testsuite/22_locale/codecvt/utf8.cc | 2 ++
+ 6 files changed, 12 insertions(+), 4 deletions(-)
+
+diff --git a/libstdc++-v3/testsuite/22_locale/codecvt/char16_t-char8_t.cc b/libstdc++-v3/testsuite/22_locale/codecvt/char16_t-char8_t.cc
+index 71a23bef4..d4aa519a2 100644
+--- a/libstdc++-v3/testsuite/22_locale/codecvt/char16_t-char8_t.cc
++++ b/libstdc++-v3/testsuite/22_locale/codecvt/char16_t-char8_t.cc
+@@ -31,7 +31,8 @@ test01()
+ using namespace std;
+ typedef codecvt codecvt_c16;
+ locale loc_c = locale::classic();
+- VERIFY(has_facet(loc_c));
++ if (!has_facet(loc_c))
++ return;
+ const codecvt_c16* const cvt = &use_facet(loc_c);
+
+ VERIFY(!cvt->always_noconv());
+diff --git a/libstdc++-v3/testsuite/22_locale/codecvt/char16_t.cc b/libstdc++-v3/testsuite/22_locale/codecvt/char16_t.cc
+index 7b5ce126d..05c77b2b1 100644
+--- a/libstdc++-v3/testsuite/22_locale/codecvt/char16_t.cc
++++ b/libstdc++-v3/testsuite/22_locale/codecvt/char16_t.cc
+@@ -29,7 +29,8 @@ test01()
+ using namespace std;
+ typedef codecvt codecvt_c16;
+ locale loc_c = locale::classic();
+- VERIFY(has_facet(loc_c));
++ if (!has_facet(loc_c))
++ return;
+ const codecvt_c16* const cvt = &use_facet(loc_c);
+
+ VERIFY(!cvt->always_noconv());
+diff --git a/libstdc++-v3/testsuite/22_locale/codecvt/char32_t-char8_t.cc b/libstdc++-v3/testsuite/22_locale/codecvt/char32_t-char8_t.cc
+index f30ae22e9..281969e9b 100644
+--- a/libstdc++-v3/testsuite/22_locale/codecvt/char32_t-char8_t.cc
++++ b/libstdc++-v3/testsuite/22_locale/codecvt/char32_t-char8_t.cc
+@@ -33,7 +33,8 @@ test01()
+ using namespace std;
+ typedef codecvt codecvt_c32;
+ locale loc_c = locale::classic();
+- VERIFY(has_facet(loc_c));
++ if (!has_facet(loc_c))
++ return;
+ const codecvt_c32* const cvt = &use_facet(loc_c);
+
+ VERIFY(!cvt->always_noconv());
+diff --git a/libstdc++-v3/testsuite/22_locale/codecvt/char32_t.cc b/libstdc++-v3/testsuite/22_locale/codecvt/char32_t.cc
+index 558ba9145..82980b702 100644
+--- a/libstdc++-v3/testsuite/22_locale/codecvt/char32_t.cc
++++ b/libstdc++-v3/testsuite/22_locale/codecvt/char32_t.cc
+@@ -31,7 +31,8 @@ test01()
+ using namespace std;
+ typedef codecvt codecvt_c32;
+ locale loc_c = locale::classic();
+- VERIFY(has_facet(loc_c));
++ if (!has_facet(loc_c))
++ return;
+ const codecvt_c32* const cvt = &use_facet(loc_c);
+
+ VERIFY(!cvt->always_noconv());
+diff --git a/libstdc++-v3/testsuite/22_locale/codecvt/utf8-char8_t.cc b/libstdc++-v3/testsuite/22_locale/codecvt/utf8-char8_t.cc
+index 5eab05ba2..d6f663ce6 100644
+--- a/libstdc++-v3/testsuite/22_locale/codecvt/utf8-char8_t.cc
++++ b/libstdc++-v3/testsuite/22_locale/codecvt/utf8-char8_t.cc
+@@ -34,6 +34,8 @@ void test(const C* from)
+ std::mbstate_t state{};
+ char8_t buf[16] = { };
+ using test_type = std::codecvt;
++ if (!std::has_facet(std::locale::classic()))
++ return;
+ const test_type& cvt = std::use_facet(std::locale::classic());
+ auto from_end = from + len;
+ auto from_next = from;
+diff --git a/libstdc++-v3/testsuite/22_locale/codecvt/utf8.cc b/libstdc++-v3/testsuite/22_locale/codecvt/utf8.cc
+index b1b3cff31..167bc0ca3 100644
+--- a/libstdc++-v3/testsuite/22_locale/codecvt/utf8.cc
++++ b/libstdc++-v3/testsuite/22_locale/codecvt/utf8.cc
+@@ -32,6 +32,8 @@ void test(const C* from)
+ std::mbstate_t state{};
+ char buf[16] = { };
+ using test_type = std::codecvt;
++ if (!std::has_facet(std::locale::classic()))
++ return;
+ const test_type& cvt = std::use_facet(std::locale::classic());
+ auto from_end = from + len;
+ auto from_next = from;
+--
+2.31.1
+
diff --git a/SOURCES/0008-testsuite-build-plugins-with-std-c-11.patch b/SOURCES/0008-testsuite-build-plugins-with-std-c-11.patch
new file mode 100644
index 0000000..f97bad3
--- /dev/null
+++ b/SOURCES/0008-testsuite-build-plugins-with-std-c-11.patch
@@ -0,0 +1,42 @@
+From 16694079a3f415f5e5683b0afe6978810ac259b1 Mon Sep 17 00:00:00 2001
+From: David Malcolm
+Date: Tue, 31 Aug 2021 17:01:05 -0400
+Subject: [PATCH 08/17] testsuite: build plugins with -std=c++11
+
+Various testsuite plugins fail when built within DTS with e.g.:
+ cc1: error: cannot load plugin ./diagnostic_plugin_test_paths.so: /builddir/build/BUILD/gcc-11.1.1-20210623/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/src/.libs/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by ./diagnostic_plugin_test_paths.so)
+
+These turn out to C++14's sized deletion
+(see https://en.cppreference.com/w/cpp/memory/new/operator_delete):
+
+ 14: 0000000000000000 0 FUNC GLOBAL DEFAULT UNDEF _ZdlPvm@CXXABI_1.3.9 (4)
+ 48: 0000000000000000 0 FUNC GLOBAL DEFAULT UNDEF _ZdlPvm@CXXABI_1.3.9
+ 14: 0000000000000000 0 FUNC GLOBAL DEFAULT UNDEF operator delete(void*, unsigned long)@CXXABI_1.3.9 (4)
+ 48: 0000000000000000 0 FUNC GLOBAL DEFAULT UNDEF operator delete(void*, unsigned long)@CXXABI_1.3.9
+
+Looks like plugin.exp is building the test plugins against the
+freshly-built libstdc++, and then trying to dynamically load them
+against the system libstdc++.
+
+This patch forces the use of -std=c++11 when building these test plugins,
+to sidestep the problem.
+---
+ gcc/testsuite/lib/plugin-support.exp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/gcc/testsuite/lib/plugin-support.exp b/gcc/testsuite/lib/plugin-support.exp
+index 6d651901e..9943dbb37 100644
+--- a/gcc/testsuite/lib/plugin-support.exp
++++ b/gcc/testsuite/lib/plugin-support.exp
+@@ -103,7 +103,7 @@ proc plugin-test-execute { plugin_src plugin_tests } {
+ }
+ set optstr [concat $optstr "-DIN_GCC -fPIC -shared -fno-rtti -undefined dynamic_lookup"]
+ } else {
+- set plug_cflags $PLUGINCFLAGS
++ set plug_cflags "$PLUGINCFLAGS -std=c++11"
+ set optstr "$includes $extra_flags -DIN_GCC -fPIC -shared -fno-rtti"
+ }
+
+--
+2.31.1
+
diff --git a/SOURCES/0009-Fix-22_locale-locale-cons-unicode.cc-when-run-under-.patch b/SOURCES/0009-Fix-22_locale-locale-cons-unicode.cc-when-run-under-.patch
new file mode 100644
index 0000000..a540702
--- /dev/null
+++ b/SOURCES/0009-Fix-22_locale-locale-cons-unicode.cc-when-run-under-.patch
@@ -0,0 +1,36 @@
+From 87e2a4f28b444f376ebe15f38e2743eb952ff355 Mon Sep 17 00:00:00 2001
+From: David Malcolm
+Date: Wed, 1 Sep 2021 11:02:53 -0400
+Subject: [PATCH 09/17] Fix 22_locale/locale/cons/unicode.cc when run under DTS
+
+Various has_facet calls return false in DTS, as DTS is using the
+std::locale from the system libstdc++.
+
+Hence this patch tweaks tests to remove the VERIFY from the result of
+the call, so that they do not fail if run against an older
+std::locale.
+
+These VERIFY tests were added upstream 2015-01-16 in
+ https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=bb93f35da1612940266f5d159b6cc5a3e54fca14
+---
+ libstdc++-v3/testsuite/22_locale/locale/cons/unicode.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/libstdc++-v3/testsuite/22_locale/locale/cons/unicode.cc b/libstdc++-v3/testsuite/22_locale/locale/cons/unicode.cc
+index 15c621099..328145094 100644
+--- a/libstdc++-v3/testsuite/22_locale/locale/cons/unicode.cc
++++ b/libstdc++-v3/testsuite/22_locale/locale/cons/unicode.cc
+@@ -70,8 +70,8 @@ void test01()
+ VERIFY( has_facet(loc13) );
+ #endif
+ #ifdef _GLIBCXX_USE_C99_STDINT_TR1
+- VERIFY( has_facet(loc13) );
+- VERIFY( has_facet(loc13) );
++ (void)( has_facet(loc13) );
++ (void)( has_facet(loc13) );
+ #ifdef _GLIBCXX_USE_CHAR8_T
+ VERIFY( has_facet(loc13) );
+ VERIFY( has_facet(loc13) );
+--
+2.31.1
+
diff --git a/SOURCES/0010-Don-t-verify-exception-handling-in-basic_filebuf-clo.patch b/SOURCES/0010-Don-t-verify-exception-handling-in-basic_filebuf-clo.patch
new file mode 100644
index 0000000..9e16d2e
--- /dev/null
+++ b/SOURCES/0010-Don-t-verify-exception-handling-in-basic_filebuf-clo.patch
@@ -0,0 +1,30 @@
+From d1555ffdd9b4fa6f3ceaa166bbfee0b3b9973ecf Mon Sep 17 00:00:00 2001
+From: David Malcolm
+Date: Wed, 1 Sep 2021 11:24:34 -0400
+Subject: [PATCH 10/17] Don't verify exception handling in basic_filebuf::close
+ in DTS [PR81256]
+
+27_io/basic_filebuf/close/81256.cc was added upstream 2018-05-14 in
+ PR libstdc++/81256 fix exception handling in basic_filebuf::close
+ https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=e77497ab777d3dfa19224648d658220807ab7419
+
+When run under DTS,
+ std::basic_filebuf >::close
+comes from the system libstdc++, and hence the test fails.
+---
+ libstdc++-v3/testsuite/27_io/basic_filebuf/close/81256.cc | 1 -
+ 1 file changed, 1 deletion(-)
+
+--- a/libstdc++-v3/testsuite/27_io/basic_filebuf/close/wchar_t/81256.cc
++++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/close/wchar_t/81256.cc
+@@ -80,7 +80,6 @@ test01()
+ caught = true;
+ }
+ VERIFY( conv.exceptions_thrown == 1 );
+- VERIFY( caught );
+ }
+ VERIFY( conv.exceptions_thrown == 1 );
+ }
+--
+2.31.1
+
diff --git a/SOURCES/0011-Add-dts.exp-and-use-it-to-fix-22_locale-messages-136.patch b/SOURCES/0011-Add-dts.exp-and-use-it-to-fix-22_locale-messages-136.patch
new file mode 100644
index 0000000..7d28f1e
--- /dev/null
+++ b/SOURCES/0011-Add-dts.exp-and-use-it-to-fix-22_locale-messages-136.patch
@@ -0,0 +1,117 @@
+From b6989e3a4acda2d75612f3f3847dbea4245ff536 Mon Sep 17 00:00:00 2001
+From: David Malcolm
+Date: Wed, 1 Sep 2021 15:39:45 -0400
+Subject: [PATCH 11/17] Add dts.exp and use it to fix
+ 22_locale/messages/13631.cc
+
+This test was added upstream 2014-12-03:
+ "re PR libstdc++/13631 (Problems in messages)"
+ https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=d31008d7a0d53b431f176aad8dda5498de823122
+
+as part of a fix that is present in the system libstdc++.so in
+GCC 5 onwards.
+
+When run in DTS against such a system library, this test will fail.
+This patch introduces a dts.exp which detects the version of the
+underlying system libstdc++.so and exposes it to tests via
+-D__CXXSTDLIB_SO_VERSION__=, so that we can ifdef specific tests
+away, conditionally on the base GCC.
+---
+ .../testsuite/22_locale/messages/13631.cc | 7 +++++
+ libstdc++-v3/testsuite/lib/dts.exp | 31 +++++++++++++++++++
+ libstdc++-v3/testsuite/lib/libstdc++.exp | 6 ++++
+ 3 files changed, 44 insertions(+)
+ create mode 100644 libstdc++-v3/testsuite/lib/dts.exp
+
+diff --git a/libstdc++-v3/testsuite/22_locale/messages/13631.cc b/libstdc++-v3/testsuite/22_locale/messages/13631.cc
+index b8ae3d4f1..5b20df382 100644
+--- a/libstdc++-v3/testsuite/22_locale/messages/13631.cc
++++ b/libstdc++-v3/testsuite/22_locale/messages/13631.cc
+@@ -50,7 +50,10 @@ void test01()
+ msgs_facet.close(fake_msgs);
+ msgs_facet.close(msgs);
+
++ // Fixed upstream in GCC 5
++#if __CXXSTDLIB_SO_VERSION__ >= 501000
+ VERIFY( translation1 == translation2 );
++#endif
+ }
+
+ void test02()
+@@ -72,8 +75,12 @@ void test02()
+ std::wstring translation1 = msgs_facet.get(msgs, 0, 0, msgid);
+
+ // Without a real translation this test doesn't mean anything:
++
++ // Fixed upstream in GCC 5
++#if __CXXSTDLIB_SO_VERSION__ >= 501000
+ VERIFY( !translation1.empty() );
+ VERIFY( translation1 != msgid );
++#endif
+
+ // Opening another catalog was enough to show the problem, even a fake
+ // catalog.
+diff --git a/libstdc++-v3/testsuite/lib/dts.exp b/libstdc++-v3/testsuite/lib/dts.exp
+new file mode 100644
+index 000000000..76ece66d3
+--- /dev/null
++++ b/libstdc++-v3/testsuite/lib/dts.exp
+@@ -0,0 +1,31 @@
++# For DTS testing, generate a number expressing the
++# system version of libstdc++.so
++#
++# Generate a version number equivalent to
++# #define GCC_VERSION (__GNUC__ * 10000 \
++# + __GNUC_MINOR__ * 100 \
++# + __GNUC_PATCHLEVEL__)
++#
++# For example, given an underlying version of gcc 4.8.5
++# this function will return 408050.
++
++proc get_dts_base_version { } {
++
++ # Invoke gcc in the PATH to get at the underlying GCC version
++ # in dotted form (e.g. "4.8.5").
++ set dotted_version [exec gcc -dumpversion]
++ verbose "dotted_version: '$dotted_version'" 2
++
++ # Extract major, minor, patchlevel
++ regexp {([0-9]+)\.([0-9]+)\.([0-9]+)} \
++ $dotted_version \
++ _ major minor patchlevel
++ verbose "major: '$major'" 2
++ verbose "minor: '$minor'" 2
++ verbose "patchlevel: '$patchlevel'" 2
++
++ set base_gcc_version [expr (($major * 10000) + ($minor * 100) + $patchlevel)]
++ verbose "base_gcc_version: '$base_gcc_version'" 2
++
++ return $base_gcc_version
++}
+diff --git a/libstdc++-v3/testsuite/lib/libstdc++.exp b/libstdc++-v3/testsuite/lib/libstdc++.exp
+index 7f9580db8..5e4b32f76 100644
+--- a/libstdc++-v3/testsuite/lib/libstdc++.exp
++++ b/libstdc++-v3/testsuite/lib/libstdc++.exp
+@@ -58,6 +58,7 @@ load_gcc_lib timeout.exp
+ load_gcc_lib timeout-dg.exp
+ load_gcc_lib wrapper.exp
+ load_gcc_lib target-utils.exp
++load_lib dts.exp
+
+ # Useful for debugging. Pass the name of a variable and the verbosity
+ # threshold (number of -v's on the command line).
+@@ -323,6 +324,11 @@ proc libstdc++_init { testfile } {
+ set ccflags "$cxxflags -DLOCALEDIR=\".\""
+ set cxxflags "$cxxflags -DLOCALEDIR=\".\""
+
++ # For DTS testing, expose the system version of libstdc++.so as
++ # a preprocessor define.
++ set base_gcc_version [get_dts_base_version]
++ set cxxflags "$cxxflags -D__CXXSTDLIB_SO_VERSION__=$base_gcc_version"
++
+ # If a PCH file is available, use it. We must delay performing
+ # this check until $cxx and such have been initialized because we
+ # perform a test compilation. (Ideally, gcc --print-file-name would
+--
+2.31.1
+
diff --git a/SOURCES/0012-dts.exp-use-usr-bin-gcc.patch b/SOURCES/0012-dts.exp-use-usr-bin-gcc.patch
new file mode 100644
index 0000000..129ef2d
--- /dev/null
+++ b/SOURCES/0012-dts.exp-use-usr-bin-gcc.patch
@@ -0,0 +1,28 @@
+From c3910bb945aba02e0c06dec041da9f1f148b0df1 Mon Sep 17 00:00:00 2001
+From: David Malcolm
+Date: Thu, 2 Sep 2021 11:40:42 -0400
+Subject: [PATCH 12/17] dts.exp: use /usr/bin/gcc
+
+---
+ libstdc++-v3/testsuite/lib/dts.exp | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/libstdc++-v3/testsuite/lib/dts.exp b/libstdc++-v3/testsuite/lib/dts.exp
+index 76ece66d3..dc5cf3e95 100644
+--- a/libstdc++-v3/testsuite/lib/dts.exp
++++ b/libstdc++-v3/testsuite/lib/dts.exp
+@@ -11,9 +11,9 @@
+
+ proc get_dts_base_version { } {
+
+- # Invoke gcc in the PATH to get at the underlying GCC version
++ # Invoke /usr/bin/gcc to get at the underlying GCC version
+ # in dotted form (e.g. "4.8.5").
+- set dotted_version [exec gcc -dumpversion]
++ set dotted_version [exec /usr/bin/gcc -dumpversion]
+ verbose "dotted_version: '$dotted_version'" 2
+
+ # Extract major, minor, patchlevel
+--
+2.31.1
+
diff --git a/SOURCES/0013-Rename-__CXXSTDLIB_SO_VERSION__-to-__LIBSTDCXX_SO_VE.patch b/SOURCES/0013-Rename-__CXXSTDLIB_SO_VERSION__-to-__LIBSTDCXX_SO_VE.patch
new file mode 100644
index 0000000..52f160d
--- /dev/null
+++ b/SOURCES/0013-Rename-__CXXSTDLIB_SO_VERSION__-to-__LIBSTDCXX_SO_VE.patch
@@ -0,0 +1,86 @@
+From c922a56d4461c9e4ca2af07ecccb3626b99a35ae Mon Sep 17 00:00:00 2001
+From: David Malcolm
+Date: Thu, 2 Sep 2021 11:44:37 -0400
+Subject: [PATCH 13/17] Rename __CXXSTDLIB_SO_VERSION__ to
+ __LIBSTDCXX_SO_VERSION and only use major version
+
+---
+ .../testsuite/22_locale/messages/13631.cc | 4 ++--
+ libstdc++-v3/testsuite/lib/dts.exp | 18 +++++-------------
+ libstdc++-v3/testsuite/lib/libstdc++.exp | 4 ++--
+ 3 files changed, 9 insertions(+), 17 deletions(-)
+
+diff --git a/libstdc++-v3/testsuite/22_locale/messages/13631.cc b/libstdc++-v3/testsuite/22_locale/messages/13631.cc
+index 5b20df382..f4c5eb7a2 100644
+--- a/libstdc++-v3/testsuite/22_locale/messages/13631.cc
++++ b/libstdc++-v3/testsuite/22_locale/messages/13631.cc
+@@ -51,7 +51,7 @@ void test01()
+ msgs_facet.close(msgs);
+
+ // Fixed upstream in GCC 5
+-#if __CXXSTDLIB_SO_VERSION__ >= 501000
++#if __LIBSTDCXX_SO_VERSION >= 5
+ VERIFY( translation1 == translation2 );
+ #endif
+ }
+@@ -77,7 +77,7 @@ void test02()
+ // Without a real translation this test doesn't mean anything:
+
+ // Fixed upstream in GCC 5
+-#if __CXXSTDLIB_SO_VERSION__ >= 501000
++#if __LIBSTDCXX_SO_VERSION >= 5
+ VERIFY( !translation1.empty() );
+ VERIFY( translation1 != msgid );
+ #endif
+diff --git a/libstdc++-v3/testsuite/lib/dts.exp b/libstdc++-v3/testsuite/lib/dts.exp
+index dc5cf3e95..60f94bd6d 100644
+--- a/libstdc++-v3/testsuite/lib/dts.exp
++++ b/libstdc++-v3/testsuite/lib/dts.exp
+@@ -1,15 +1,10 @@
+-# For DTS testing, generate a number expressing the
+-# system version of libstdc++.so
+-#
+-# Generate a version number equivalent to
+-# #define GCC_VERSION (__GNUC__ * 10000 \
+-# + __GNUC_MINOR__ * 100 \
+-# + __GNUC_PATCHLEVEL__)
++# For DTS testing, get the major version of the
++# system libstdc++.so
+ #
+ # For example, given an underlying version of gcc 4.8.5
+-# this function will return 408050.
++# this function will return 4
+
+-proc get_dts_base_version { } {
++proc get_dts_base_major_version { } {
+
+ # Invoke /usr/bin/gcc to get at the underlying GCC version
+ # in dotted form (e.g. "4.8.5").
+@@ -24,8 +19,5 @@ proc get_dts_base_version { } {
+ verbose "minor: '$minor'" 2
+ verbose "patchlevel: '$patchlevel'" 2
+
+- set base_gcc_version [expr (($major * 10000) + ($minor * 100) + $patchlevel)]
+- verbose "base_gcc_version: '$base_gcc_version'" 2
+-
+- return $base_gcc_version
++ return $major
+ }
+diff --git a/libstdc++-v3/testsuite/lib/libstdc++.exp b/libstdc++-v3/testsuite/lib/libstdc++.exp
+index 5e4b32f76..297485b19 100644
+--- a/libstdc++-v3/testsuite/lib/libstdc++.exp
++++ b/libstdc++-v3/testsuite/lib/libstdc++.exp
+@@ -326,8 +326,8 @@ proc libstdc++_init { testfile } {
+
+ # For DTS testing, expose the system version of libstdc++.so as
+ # a preprocessor define.
+- set base_gcc_version [get_dts_base_version]
+- set cxxflags "$cxxflags -D__CXXSTDLIB_SO_VERSION__=$base_gcc_version"
++ set base_gcc_version [get_dts_base_major_version]
++ set cxxflags "$cxxflags -D__LIBSTDCXX_SO_VERSION=$base_gcc_version"
+
+ # If a PCH file is available, use it. We must delay performing
+ # this check until $cxx and such have been initialized because we
+--
+2.31.1
+
diff --git a/SOURCES/0014-Conditionalize-tests-for-PR-libstdc-98466-on-__LIBST.patch b/SOURCES/0014-Conditionalize-tests-for-PR-libstdc-98466-on-__LIBST.patch
new file mode 100644
index 0000000..0da5b14
--- /dev/null
+++ b/SOURCES/0014-Conditionalize-tests-for-PR-libstdc-98466-on-__LIBST.patch
@@ -0,0 +1,84 @@
+From fa770c25013df537c41d0929c4202b0a774a6a75 Mon Sep 17 00:00:00 2001
+From: David Malcolm
+Date: Thu, 2 Sep 2021 15:27:59 -0400
+Subject: [PATCH 14/17] Conditionalize tests for PR libstdc++/98466 on
+ __LIBSTDCXX_SO_VERSION >= 11
+
+The tests:
+ 23_containers/deque/debug/98466.cc
+ 23_containers/unordered_map/debug/98466.cc
+were added upstream 2021-01-01 as part of:
+ libstdc++: Implement N3644 for _GLIBCXX_DEBUG iterators
+ https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=05a30af3f237984b4dcf1dbbc17fdac583c46506
+but fail when run in DTS against a system libstdc++.so
+from an older GCC.
+
+In particular, they use the older implementation of _M_can_compare from
+the dynamic library:
+
+$ eu-readelf -s 98466.exe | grep can_compare | c++filt
+ 11: 0000000000000000 0 FUNC GLOBAL DEFAULT UNDEF __gnu_debug::_Safe_iterator_base::_M_can_compare(__gnu_debug::_Safe_iterator_base const&) const@GLIBCXX_3.4 (4)
+ 157: 0000000000000000 0 FUNC GLOBAL DEFAULT UNDEF __gnu_debug::_Safe_iterator_base::_M_can_compare(__gnu_debug::_Safe_iterator_base const&) const@@GLIBCXX_3.4
+---
+ .../testsuite/23_containers/deque/debug/98466.cc | 6 ++++++
+ .../23_containers/unordered_map/debug/98466.cc | 12 ++++++++++++
+ 2 files changed, 18 insertions(+)
+
+diff --git a/libstdc++-v3/testsuite/23_containers/deque/debug/98466.cc b/libstdc++-v3/testsuite/23_containers/deque/debug/98466.cc
+index c2d793374..e92d719bf 100644
+--- a/libstdc++-v3/testsuite/23_containers/deque/debug/98466.cc
++++ b/libstdc++-v3/testsuite/23_containers/deque/debug/98466.cc
+@@ -26,11 +26,17 @@ void test01()
+ {
+ typedef typename __gnu_debug::deque::iterator It;
+ It it = It();
++ // Fixed upstream in GCC 11
++#if __LIBSTDCXX_SO_VERSION >= 11
+ VERIFY( it == it );
++#endif
+
+ typedef typename __gnu_debug::deque::const_iterator Cit;
+ Cit cit = Cit();
++ // Fixed upstream in GCC 11
++#if __LIBSTDCXX_SO_VERSION >= 11
+ VERIFY( cit == cit );
++#endif
+ }
+
+ int main()
+diff --git a/libstdc++-v3/testsuite/23_containers/unordered_map/debug/98466.cc b/libstdc++-v3/testsuite/23_containers/unordered_map/debug/98466.cc
+index cc22b9ff8..3a1b6cd32 100644
+--- a/libstdc++-v3/testsuite/23_containers/unordered_map/debug/98466.cc
++++ b/libstdc++-v3/testsuite/23_containers/unordered_map/debug/98466.cc
+@@ -25,16 +25,28 @@
+ void test01()
+ {
+ __gnu_debug::unordered_map::iterator it{};
++ // Fixed upstream in GCC 11
++#if __LIBSTDCXX_SO_VERSION >= 11
+ VERIFY( it == it );
++#endif
+
+ __gnu_debug::unordered_map::const_iterator cit{};
++ // Fixed upstream in GCC 11
++#if __LIBSTDCXX_SO_VERSION >= 11
+ VERIFY( cit == cit );
++#endif
+
+ __gnu_debug::unordered_map::local_iterator lit{};
++ // Fixed upstream in GCC 11
++#if __LIBSTDCXX_SO_VERSION >= 11
+ VERIFY( lit == lit );
++#endif
+
+ __gnu_debug::unordered_map::const_local_iterator clit{};
++ // Fixed upstream in GCC 11
++#if __LIBSTDCXX_SO_VERSION >= 11
+ VERIFY( clit == clit );
++#endif
+ }
+
+ int main()
+--
+2.31.1
+
diff --git a/SOURCES/0015-Conditionalize-test-for-PR-libstdc-87135-on-__LIBSTD.patch b/SOURCES/0015-Conditionalize-test-for-PR-libstdc-87135-on-__LIBSTD.patch
new file mode 100644
index 0000000..087b20e
--- /dev/null
+++ b/SOURCES/0015-Conditionalize-test-for-PR-libstdc-87135-on-__LIBSTD.patch
@@ -0,0 +1,41 @@
+From 992665eab6c48d6a4819f42509346d24b277485d Mon Sep 17 00:00:00 2001
+From: David Malcolm
+Date: Thu, 2 Sep 2021 16:17:29 -0400
+Subject: [PATCH 15/17] Conditionalize test for PR libstdc++/87135 on
+ __LIBSTDCXX_SO_VERSION >= 9
+
+This VERIFY was added upstream 2018-09-18 as part of:
+ re PR libstdc++/87135 ([C++17] unordered containers violate iterator validity requirements)
+ https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=a521e62615e439aea7502a52fd0f8a21eaa6304f
+
+but fails when run in DTS against a system libstdc++.so from an older GCC.
+
+In particular, rehash from the header is using
+ std::__detail::_Prime_rehash_policy::_M_next_bkt
+from the system .so:
+
+ 12: 0000000000000000 0 FUNC GLOBAL DEFAULT UNDEF std::__detail::_Prime_rehash_policy::_M_next_bkt(unsigned long) const@GLIBCXX_3.4.18 (5)
+ 225: 0000000000000000 0 FUNC GLOBAL DEFAULT UNDEF std::__detail::_Prime_rehash_policy::_M_next_bkt(unsigned long) const@@GLIBCXX_3.4.18
+---
+ .../23_containers/unordered_map/modifiers/reserve.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/libstdc++-v3/testsuite/23_containers/unordered_map/modifiers/reserve.cc b/libstdc++-v3/testsuite/23_containers/unordered_map/modifiers/reserve.cc
+index 58c8924b9..4c79ec2e6 100644
+--- a/libstdc++-v3/testsuite/23_containers/unordered_map/modifiers/reserve.cc
++++ b/libstdc++-v3/testsuite/23_containers/unordered_map/modifiers/reserve.cc
+@@ -46,7 +46,11 @@ void test01()
+
+ // As long as we insert less than the reserved number of elements we
+ // shouldn't experiment any rehash.
++
++ // Fixed upstream in GCC 9
++#if __LIBSTDCXX_SO_VERSION >= 9
+ VERIFY( m.bucket_count() == bkts );
++#endif
+
+ VERIFY( m.load_factor() <= m.max_load_factor() );
+ }
+--
+2.31.1
+
diff --git a/SOURCES/0016-Conditionalize-test-for-hashtable-bucket-sizes-on-__.patch b/SOURCES/0016-Conditionalize-test-for-hashtable-bucket-sizes-on-__.patch
new file mode 100644
index 0000000..213a6f5
--- /dev/null
+++ b/SOURCES/0016-Conditionalize-test-for-hashtable-bucket-sizes-on-__.patch
@@ -0,0 +1,102 @@
+From db8f53df0be1daeda3159c1413549ff40696c710 Mon Sep 17 00:00:00 2001
+From: David Malcolm
+Date: Thu, 2 Sep 2021 17:02:33 -0400
+Subject: [PATCH 16/17] Conditionalize test for hashtable bucket sizes on
+ __LIBSTDCXX_SO_VERSION >= 11
+
+These tests were added upstream 2020-01-20 as part of:
+ libstdc++: Do not over-size hashtable buckets on range insertion
+ https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=6dcf042368012e2d7ce1626ee5d378bf3ad0ccfc
+
+but fail when run in DTS against a system libstdc++.so from an older GCC.
+
+In particular, _M_insert_unique_node from the header is using the older
+implementation of
+ std::__detail::_Prime_rehash_policy::_M_need_rehash
+from the dynamic library.
+
+ 23: 0000000000000000 0 FUNC GLOBAL DEFAULT UNDEF std::__detail::_Prime_rehash_policy::_M_need_rehash(unsigned long, unsigned long, unsigned long) const@GLIBCXX_3.4.18 (5)
+ 412: 0000000000000000 0 FUNC GLOBAL DEFAULT UNDEF std::__detail::_Prime_rehash_policy::_M_need_rehash(unsigned long, unsigned long, unsigned long) const@@GLIBCXX_3.4.18
+---
+ .../23_containers/unordered_set/cons/bucket_hint.cc | 10 ++++++++++
+ .../23_containers/unordered_set/modifiers/insert.cc | 9 +++++++++
+ 2 files changed, 19 insertions(+)
+
+diff --git a/libstdc++-v3/testsuite/23_containers/unordered_set/cons/bucket_hint.cc b/libstdc++-v3/testsuite/23_containers/unordered_set/cons/bucket_hint.cc
+index a3b014a3a..af231e54e 100644
+--- a/libstdc++-v3/testsuite/23_containers/unordered_set/cons/bucket_hint.cc
++++ b/libstdc++-v3/testsuite/23_containers/unordered_set/cons/bucket_hint.cc
+@@ -29,7 +29,11 @@ void test01()
+ a.reserve(2);
+
+ std::unordered_set b({ 0, 1, 0, 1, 0, 1, 0, 1 }, a.bucket_count());
++
++ // Fixed upstream in GCC 11
++#if __LIBSTDCXX_SO_VERSION >= 11
+ VERIFY( b.bucket_count() == a.bucket_count() );
++#endif
+ }
+
+ void test02()
+@@ -40,7 +44,10 @@ void test02()
+ std::vector v { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 };
+
+ std::unordered_set b(v.begin(), v.end(), a.bucket_count());
++ // Fixed upstream in GCC 11
++#if __LIBSTDCXX_SO_VERSION >= 11
+ VERIFY( b.bucket_count() == a.bucket_count() );
++#endif
+ }
+
+ void test03()
+@@ -51,7 +58,10 @@ void test03()
+ std::forward_list fl { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 };
+
+ std::unordered_set b(fl.begin(), fl.end(), a.bucket_count());
++ // Fixed upstream in GCC 11
++#if __LIBSTDCXX_SO_VERSION >= 11
+ VERIFY( b.bucket_count() == a.bucket_count() );
++#endif
+ }
+
+ int main()
+diff --git a/libstdc++-v3/testsuite/23_containers/unordered_set/modifiers/insert.cc b/libstdc++-v3/testsuite/23_containers/unordered_set/modifiers/insert.cc
+index 015c2f872..aae8298ae 100644
+--- a/libstdc++-v3/testsuite/23_containers/unordered_set/modifiers/insert.cc
++++ b/libstdc++-v3/testsuite/23_containers/unordered_set/modifiers/insert.cc
+@@ -30,7 +30,10 @@ void test01()
+
+ auto bkt_count = a.bucket_count();
+ a.insert({ 0, 1, 0, 1, 0, 1, 0, 1 });
++ // Fixed upstream in GCC 11
++#if __LIBSTDCXX_SO_VERSION >= 11
+ VERIFY( a.bucket_count() == bkt_count );
++#endif
+ }
+
+ void test02()
+@@ -42,7 +45,10 @@ void test02()
+
+ auto bkt_count = a.bucket_count();
+ a.insert(v.begin(), v.end());
++ // Fixed upstream in GCC 11
++#if __LIBSTDCXX_SO_VERSION >= 11
+ VERIFY( a.bucket_count() == bkt_count );
++#endif
+ }
+
+ void test03()
+@@ -54,7 +60,10 @@ void test03()
+
+ auto bkt_count = a.bucket_count();
+ a.insert(fl.begin(), fl.end());
++ // Fixed upstream in GCC 11
++#if __LIBSTDCXX_SO_VERSION >= 11
+ VERIFY( a.bucket_count() == bkt_count );
++#endif
+ }
+
+ int main()
+--
+2.31.1
+
diff --git a/SOURCES/0017-Conditionalize-test-for-PR-libstdc-71181-on-__LIBSTD.patch b/SOURCES/0017-Conditionalize-test-for-PR-libstdc-71181-on-__LIBSTD.patch
new file mode 100644
index 0000000..d18de1d
--- /dev/null
+++ b/SOURCES/0017-Conditionalize-test-for-PR-libstdc-71181-on-__LIBSTD.patch
@@ -0,0 +1,33 @@
+From 102adc148612b50a4e3f12a88871ddc47bfb469e Mon Sep 17 00:00:00 2001
+From: David Malcolm
+Date: Thu, 2 Sep 2021 17:17:50 -0400
+Subject: [PATCH 17/17] Conditionalize test for PR libstdc++/71181 on
+ __LIBSTDCXX_SO_VERSION >= 7
+
+This test was added upstream 2016-06-20 as part of:
+ re PR libstdc++/71181 (Reserving in unordered_map doesn't reserve enough)
+ https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=29dbb034cb3199167a9d0aaed040733c72326eed
+
+but fails when run in DTS against a system libstdc++.so from an older GCC.
+---
+ .../testsuite/23_containers/unordered_set/hash_policy/71181.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/libstdc++-v3/testsuite/23_containers/unordered_set/hash_policy/71181.cc b/libstdc++-v3/testsuite/23_containers/unordered_set/hash_policy/71181.cc
+index 324d735b8..b2dcd0137 100644
+--- a/libstdc++-v3/testsuite/23_containers/unordered_set/hash_policy/71181.cc
++++ b/libstdc++-v3/testsuite/23_containers/unordered_set/hash_policy/71181.cc
+@@ -39,7 +39,10 @@ template
+
+ us.insert(nb_insert);
+
++ // Fixed upstream in GCC 7
++#if __LIBSTDCXX_SO_VERSION >= 7
+ VERIFY( us.bucket_count() == bkts );
++#endif
+ }
+ }
+
+--
+2.31.1
+
diff --git a/SOURCES/gcc12-Wno-format-security.patch b/SOURCES/gcc12-Wno-format-security.patch
new file mode 100644
index 0000000..43e482a
--- /dev/null
+++ b/SOURCES/gcc12-Wno-format-security.patch
@@ -0,0 +1,58 @@
+2022-01-07 Jakub Jelinek
+
+ * Makefile.tpl (GOCFLAGS, GDCFLAGS): Filter out -Wformat-security.
+ * Makefile.in: Regenerated.
+
+2017-02-25 Jakub Jelinek
+
+ * configure.ac: When adding -Wno-format, also add -Wno-format-security.
+ * configure: Regenerated.
+
+--- gcc/configure.ac.jj 2017-02-13 12:20:53.000000000 +0100
++++ gcc/configure.ac 2017-02-25 12:42:32.859175403 +0100
+@@ -570,7 +570,7 @@ AC_ARG_ENABLE(build-format-warnings,
+ AS_HELP_STRING([--disable-build-format-warnings],[don't use -Wformat while building GCC]),
+ [],[enable_build_format_warnings=yes])
+ AS_IF([test $enable_build_format_warnings = no],
+- [wf_opt=-Wno-format],[wf_opt=])
++ [wf_opt="-Wno-format -Wno-format-security"],[wf_opt=])
+ ACX_PROG_CXX_WARNING_OPTS(
+ m4_quote(m4_do([-W -Wall -Wno-narrowing -Wwrite-strings ],
+ [-Wcast-qual $wf_opt])),
+--- gcc/configure.jj 2017-02-13 12:20:52.000000000 +0100
++++ gcc/configure 2017-02-25 12:42:50.041946391 +0100
+@@ -7077,7 +7077,7 @@ else
+ fi
+
+ if test $enable_build_format_warnings = no; then :
+- wf_opt=-Wno-format
++ wf_opt="-Wno-format -Wno-format-security"
+ else
+ wf_opt=
+ fi
+--- Makefile.tpl.jj 2021-12-30 15:12:42.188164847 +0100
++++ Makefile.tpl 2022-01-07 12:06:12.115550714 +0100
+@@ -447,8 +447,8 @@ LDFLAGS = @LDFLAGS@
+ LIBCFLAGS = $(CFLAGS)
+ CXXFLAGS = @CXXFLAGS@
+ LIBCXXFLAGS = $(CXXFLAGS) -fno-implicit-templates
+-GOCFLAGS = $(CFLAGS)
+-GDCFLAGS = $(CFLAGS)
++GOCFLAGS = $(filter-out -Wformat-security,$(CFLAGS))
++GDCFLAGS = $(filter-out -Wformat-security,$(CFLAGS))
+
+ # Pass additional PGO and LTO compiler options to the PGO build.
+ BUILD_CFLAGS = $(PGO_BUILD_CFLAGS) $(PGO_BUILD_LTO_CFLAGS)
+--- Makefile.in.jj 2021-12-30 15:12:42.188164847 +0100
++++ Makefile.in 2022-01-07 12:06:27.335334561 +0100
+@@ -444,8 +444,8 @@ LDFLAGS = @LDFLAGS@
+ LIBCFLAGS = $(CFLAGS)
+ CXXFLAGS = @CXXFLAGS@
+ LIBCXXFLAGS = $(CXXFLAGS) -fno-implicit-templates
+-GOCFLAGS = $(CFLAGS)
+-GDCFLAGS = $(CFLAGS)
++GOCFLAGS = $(filter-out -Wformat-security,$(CFLAGS))
++GDCFLAGS = $(filter-out -Wformat-security,$(CFLAGS))
+
+ # Pass additional PGO and LTO compiler options to the PGO build.
+ BUILD_CFLAGS = $(PGO_BUILD_CFLAGS) $(PGO_BUILD_LTO_CFLAGS)
diff --git a/SOURCES/gcc12-d-shared-libphobos.patch b/SOURCES/gcc12-d-shared-libphobos.patch
new file mode 100644
index 0000000..6384bbb
--- /dev/null
+++ b/SOURCES/gcc12-d-shared-libphobos.patch
@@ -0,0 +1,20 @@
+2019-01-17 Jakub Jelinek
+
+ * d-spec.cc (lang_specific_driver): Make -shared-libphobos
+ the default rather than -static-libphobos.
+
+--- gcc/d/d-spec.cc.jj 2019-01-01 12:37:49.502444257 +0100
++++ gcc/d/d-spec.cc 2019-01-17 17:09:45.364949246 +0100
+@@ -408,9 +408,9 @@ lang_specific_driver (cl_decoded_option
+ /* Add `-lgphobos' if we haven't already done so. */
+ if (phobos_library != PHOBOS_NOLINK)
+ {
+- /* Default to static linking. */
+- if (phobos_library != PHOBOS_DYNAMIC)
+- phobos_library = PHOBOS_STATIC;
++ /* Default to shared linking. */
++ if (phobos_library != PHOBOS_STATIC)
++ phobos_library = PHOBOS_DYNAMIC;
+
+ #ifdef HAVE_LD_STATIC_DYNAMIC
+ if (phobos_library == PHOBOS_STATIC && !static_link)
diff --git a/SOURCES/gcc12-dg-ice-fixes.patch b/SOURCES/gcc12-dg-ice-fixes.patch
new file mode 100644
index 0000000..047b876
--- /dev/null
+++ b/SOURCES/gcc12-dg-ice-fixes.patch
@@ -0,0 +1,60 @@
+diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-decompose-pr100400-1-3.c b/gcc/testsuite/c-c++-common/goacc/kernels-decompose-pr100400-1-3.c
+index 9779f1036f6..0595df4e7e6 100644
+--- a/gcc/testsuite/c-c++-common/goacc/kernels-decompose-pr100400-1-3.c
++++ b/gcc/testsuite/c-c++-common/goacc/kernels-decompose-pr100400-1-3.c
+@@ -1,6 +1,6 @@
+ /* { dg-additional-options "--param openacc-kernels=decompose" } */
+
+-/* { dg-additional-options "-fchecking" }
++/* { dg-additional-options "-fchecking -fno-report-bug" }
+ { dg-ice TODO { c++ } }
+ { dg-prune-output "during GIMPLE pass: omp_oacc_kernels_decompose" } */
+
+diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-decompose-pr100400-1-4.c b/gcc/testsuite/c-c++-common/goacc/kernels-decompose-pr100400-1-4.c
+index 2feabf3c7d6..c20f23e6d67 100644
+--- a/gcc/testsuite/c-c++-common/goacc/kernels-decompose-pr100400-1-4.c
++++ b/gcc/testsuite/c-c++-common/goacc/kernels-decompose-pr100400-1-4.c
+@@ -1,6 +1,6 @@
+ /* { dg-additional-options "--param openacc-kernels=decompose" } */
+
+-/* { dg-additional-options "-fchecking" }
++/* { dg-additional-options "-fchecking -fno-report-bug" }
+ { dg-ice TODO { c++ } }
+ { dg-prune-output "during GIMPLE pass: omp_oacc_kernels_decompose" } */
+
+diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-88982.C b/gcc/testsuite/g++.dg/cpp0x/vt-88982.C
+index 7a868233d73..45307a63483 100644
+--- a/gcc/testsuite/g++.dg/cpp0x/vt-88982.C
++++ b/gcc/testsuite/g++.dg/cpp0x/vt-88982.C
+@@ -1,6 +1,6 @@
+ // PR c++/88982
+ // { dg-do compile { target c++11 } }
+-// { dg-additional-options "-fchecking" }
++// { dg-additional-options "-fchecking -fno-report-bug" }
+ // { dg-ice "tsubst_pack_expansion" }
+
+ template struct A {
+diff --git a/gcc/testsuite/g++.dg/cpp1y/auto-fn61.C b/gcc/testsuite/g++.dg/cpp1y/auto-fn61.C
+index bed5ea0cfc0..cb235bf891a 100644
+--- a/gcc/testsuite/g++.dg/cpp1y/auto-fn61.C
++++ b/gcc/testsuite/g++.dg/cpp1y/auto-fn61.C
+@@ -1,6 +1,6 @@
+ // PR c++/88003
+ // { dg-do compile { target c++14 } }
+-// { dg-additional-options "-fchecking" }
++// { dg-additional-options "-fchecking -fno-report-bug" }
+ // { dg-ice "poplevel_class" }
+
+ auto test() {
+diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda26.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda26.C
+index 0cdb400d21c..8f17cca31dd 100644
+--- a/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda26.C
++++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda26.C
+@@ -1,6 +1,6 @@
+ // PR c++/87765
+ // { dg-do compile { target c++17 } }
+-// { dg-additional-options "-fchecking" }
++// { dg-additional-options "-fchecking -fno-report-bug" }
+ // { dg-ice "cxx_eval_constant_expression" }
+
+ template
diff --git a/SOURCES/gcc12-hack.patch b/SOURCES/gcc12-hack.patch
new file mode 100644
index 0000000..e98649e
--- /dev/null
+++ b/SOURCES/gcc12-hack.patch
@@ -0,0 +1,126 @@
+--- libada/Makefile.in.jj 2019-01-09 13:01:18.015608205 +0100
++++ libada/Makefile.in 2019-01-11 18:16:23.441726931 +0100
+@@ -71,18 +71,40 @@ version := $(shell @get_gcc_base_ver@ $(
+ libsubdir := $(libdir)/gcc/$(target_noncanonical)/$(version)$(MULTISUBDIR)
+ ADA_RTS_DIR=$(GCC_DIR)/ada/rts$(subst /,_,$(MULTISUBDIR))
+
++DEFAULTMULTIFLAGS :=
++ifeq ($(MULTISUBDIR),)
++targ:=$(subst -, ,$(target))
++arch:=$(word 1,$(targ))
++ifeq ($(words $(targ)),2)
++osys:=$(word 2,$(targ))
++else
++osys:=$(word 3,$(targ))
++endif
++ifeq ($(strip $(filter-out i%86 x86_64 powerpc% ppc% s390% sparc% linux%, $(arch) $(osys))),)
++ifeq ($(shell $(CC) $(CFLAGS) -print-multi-os-directory),../lib64)
++DEFAULTMULTIFLAGS := -m64
++else
++ifeq ($(strip $(filter-out s390%, $(arch))),)
++DEFAULTMULTIFLAGS := -m31
++else
++DEFAULTMULTIFLAGS := -m32
++endif
++endif
++endif
++endif
++
+ # exeext should not be used because it's the *host* exeext. We're building
+ # a *target* library, aren't we?!? Likewise for CC. Still, provide bogus
+ # definitions just in case something slips through the safety net provided
+ # by recursive make invocations in gcc/ada/Makefile.in
+ LIBADA_FLAGS_TO_PASS = \
+ "MAKEOVERRIDES=" \
+- "LDFLAGS=$(LDFLAGS)" \
++ "LDFLAGS=$(LDFLAGS) $(DEFAULTMULTIFLAGS)" \
+ "LN_S=$(LN_S)" \
+ "SHELL=$(SHELL)" \
+- "GNATLIBFLAGS=$(GNATLIBFLAGS) $(MULTIFLAGS)" \
+- "GNATLIBCFLAGS=$(GNATLIBCFLAGS) $(MULTIFLAGS)" \
+- "GNATLIBCFLAGS_FOR_C=$(GNATLIBCFLAGS_FOR_C) $(MULTIFLAGS)" \
++ "GNATLIBFLAGS=$(GNATLIBFLAGS) $(MULTIFLAGS) $(DEFAULTMULTIFLAGS)" \
++ "GNATLIBCFLAGS=$(GNATLIBCFLAGS) $(MULTIFLAGS) $(DEFAULTMULTIFLAGS)" \
++ "GNATLIBCFLAGS_FOR_C=$(GNATLIBCFLAGS_FOR_C) $(MULTIFLAGS) $(DEFAULTMULTIFLAGS)" \
+ "PICFLAG_FOR_TARGET=$(PICFLAG)" \
+ "THREAD_KIND=$(THREAD_KIND)" \
+ "TRACE=$(TRACE)" \
+@@ -93,7 +115,7 @@ LIBADA_FLAGS_TO_PASS = \
+ "exeext=.exeext.should.not.be.used " \
+ 'CC=the.host.compiler.should.not.be.needed' \
+ "GCC_FOR_TARGET=$(CC)" \
+- "CFLAGS=$(CFLAGS)"
++ "CFLAGS=$(CFLAGS) $(DEFAULTMULTIFLAGS)"
+
+ .PHONY: libada gnatlib gnatlib-shared gnatlib-sjlj gnatlib-zcx osconstool
+
+--- config-ml.in.jj 2019-01-09 12:50:16.646501448 +0100
++++ config-ml.in 2019-01-11 18:16:23.442726914 +0100
+@@ -511,6 +511,8 @@ multi-do:
+ ADAFLAGS="$(ADAFLAGS) $${flags}" \
+ prefix="$(prefix)" \
+ exec_prefix="$(exec_prefix)" \
++ mandir="$(mandir)" \
++ infodir="$(infodir)" \
+ GOCFLAGS="$(GOCFLAGS) $${flags}" \
+ GDCFLAGS="$(GDCFLAGS) $${flags}" \
+ CXXFLAGS="$(CXXFLAGS) $${flags}" \
+--- libcpp/macro.cc.jj 2019-01-09 13:01:21.420552123 +0100
++++ libcpp/macro.cc 2019-01-11 18:18:17.736876285 +0100
+@@ -3256,8 +3256,6 @@ static cpp_macro *
+ create_iso_definition (cpp_reader *pfile)
+ {
+ bool following_paste_op = false;
+- const char *paste_op_error_msg =
+- N_("'##' cannot appear at either end of a macro expansion");
+ unsigned int num_extra_tokens = 0;
+ unsigned nparms = 0;
+ cpp_hashnode **params = NULL;
+@@ -3382,7 +3380,9 @@ create_iso_definition (cpp_reader *pfile
+ function-like macros, but not at the end. */
+ if (following_paste_op)
+ {
+- cpp_error (pfile, CPP_DL_ERROR, paste_op_error_msg);
++ cpp_error (pfile, CPP_DL_ERROR,
++ "'##' cannot appear at either end of a macro "
++ "expansion");
+ goto out;
+ }
+ if (!vaopt_tracker.completed ())
+@@ -3397,7 +3397,9 @@ create_iso_definition (cpp_reader *pfile
+ function-like macros, but not at the beginning. */
+ if (macro->count == 1)
+ {
+- cpp_error (pfile, CPP_DL_ERROR, paste_op_error_msg);
++ cpp_error (pfile, CPP_DL_ERROR,
++ "'##' cannot appear at either end of a macro "
++ "expansion");
+ goto out;
+ }
+
+--- libcpp/expr.cc.jj 2019-01-09 13:01:22.415535734 +0100
++++ libcpp/expr.cc 2019-01-11 18:16:23.444726882 +0100
+@@ -803,16 +803,17 @@ cpp_classify_number (cpp_reader *pfile,
+ if ((result & CPP_N_WIDTH) == CPP_N_LARGE
+ && CPP_OPTION (pfile, cpp_warn_long_long))
+ {
+- const char *message = CPP_OPTION (pfile, cplusplus)
+- ? N_("use of C++11 long long integer constant")
+- : N_("use of C99 long long integer constant");
+-
+ if (CPP_OPTION (pfile, c99))
+ cpp_warning_with_line (pfile, CPP_W_LONG_LONG, virtual_location,
+- 0, message);
++ 0, CPP_OPTION (pfile, cplusplus)
++ ? N_("use of C++11 long long integer constant")
++ : N_("use of C99 long long integer constant"));
+ else
+ cpp_pedwarning_with_line (pfile, CPP_W_LONG_LONG,
+- virtual_location, 0, message);
++ virtual_location, 0,
++ CPP_OPTION (pfile, cplusplus)
++ ? N_("use of C++11 long long integer constant")
++ : N_("use of C99 long long integer constant"));
+ }
+
+ if ((result & CPP_N_SIZE_T) == CPP_N_SIZE_T
diff --git a/SOURCES/gcc12-isl-dl.patch b/SOURCES/gcc12-isl-dl.patch
new file mode 100644
index 0000000..825fb88
--- /dev/null
+++ b/SOURCES/gcc12-isl-dl.patch
@@ -0,0 +1,716 @@
+--- gcc/Makefile.in.jj 2015-06-06 10:00:25.000000000 +0200
++++ gcc/Makefile.in 2015-11-04 14:56:02.643536437 +0100
+@@ -1063,7 +1063,7 @@ BUILD_LIBDEPS= $(BUILD_LIBIBERTY)
+ # and the system's installed libraries.
+ LIBS = @LIBS@ libcommon.a $(CPPLIB) $(LIBINTL) $(LIBICONV) $(LIBBACKTRACE) \
+ $(LIBIBERTY) $(LIBDECNUMBER) $(HOST_LIBS)
+-BACKENDLIBS = $(ISLLIBS) $(GMPLIBS) $(PLUGINLIBS) $(HOST_LIBS) \
++BACKENDLIBS = $(if $(ISLLIBS),-ldl) $(GMPLIBS) $(PLUGINLIBS) $(HOST_LIBS) \
+ $(ZLIB) $(ZSTD_LIB)
+ # Any system libraries needed just for GNAT.
+ SYSLIBS = @GNAT_LIBEXC@
+@@ -2302,6 +2302,15 @@ $(out_object_file): $(out_file)
+ $(common_out_object_file): $(common_out_file)
+ $(COMPILE) $<
+ $(POSTCOMPILE)
++
++graphite%.o : \
++ ALL_CFLAGS := -O $(filter-out -fkeep-inline-functions, $(ALL_CFLAGS))
++graphite.o : \
++ ALL_CFLAGS := -O $(filter-out -fkeep-inline-functions, $(ALL_CFLAGS))
++graphite%.o : \
++ ALL_CXXFLAGS := -O $(filter-out -fkeep-inline-functions, $(ALL_CXXFLAGS))
++graphite.o : \
++ ALL_CXXFLAGS := -O $(filter-out -fkeep-inline-functions, $(ALL_CXXFLAGS))
+ #
+ # Generate header and source files from the machine description,
+ # and compile them.
+--- gcc/graphite.h.jj 2016-01-27 12:44:06.000000000 +0100
++++ gcc/graphite.h 2016-01-27 13:26:38.309876856 +0100
+@@ -24,6 +24,591 @@ along with GCC; see the file COPYING3.
+
+ #include "sese.h"
+
++#include
++#include
++
++#define DYNSYMS \
++ DYNSYM (isl_aff_add_coefficient_si); \
++ DYNSYM (isl_aff_free); \
++ DYNSYM (isl_aff_get_space); \
++ DYNSYM (isl_aff_set_coefficient_si); \
++ DYNSYM (isl_aff_set_constant_si); \
++ DYNSYM (isl_aff_zero_on_domain); \
++ DYNSYM (isl_band_free); \
++ DYNSYM (isl_band_get_children); \
++ DYNSYM (isl_band_get_partial_schedule); \
++ DYNSYM (isl_band_has_children); \
++ DYNSYM (isl_band_list_free); \
++ DYNSYM (isl_band_list_get_band); \
++ DYNSYM (isl_band_list_get_ctx); \
++ DYNSYM (isl_band_list_n_band); \
++ DYNSYM (isl_band_n_member); \
++ DYNSYM (isl_basic_map_add_constraint); \
++ DYNSYM (isl_basic_map_project_out); \
++ DYNSYM (isl_basic_map_universe); \
++ DYNSYM (isl_constraint_set_coefficient_si); \
++ DYNSYM (isl_constraint_set_constant_si); \
++ DYNSYM (isl_ctx_alloc); \
++ DYNSYM (isl_ctx_free); \
++ DYNSYM (isl_equality_alloc); \
++ DYNSYM (isl_id_alloc); \
++ DYNSYM (isl_id_copy); \
++ DYNSYM (isl_id_free); \
++ DYNSYM (isl_inequality_alloc); \
++ DYNSYM (isl_local_space_copy); \
++ DYNSYM (isl_local_space_free); \
++ DYNSYM (isl_local_space_from_space); \
++ DYNSYM (isl_local_space_range); \
++ DYNSYM (isl_map_add_constraint); \
++ DYNSYM (isl_map_add_dims); \
++ DYNSYM (isl_map_align_params); \
++ DYNSYM (isl_map_apply_range); \
++ DYNSYM (isl_map_copy); \
++ DYNSYM (isl_map_dim); \
++ DYNSYM (isl_map_dump); \
++ DYNSYM (isl_map_equate); \
++ DYNSYM (isl_map_fix_si); \
++ DYNSYM (isl_map_flat_product); \
++ DYNSYM (isl_map_flat_range_product); \
++ DYNSYM (isl_map_free); \
++ DYNSYM (isl_map_from_basic_map); \
++ DYNSYM (isl_map_from_pw_aff); \
++ DYNSYM (isl_map_from_union_map); \
++ DYNSYM (isl_map_get_ctx); \
++ DYNSYM (isl_map_get_space); \
++ DYNSYM (isl_map_get_tuple_id); \
++ DYNSYM (isl_map_insert_dims); \
++ DYNSYM (isl_map_intersect); \
++ DYNSYM (isl_map_intersect_domain); \
++ DYNSYM (isl_map_intersect_range); \
++ DYNSYM (isl_map_is_empty); \
++ DYNSYM (isl_map_lex_ge); \
++ DYNSYM (isl_map_lex_le); \
++ DYNSYM (isl_map_n_out); \
++ DYNSYM (isl_map_range); \
++ DYNSYM (isl_map_set_tuple_id); \
++ DYNSYM (isl_map_universe); \
++ DYNSYM (isl_options_set_on_error); \
++ DYNSYM (isl_options_set_schedule_serialize_sccs); \
++ DYNSYM (isl_printer_set_yaml_style); \
++ DYNSYM (isl_options_set_schedule_max_constant_term); \
++ DYNSYM (isl_options_set_schedule_maximize_band_depth); \
++ DYNSYM (isl_printer_free); \
++ DYNSYM (isl_printer_print_aff); \
++ DYNSYM (isl_printer_print_constraint); \
++ DYNSYM (isl_printer_print_map); \
++ DYNSYM (isl_printer_print_set); \
++ DYNSYM (isl_printer_to_file); \
++ DYNSYM (isl_pw_aff_add); \
++ DYNSYM (isl_pw_aff_alloc); \
++ DYNSYM (isl_pw_aff_copy); \
++ DYNSYM (isl_pw_aff_eq_set); \
++ DYNSYM (isl_pw_aff_free); \
++ DYNSYM (isl_pw_aff_from_aff); \
++ DYNSYM (isl_pw_aff_ge_set); \
++ DYNSYM (isl_pw_aff_gt_set); \
++ DYNSYM (isl_pw_aff_is_cst); \
++ DYNSYM (isl_pw_aff_le_set); \
++ DYNSYM (isl_pw_aff_lt_set); \
++ DYNSYM (isl_pw_aff_mul); \
++ DYNSYM (isl_pw_aff_ne_set); \
++ DYNSYM (isl_pw_aff_nonneg_set); \
++ DYNSYM (isl_pw_aff_set_tuple_id); \
++ DYNSYM (isl_pw_aff_sub); \
++ DYNSYM (isl_pw_aff_zero_set); \
++ DYNSYM (isl_schedule_free); \
++ DYNSYM (isl_schedule_get_band_forest); \
++ DYNSYM (isl_set_add_constraint); \
++ DYNSYM (isl_set_add_dims); \
++ DYNSYM (isl_set_apply); \
++ DYNSYM (isl_set_coalesce); \
++ DYNSYM (isl_set_copy); \
++ DYNSYM (isl_set_dim); \
++ DYNSYM (isl_set_fix_si); \
++ DYNSYM (isl_set_free); \
++ DYNSYM (isl_set_get_space); \
++ DYNSYM (isl_set_get_tuple_id); \
++ DYNSYM (isl_set_intersect); \
++ DYNSYM (isl_set_is_empty); \
++ DYNSYM (isl_set_n_dim); \
++ DYNSYM (isl_set_nat_universe); \
++ DYNSYM (isl_set_project_out); \
++ DYNSYM (isl_set_set_tuple_id); \
++ DYNSYM (isl_set_universe); \
++ DYNSYM (isl_space_add_dims); \
++ DYNSYM (isl_space_alloc); \
++ DYNSYM (isl_space_copy); \
++ DYNSYM (isl_space_dim); \
++ DYNSYM (isl_space_domain); \
++ DYNSYM (isl_space_find_dim_by_id); \
++ DYNSYM (isl_space_free); \
++ DYNSYM (isl_space_from_domain); \
++ DYNSYM (isl_space_get_tuple_id); \
++ DYNSYM (isl_space_params_alloc); \
++ DYNSYM (isl_space_range); \
++ DYNSYM (isl_space_set_alloc); \
++ DYNSYM (isl_space_set_dim_id); \
++ DYNSYM (isl_space_set_tuple_id); \
++ DYNSYM (isl_union_map_add_map); \
++ DYNSYM (isl_union_map_align_params); \
++ DYNSYM (isl_union_map_apply_domain); \
++ DYNSYM (isl_union_map_apply_range); \
++ DYNSYM (isl_union_map_compute_flow); \
++ DYNSYM (isl_union_map_copy); \
++ DYNSYM (isl_union_map_empty); \
++ DYNSYM (isl_union_map_flat_range_product); \
++ DYNSYM (isl_union_map_foreach_map); \
++ DYNSYM (isl_union_map_free); \
++ DYNSYM (isl_union_map_from_map); \
++ DYNSYM (isl_union_map_get_ctx); \
++ DYNSYM (isl_union_map_get_space); \
++ DYNSYM (isl_union_map_gist_domain); \
++ DYNSYM (isl_union_map_gist_range); \
++ DYNSYM (isl_union_map_intersect_domain); \
++ DYNSYM (isl_union_map_is_empty); \
++ DYNSYM (isl_union_map_subtract); \
++ DYNSYM (isl_union_map_union); \
++ DYNSYM (isl_union_set_add_set); \
++ DYNSYM (isl_union_set_compute_schedule); \
++ DYNSYM (isl_union_set_copy); \
++ DYNSYM (isl_union_set_empty); \
++ DYNSYM (isl_union_set_from_set); \
++ DYNSYM (isl_aff_add_constant_val); \
++ DYNSYM (isl_aff_get_coefficient_val); \
++ DYNSYM (isl_aff_get_ctx); \
++ DYNSYM (isl_aff_mod_val); \
++ DYNSYM (isl_ast_build_ast_from_schedule); \
++ DYNSYM (isl_ast_build_free); \
++ DYNSYM (isl_ast_build_from_context); \
++ DYNSYM (isl_ast_build_get_ctx); \
++ DYNSYM (isl_ast_build_get_schedule); \
++ DYNSYM (isl_ast_build_get_schedule_space); \
++ DYNSYM (isl_ast_build_set_before_each_for); \
++ DYNSYM (isl_ast_build_set_options); \
++ DYNSYM (isl_ast_expr_free); \
++ DYNSYM (isl_ast_expr_from_val); \
++ DYNSYM (isl_ast_expr_get_ctx); \
++ DYNSYM (isl_ast_expr_get_id); \
++ DYNSYM (isl_ast_expr_get_op_arg); \
++ DYNSYM (isl_ast_expr_get_op_n_arg); \
++ DYNSYM (isl_ast_expr_get_op_type); \
++ DYNSYM (isl_ast_expr_get_type); \
++ DYNSYM (isl_ast_expr_get_val); \
++ DYNSYM (isl_ast_expr_sub); \
++ DYNSYM (isl_ast_node_block_get_children); \
++ DYNSYM (isl_ast_node_for_get_body); \
++ DYNSYM (isl_ast_node_for_get_cond); \
++ DYNSYM (isl_ast_node_for_get_inc); \
++ DYNSYM (isl_ast_node_for_get_init); \
++ DYNSYM (isl_ast_node_for_get_iterator); \
++ DYNSYM (isl_ast_node_free); \
++ DYNSYM (isl_ast_node_get_annotation); \
++ DYNSYM (isl_ast_node_get_type); \
++ DYNSYM (isl_ast_node_if_get_cond); \
++ DYNSYM (isl_ast_node_if_get_else); \
++ DYNSYM (isl_ast_node_if_get_then); \
++ DYNSYM (isl_ast_node_list_free); \
++ DYNSYM (isl_ast_node_list_get_ast_node); \
++ DYNSYM (isl_ast_node_list_n_ast_node); \
++ DYNSYM (isl_ast_node_user_get_expr); \
++ DYNSYM (isl_constraint_set_coefficient_val); \
++ DYNSYM (isl_constraint_set_constant_val); \
++ DYNSYM (isl_id_get_user); \
++ DYNSYM (isl_local_space_get_ctx); \
++ DYNSYM (isl_map_fix_val); \
++ DYNSYM (isl_options_set_ast_build_atomic_upper_bound); \
++ DYNSYM (isl_printer_print_ast_node); \
++ DYNSYM (isl_printer_print_str); \
++ DYNSYM (isl_printer_set_output_format); \
++ DYNSYM (isl_pw_aff_mod_val); \
++ DYNSYM (isl_schedule_constraints_compute_schedule); \
++ DYNSYM (isl_schedule_constraints_on_domain); \
++ DYNSYM (isl_schedule_constraints_set_coincidence); \
++ DYNSYM (isl_schedule_constraints_set_proximity); \
++ DYNSYM (isl_schedule_constraints_set_validity); \
++ DYNSYM (isl_set_get_dim_id); \
++ DYNSYM (isl_set_max_val); \
++ DYNSYM (isl_set_min_val); \
++ DYNSYM (isl_set_params); \
++ DYNSYM (isl_space_align_params); \
++ DYNSYM (isl_space_map_from_domain_and_range); \
++ DYNSYM (isl_space_set_tuple_name); \
++ DYNSYM (isl_space_wrap); \
++ DYNSYM (isl_union_map_from_domain_and_range); \
++ DYNSYM (isl_union_map_range); \
++ DYNSYM (isl_union_set_union); \
++ DYNSYM (isl_union_set_universe); \
++ DYNSYM (isl_val_2exp); \
++ DYNSYM (isl_val_add_ui); \
++ DYNSYM (isl_val_copy); \
++ DYNSYM (isl_val_free); \
++ DYNSYM (isl_val_int_from_si); \
++ DYNSYM (isl_val_int_from_ui); \
++ DYNSYM (isl_val_mul); \
++ DYNSYM (isl_val_neg); \
++ DYNSYM (isl_val_sub); \
++ DYNSYM (isl_printer_print_union_map); \
++ DYNSYM (isl_pw_aff_get_ctx); \
++ DYNSYM (isl_val_is_int); \
++ DYNSYM (isl_ctx_get_max_operations); \
++ DYNSYM (isl_ctx_set_max_operations); \
++ DYNSYM (isl_ctx_last_error); \
++ DYNSYM (isl_ctx_reset_operations); \
++ DYNSYM (isl_map_coalesce); \
++ DYNSYM (isl_printer_print_schedule); \
++ DYNSYM (isl_set_set_dim_id); \
++ DYNSYM (isl_union_map_coalesce); \
++ DYNSYM (isl_multi_val_set_val); \
++ DYNSYM (isl_multi_val_zero); \
++ DYNSYM (isl_options_set_schedule_max_coefficient); \
++ DYNSYM (isl_options_set_tile_scale_tile_loops); \
++ DYNSYM (isl_schedule_copy); \
++ DYNSYM (isl_schedule_get_map); \
++ DYNSYM (isl_schedule_map_schedule_node_bottom_up); \
++ DYNSYM (isl_schedule_node_band_get_permutable); \
++ DYNSYM (isl_schedule_node_band_get_space); \
++ DYNSYM (isl_schedule_node_band_tile); \
++ DYNSYM (isl_schedule_node_child); \
++ DYNSYM (isl_schedule_node_free); \
++ DYNSYM (isl_schedule_node_get_child); \
++ DYNSYM (isl_schedule_node_get_ctx); \
++ DYNSYM (isl_schedule_node_get_type); \
++ DYNSYM (isl_schedule_node_n_children); \
++ DYNSYM (isl_union_map_is_equal); \
++ DYNSYM (isl_union_access_info_compute_flow); \
++ DYNSYM (isl_union_access_info_from_sink); \
++ DYNSYM (isl_union_access_info_set_may_source); \
++ DYNSYM (isl_union_access_info_set_must_source); \
++ DYNSYM (isl_union_access_info_set_schedule); \
++ DYNSYM (isl_union_flow_free); \
++ DYNSYM (isl_union_flow_get_may_dependence); \
++ DYNSYM (isl_union_flow_get_must_dependence); \
++ DYNSYM (isl_aff_var_on_domain); \
++ DYNSYM (isl_multi_aff_from_aff); \
++ DYNSYM (isl_schedule_get_ctx); \
++ DYNSYM (isl_multi_aff_set_tuple_id); \
++ DYNSYM (isl_multi_aff_dim); \
++ DYNSYM (isl_schedule_get_domain); \
++ DYNSYM (isl_union_set_is_empty); \
++ DYNSYM (isl_union_set_get_space); \
++ DYNSYM (isl_union_pw_multi_aff_empty); \
++ DYNSYM (isl_union_set_foreach_set); \
++ DYNSYM (isl_union_set_free); \
++ DYNSYM (isl_multi_union_pw_aff_from_union_pw_multi_aff); \
++ DYNSYM (isl_multi_union_pw_aff_apply_multi_aff); \
++ DYNSYM (isl_schedule_insert_partial_schedule); \
++ DYNSYM (isl_union_pw_multi_aff_free); \
++ DYNSYM (isl_pw_multi_aff_project_out_map); \
++ DYNSYM (isl_union_pw_multi_aff_add_pw_multi_aff); \
++ DYNSYM (isl_schedule_from_domain); \
++ DYNSYM (isl_schedule_sequence); \
++ DYNSYM (isl_ast_build_node_from_schedule); \
++ DYNSYM (isl_ast_node_mark_get_node); \
++ DYNSYM (isl_schedule_node_band_member_get_ast_loop_type); \
++ DYNSYM (isl_schedule_node_band_member_set_ast_loop_type); \
++ DYNSYM (isl_val_n_abs_num_chunks); \
++ DYNSYM (isl_val_get_abs_num_chunks); \
++ DYNSYM (isl_val_int_from_chunks); \
++ DYNSYM (isl_val_is_neg); \
++ DYNSYM (isl_version); \
++ DYNSYM (isl_options_get_on_error); \
++ DYNSYM (isl_ctx_reset_error);
++
++extern struct isl_pointers_s__
++{
++ bool inited;
++ void *h;
++#define DYNSYM(x) __typeof (x) *p_##x
++ DYNSYMS
++#undef DYNSYM
++} isl_pointers__;
++
++#define isl_aff_add_coefficient_si (*isl_pointers__.p_isl_aff_add_coefficient_si)
++#define isl_aff_free (*isl_pointers__.p_isl_aff_free)
++#define isl_aff_get_space (*isl_pointers__.p_isl_aff_get_space)
++#define isl_aff_set_coefficient_si (*isl_pointers__.p_isl_aff_set_coefficient_si)
++#define isl_aff_set_constant_si (*isl_pointers__.p_isl_aff_set_constant_si)
++#define isl_aff_zero_on_domain (*isl_pointers__.p_isl_aff_zero_on_domain)
++#define isl_band_free (*isl_pointers__.p_isl_band_free)
++#define isl_band_get_children (*isl_pointers__.p_isl_band_get_children)
++#define isl_band_get_partial_schedule (*isl_pointers__.p_isl_band_get_partial_schedule)
++#define isl_band_has_children (*isl_pointers__.p_isl_band_has_children)
++#define isl_band_list_free (*isl_pointers__.p_isl_band_list_free)
++#define isl_band_list_get_band (*isl_pointers__.p_isl_band_list_get_band)
++#define isl_band_list_get_ctx (*isl_pointers__.p_isl_band_list_get_ctx)
++#define isl_band_list_n_band (*isl_pointers__.p_isl_band_list_n_band)
++#define isl_band_n_member (*isl_pointers__.p_isl_band_n_member)
++#define isl_basic_map_add_constraint (*isl_pointers__.p_isl_basic_map_add_constraint)
++#define isl_basic_map_project_out (*isl_pointers__.p_isl_basic_map_project_out)
++#define isl_basic_map_universe (*isl_pointers__.p_isl_basic_map_universe)
++#define isl_constraint_set_coefficient_si (*isl_pointers__.p_isl_constraint_set_coefficient_si)
++#define isl_constraint_set_constant_si (*isl_pointers__.p_isl_constraint_set_constant_si)
++#define isl_ctx_alloc (*isl_pointers__.p_isl_ctx_alloc)
++#define isl_ctx_free (*isl_pointers__.p_isl_ctx_free)
++#define isl_equality_alloc (*isl_pointers__.p_isl_equality_alloc)
++#define isl_id_alloc (*isl_pointers__.p_isl_id_alloc)
++#define isl_id_copy (*isl_pointers__.p_isl_id_copy)
++#define isl_id_free (*isl_pointers__.p_isl_id_free)
++#define isl_inequality_alloc (*isl_pointers__.p_isl_inequality_alloc)
++#define isl_local_space_copy (*isl_pointers__.p_isl_local_space_copy)
++#define isl_local_space_free (*isl_pointers__.p_isl_local_space_free)
++#define isl_local_space_from_space (*isl_pointers__.p_isl_local_space_from_space)
++#define isl_local_space_range (*isl_pointers__.p_isl_local_space_range)
++#define isl_map_add_constraint (*isl_pointers__.p_isl_map_add_constraint)
++#define isl_map_add_dims (*isl_pointers__.p_isl_map_add_dims)
++#define isl_map_align_params (*isl_pointers__.p_isl_map_align_params)
++#define isl_map_apply_range (*isl_pointers__.p_isl_map_apply_range)
++#define isl_map_copy (*isl_pointers__.p_isl_map_copy)
++#define isl_map_dim (*isl_pointers__.p_isl_map_dim)
++#define isl_map_dump (*isl_pointers__.p_isl_map_dump)
++#define isl_map_equate (*isl_pointers__.p_isl_map_equate)
++#define isl_map_fix_si (*isl_pointers__.p_isl_map_fix_si)
++#define isl_map_flat_product (*isl_pointers__.p_isl_map_flat_product)
++#define isl_map_flat_range_product (*isl_pointers__.p_isl_map_flat_range_product)
++#define isl_map_free (*isl_pointers__.p_isl_map_free)
++#define isl_map_from_basic_map (*isl_pointers__.p_isl_map_from_basic_map)
++#define isl_map_from_pw_aff (*isl_pointers__.p_isl_map_from_pw_aff)
++#define isl_map_from_union_map (*isl_pointers__.p_isl_map_from_union_map)
++#define isl_map_get_ctx (*isl_pointers__.p_isl_map_get_ctx)
++#define isl_map_get_space (*isl_pointers__.p_isl_map_get_space)
++#define isl_map_get_tuple_id (*isl_pointers__.p_isl_map_get_tuple_id)
++#define isl_map_insert_dims (*isl_pointers__.p_isl_map_insert_dims)
++#define isl_map_intersect (*isl_pointers__.p_isl_map_intersect)
++#define isl_map_intersect_domain (*isl_pointers__.p_isl_map_intersect_domain)
++#define isl_map_intersect_range (*isl_pointers__.p_isl_map_intersect_range)
++#define isl_map_is_empty (*isl_pointers__.p_isl_map_is_empty)
++#define isl_map_lex_ge (*isl_pointers__.p_isl_map_lex_ge)
++#define isl_map_lex_le (*isl_pointers__.p_isl_map_lex_le)
++#define isl_map_n_out (*isl_pointers__.p_isl_map_n_out)
++#define isl_map_range (*isl_pointers__.p_isl_map_range)
++#define isl_map_set_tuple_id (*isl_pointers__.p_isl_map_set_tuple_id)
++#define isl_map_universe (*isl_pointers__.p_isl_map_universe)
++#define isl_options_set_on_error (*isl_pointers__.p_isl_options_set_on_error)
++#define isl_options_set_schedule_serialize_sccs (*isl_pointers__.p_isl_options_set_schedule_serialize_sccs)
++#define isl_printer_set_yaml_style (*isl_pointers__.p_isl_printer_set_yaml_style)
++#define isl_options_set_schedule_max_constant_term (*isl_pointers__.p_isl_options_set_schedule_max_constant_term)
++#define isl_options_set_schedule_maximize_band_depth (*isl_pointers__.p_isl_options_set_schedule_maximize_band_depth)
++#define isl_printer_free (*isl_pointers__.p_isl_printer_free)
++#define isl_printer_print_aff (*isl_pointers__.p_isl_printer_print_aff)
++#define isl_printer_print_constraint (*isl_pointers__.p_isl_printer_print_constraint)
++#define isl_printer_print_map (*isl_pointers__.p_isl_printer_print_map)
++#define isl_printer_print_set (*isl_pointers__.p_isl_printer_print_set)
++#define isl_printer_to_file (*isl_pointers__.p_isl_printer_to_file)
++#define isl_pw_aff_add (*isl_pointers__.p_isl_pw_aff_add)
++#define isl_pw_aff_alloc (*isl_pointers__.p_isl_pw_aff_alloc)
++#define isl_pw_aff_copy (*isl_pointers__.p_isl_pw_aff_copy)
++#define isl_pw_aff_eq_set (*isl_pointers__.p_isl_pw_aff_eq_set)
++#define isl_pw_aff_free (*isl_pointers__.p_isl_pw_aff_free)
++#define isl_pw_aff_from_aff (*isl_pointers__.p_isl_pw_aff_from_aff)
++#define isl_pw_aff_ge_set (*isl_pointers__.p_isl_pw_aff_ge_set)
++#define isl_pw_aff_gt_set (*isl_pointers__.p_isl_pw_aff_gt_set)
++#define isl_pw_aff_is_cst (*isl_pointers__.p_isl_pw_aff_is_cst)
++#define isl_pw_aff_le_set (*isl_pointers__.p_isl_pw_aff_le_set)
++#define isl_pw_aff_lt_set (*isl_pointers__.p_isl_pw_aff_lt_set)
++#define isl_pw_aff_mul (*isl_pointers__.p_isl_pw_aff_mul)
++#define isl_pw_aff_ne_set (*isl_pointers__.p_isl_pw_aff_ne_set)
++#define isl_pw_aff_nonneg_set (*isl_pointers__.p_isl_pw_aff_nonneg_set)
++#define isl_pw_aff_set_tuple_id (*isl_pointers__.p_isl_pw_aff_set_tuple_id)
++#define isl_pw_aff_sub (*isl_pointers__.p_isl_pw_aff_sub)
++#define isl_pw_aff_zero_set (*isl_pointers__.p_isl_pw_aff_zero_set)
++#define isl_schedule_free (*isl_pointers__.p_isl_schedule_free)
++#define isl_schedule_get_band_forest (*isl_pointers__.p_isl_schedule_get_band_forest)
++#define isl_set_add_constraint (*isl_pointers__.p_isl_set_add_constraint)
++#define isl_set_add_dims (*isl_pointers__.p_isl_set_add_dims)
++#define isl_set_apply (*isl_pointers__.p_isl_set_apply)
++#define isl_set_coalesce (*isl_pointers__.p_isl_set_coalesce)
++#define isl_set_copy (*isl_pointers__.p_isl_set_copy)
++#define isl_set_dim (*isl_pointers__.p_isl_set_dim)
++#define isl_set_fix_si (*isl_pointers__.p_isl_set_fix_si)
++#define isl_set_free (*isl_pointers__.p_isl_set_free)
++#define isl_set_get_space (*isl_pointers__.p_isl_set_get_space)
++#define isl_set_get_tuple_id (*isl_pointers__.p_isl_set_get_tuple_id)
++#define isl_set_intersect (*isl_pointers__.p_isl_set_intersect)
++#define isl_set_is_empty (*isl_pointers__.p_isl_set_is_empty)
++#define isl_set_n_dim (*isl_pointers__.p_isl_set_n_dim)
++#define isl_set_nat_universe (*isl_pointers__.p_isl_set_nat_universe)
++#define isl_set_project_out (*isl_pointers__.p_isl_set_project_out)
++#define isl_set_set_tuple_id (*isl_pointers__.p_isl_set_set_tuple_id)
++#define isl_set_universe (*isl_pointers__.p_isl_set_universe)
++#define isl_space_add_dims (*isl_pointers__.p_isl_space_add_dims)
++#define isl_space_alloc (*isl_pointers__.p_isl_space_alloc)
++#define isl_space_copy (*isl_pointers__.p_isl_space_copy)
++#define isl_space_dim (*isl_pointers__.p_isl_space_dim)
++#define isl_space_domain (*isl_pointers__.p_isl_space_domain)
++#define isl_space_find_dim_by_id (*isl_pointers__.p_isl_space_find_dim_by_id)
++#define isl_space_free (*isl_pointers__.p_isl_space_free)
++#define isl_space_from_domain (*isl_pointers__.p_isl_space_from_domain)
++#define isl_space_get_tuple_id (*isl_pointers__.p_isl_space_get_tuple_id)
++#define isl_space_params_alloc (*isl_pointers__.p_isl_space_params_alloc)
++#define isl_space_range (*isl_pointers__.p_isl_space_range)
++#define isl_space_set_alloc (*isl_pointers__.p_isl_space_set_alloc)
++#define isl_space_set_dim_id (*isl_pointers__.p_isl_space_set_dim_id)
++#define isl_space_set_tuple_id (*isl_pointers__.p_isl_space_set_tuple_id)
++#define isl_union_map_add_map (*isl_pointers__.p_isl_union_map_add_map)
++#define isl_union_map_align_params (*isl_pointers__.p_isl_union_map_align_params)
++#define isl_union_map_apply_domain (*isl_pointers__.p_isl_union_map_apply_domain)
++#define isl_union_map_apply_range (*isl_pointers__.p_isl_union_map_apply_range)
++#define isl_union_map_compute_flow (*isl_pointers__.p_isl_union_map_compute_flow)
++#define isl_union_map_copy (*isl_pointers__.p_isl_union_map_copy)
++#define isl_union_map_empty (*isl_pointers__.p_isl_union_map_empty)
++#define isl_union_map_flat_range_product (*isl_pointers__.p_isl_union_map_flat_range_product)
++#define isl_union_map_foreach_map (*isl_pointers__.p_isl_union_map_foreach_map)
++#define isl_union_map_free (*isl_pointers__.p_isl_union_map_free)
++#define isl_union_map_from_map (*isl_pointers__.p_isl_union_map_from_map)
++#define isl_union_map_get_ctx (*isl_pointers__.p_isl_union_map_get_ctx)
++#define isl_union_map_get_space (*isl_pointers__.p_isl_union_map_get_space)
++#define isl_union_map_gist_domain (*isl_pointers__.p_isl_union_map_gist_domain)
++#define isl_union_map_gist_range (*isl_pointers__.p_isl_union_map_gist_range)
++#define isl_union_map_intersect_domain (*isl_pointers__.p_isl_union_map_intersect_domain)
++#define isl_union_map_is_empty (*isl_pointers__.p_isl_union_map_is_empty)
++#define isl_union_map_subtract (*isl_pointers__.p_isl_union_map_subtract)
++#define isl_union_map_union (*isl_pointers__.p_isl_union_map_union)
++#define isl_union_set_add_set (*isl_pointers__.p_isl_union_set_add_set)
++#define isl_union_set_compute_schedule (*isl_pointers__.p_isl_union_set_compute_schedule)
++#define isl_union_set_copy (*isl_pointers__.p_isl_union_set_copy)
++#define isl_union_set_empty (*isl_pointers__.p_isl_union_set_empty)
++#define isl_union_set_from_set (*isl_pointers__.p_isl_union_set_from_set)
++#define isl_aff_add_constant_val (*isl_pointers__.p_isl_aff_add_constant_val)
++#define isl_aff_get_coefficient_val (*isl_pointers__.p_isl_aff_get_coefficient_val)
++#define isl_aff_get_ctx (*isl_pointers__.p_isl_aff_get_ctx)
++#define isl_aff_mod_val (*isl_pointers__.p_isl_aff_mod_val)
++#define isl_ast_build_ast_from_schedule (*isl_pointers__.p_isl_ast_build_ast_from_schedule)
++#define isl_ast_build_free (*isl_pointers__.p_isl_ast_build_free)
++#define isl_ast_build_from_context (*isl_pointers__.p_isl_ast_build_from_context)
++#define isl_ast_build_get_ctx (*isl_pointers__.p_isl_ast_build_get_ctx)
++#define isl_ast_build_get_schedule (*isl_pointers__.p_isl_ast_build_get_schedule)
++#define isl_ast_build_get_schedule_space (*isl_pointers__.p_isl_ast_build_get_schedule_space)
++#define isl_ast_build_set_before_each_for (*isl_pointers__.p_isl_ast_build_set_before_each_for)
++#define isl_ast_build_set_options (*isl_pointers__.p_isl_ast_build_set_options)
++#define isl_ast_expr_free (*isl_pointers__.p_isl_ast_expr_free)
++#define isl_ast_expr_from_val (*isl_pointers__.p_isl_ast_expr_from_val)
++#define isl_ast_expr_get_ctx (*isl_pointers__.p_isl_ast_expr_get_ctx)
++#define isl_ast_expr_get_id (*isl_pointers__.p_isl_ast_expr_get_id)
++#define isl_ast_expr_get_op_arg (*isl_pointers__.p_isl_ast_expr_get_op_arg)
++#define isl_ast_expr_get_op_n_arg (*isl_pointers__.p_isl_ast_expr_get_op_n_arg)
++#define isl_ast_expr_get_op_type (*isl_pointers__.p_isl_ast_expr_get_op_type)
++#define isl_ast_expr_get_type (*isl_pointers__.p_isl_ast_expr_get_type)
++#define isl_ast_expr_get_val (*isl_pointers__.p_isl_ast_expr_get_val)
++#define isl_ast_expr_sub (*isl_pointers__.p_isl_ast_expr_sub)
++#define isl_ast_node_block_get_children (*isl_pointers__.p_isl_ast_node_block_get_children)
++#define isl_ast_node_for_get_body (*isl_pointers__.p_isl_ast_node_for_get_body)
++#define isl_ast_node_for_get_cond (*isl_pointers__.p_isl_ast_node_for_get_cond)
++#define isl_ast_node_for_get_inc (*isl_pointers__.p_isl_ast_node_for_get_inc)
++#define isl_ast_node_for_get_init (*isl_pointers__.p_isl_ast_node_for_get_init)
++#define isl_ast_node_for_get_iterator (*isl_pointers__.p_isl_ast_node_for_get_iterator)
++#define isl_ast_node_free (*isl_pointers__.p_isl_ast_node_free)
++#define isl_ast_node_get_annotation (*isl_pointers__.p_isl_ast_node_get_annotation)
++#define isl_ast_node_get_type (*isl_pointers__.p_isl_ast_node_get_type)
++#define isl_ast_node_if_get_cond (*isl_pointers__.p_isl_ast_node_if_get_cond)
++#define isl_ast_node_if_get_else (*isl_pointers__.p_isl_ast_node_if_get_else)
++#define isl_ast_node_if_get_then (*isl_pointers__.p_isl_ast_node_if_get_then)
++#define isl_ast_node_list_free (*isl_pointers__.p_isl_ast_node_list_free)
++#define isl_ast_node_list_get_ast_node (*isl_pointers__.p_isl_ast_node_list_get_ast_node)
++#define isl_ast_node_list_n_ast_node (*isl_pointers__.p_isl_ast_node_list_n_ast_node)
++#define isl_ast_node_user_get_expr (*isl_pointers__.p_isl_ast_node_user_get_expr)
++#define isl_constraint_set_coefficient_val (*isl_pointers__.p_isl_constraint_set_coefficient_val)
++#define isl_constraint_set_constant_val (*isl_pointers__.p_isl_constraint_set_constant_val)
++#define isl_id_get_user (*isl_pointers__.p_isl_id_get_user)
++#define isl_local_space_get_ctx (*isl_pointers__.p_isl_local_space_get_ctx)
++#define isl_map_fix_val (*isl_pointers__.p_isl_map_fix_val)
++#define isl_options_set_ast_build_atomic_upper_bound (*isl_pointers__.p_isl_options_set_ast_build_atomic_upper_bound)
++#define isl_printer_print_ast_node (*isl_pointers__.p_isl_printer_print_ast_node)
++#define isl_printer_print_str (*isl_pointers__.p_isl_printer_print_str)
++#define isl_printer_set_output_format (*isl_pointers__.p_isl_printer_set_output_format)
++#define isl_pw_aff_mod_val (*isl_pointers__.p_isl_pw_aff_mod_val)
++#define isl_schedule_constraints_compute_schedule (*isl_pointers__.p_isl_schedule_constraints_compute_schedule)
++#define isl_schedule_constraints_on_domain (*isl_pointers__.p_isl_schedule_constraints_on_domain)
++#define isl_schedule_constraints_set_coincidence (*isl_pointers__.p_isl_schedule_constraints_set_coincidence)
++#define isl_schedule_constraints_set_proximity (*isl_pointers__.p_isl_schedule_constraints_set_proximity)
++#define isl_schedule_constraints_set_validity (*isl_pointers__.p_isl_schedule_constraints_set_validity)
++#define isl_set_get_dim_id (*isl_pointers__.p_isl_set_get_dim_id)
++#define isl_set_max_val (*isl_pointers__.p_isl_set_max_val)
++#define isl_set_min_val (*isl_pointers__.p_isl_set_min_val)
++#define isl_set_params (*isl_pointers__.p_isl_set_params)
++#define isl_space_align_params (*isl_pointers__.p_isl_space_align_params)
++#define isl_space_map_from_domain_and_range (*isl_pointers__.p_isl_space_map_from_domain_and_range)
++#define isl_space_set_tuple_name (*isl_pointers__.p_isl_space_set_tuple_name)
++#define isl_space_wrap (*isl_pointers__.p_isl_space_wrap)
++#define isl_union_map_from_domain_and_range (*isl_pointers__.p_isl_union_map_from_domain_and_range)
++#define isl_union_map_range (*isl_pointers__.p_isl_union_map_range)
++#define isl_union_set_union (*isl_pointers__.p_isl_union_set_union)
++#define isl_union_set_universe (*isl_pointers__.p_isl_union_set_universe)
++#define isl_val_2exp (*isl_pointers__.p_isl_val_2exp)
++#define isl_val_add_ui (*isl_pointers__.p_isl_val_add_ui)
++#define isl_val_copy (*isl_pointers__.p_isl_val_copy)
++#define isl_val_free (*isl_pointers__.p_isl_val_free)
++#define isl_val_int_from_si (*isl_pointers__.p_isl_val_int_from_si)
++#define isl_val_int_from_ui (*isl_pointers__.p_isl_val_int_from_ui)
++#define isl_val_mul (*isl_pointers__.p_isl_val_mul)
++#define isl_val_neg (*isl_pointers__.p_isl_val_neg)
++#define isl_val_sub (*isl_pointers__.p_isl_val_sub)
++#define isl_printer_print_union_map (*isl_pointers__.p_isl_printer_print_union_map)
++#define isl_pw_aff_get_ctx (*isl_pointers__.p_isl_pw_aff_get_ctx)
++#define isl_val_is_int (*isl_pointers__.p_isl_val_is_int)
++#define isl_ctx_get_max_operations (*isl_pointers__.p_isl_ctx_get_max_operations)
++#define isl_ctx_set_max_operations (*isl_pointers__.p_isl_ctx_set_max_operations)
++#define isl_ctx_last_error (*isl_pointers__.p_isl_ctx_last_error)
++#define isl_ctx_reset_operations (*isl_pointers__.p_isl_ctx_reset_operations)
++#define isl_map_coalesce (*isl_pointers__.p_isl_map_coalesce)
++#define isl_printer_print_schedule (*isl_pointers__.p_isl_printer_print_schedule)
++#define isl_set_set_dim_id (*isl_pointers__.p_isl_set_set_dim_id)
++#define isl_union_map_coalesce (*isl_pointers__.p_isl_union_map_coalesce)
++#define isl_multi_val_set_val (*isl_pointers__.p_isl_multi_val_set_val)
++#define isl_multi_val_zero (*isl_pointers__.p_isl_multi_val_zero)
++#define isl_options_set_schedule_max_coefficient (*isl_pointers__.p_isl_options_set_schedule_max_coefficient)
++#define isl_options_set_tile_scale_tile_loops (*isl_pointers__.p_isl_options_set_tile_scale_tile_loops)
++#define isl_schedule_copy (*isl_pointers__.p_isl_schedule_copy)
++#define isl_schedule_get_map (*isl_pointers__.p_isl_schedule_get_map)
++#define isl_schedule_map_schedule_node_bottom_up (*isl_pointers__.p_isl_schedule_map_schedule_node_bottom_up)
++#define isl_schedule_node_band_get_permutable (*isl_pointers__.p_isl_schedule_node_band_get_permutable)
++#define isl_schedule_node_band_get_space (*isl_pointers__.p_isl_schedule_node_band_get_space)
++#define isl_schedule_node_band_tile (*isl_pointers__.p_isl_schedule_node_band_tile)
++#define isl_schedule_node_child (*isl_pointers__.p_isl_schedule_node_child)
++#define isl_schedule_node_free (*isl_pointers__.p_isl_schedule_node_free)
++#define isl_schedule_node_get_child (*isl_pointers__.p_isl_schedule_node_get_child)
++#define isl_schedule_node_get_ctx (*isl_pointers__.p_isl_schedule_node_get_ctx)
++#define isl_schedule_node_get_type (*isl_pointers__.p_isl_schedule_node_get_type)
++#define isl_schedule_node_n_children (*isl_pointers__.p_isl_schedule_node_n_children)
++#define isl_union_map_is_equal (*isl_pointers__.p_isl_union_map_is_equal)
++#define isl_union_access_info_compute_flow (*isl_pointers__.p_isl_union_access_info_compute_flow)
++#define isl_union_access_info_from_sink (*isl_pointers__.p_isl_union_access_info_from_sink)
++#define isl_union_access_info_set_may_source (*isl_pointers__.p_isl_union_access_info_set_may_source)
++#define isl_union_access_info_set_must_source (*isl_pointers__.p_isl_union_access_info_set_must_source)
++#define isl_union_access_info_set_schedule (*isl_pointers__.p_isl_union_access_info_set_schedule)
++#define isl_union_flow_free (*isl_pointers__.p_isl_union_flow_free)
++#define isl_union_flow_get_may_dependence (*isl_pointers__.p_isl_union_flow_get_may_dependence)
++#define isl_union_flow_get_must_dependence (*isl_pointers__.p_isl_union_flow_get_must_dependence)
++#define isl_aff_var_on_domain (*isl_pointers__.p_isl_aff_var_on_domain)
++#define isl_multi_aff_from_aff (*isl_pointers__.p_isl_multi_aff_from_aff)
++#define isl_schedule_get_ctx (*isl_pointers__.p_isl_schedule_get_ctx)
++#define isl_multi_aff_set_tuple_id (*isl_pointers__.p_isl_multi_aff_set_tuple_id)
++#define isl_multi_aff_dim (*isl_pointers__.p_isl_multi_aff_dim)
++#define isl_schedule_get_domain (*isl_pointers__.p_isl_schedule_get_domain)
++#define isl_union_set_is_empty (*isl_pointers__.p_isl_union_set_is_empty)
++#define isl_union_set_get_space (*isl_pointers__.p_isl_union_set_get_space)
++#define isl_union_pw_multi_aff_empty (*isl_pointers__.p_isl_union_pw_multi_aff_empty)
++#define isl_union_set_foreach_set (*isl_pointers__.p_isl_union_set_foreach_set)
++#define isl_union_set_free (*isl_pointers__.p_isl_union_set_free)
++#define isl_multi_union_pw_aff_from_union_pw_multi_aff (*isl_pointers__.p_isl_multi_union_pw_aff_from_union_pw_multi_aff)
++#define isl_multi_union_pw_aff_apply_multi_aff (*isl_pointers__.p_isl_multi_union_pw_aff_apply_multi_aff)
++#define isl_schedule_insert_partial_schedule (*isl_pointers__.p_isl_schedule_insert_partial_schedule)
++#define isl_union_pw_multi_aff_free (*isl_pointers__.p_isl_union_pw_multi_aff_free)
++#define isl_pw_multi_aff_project_out_map (*isl_pointers__.p_isl_pw_multi_aff_project_out_map)
++#define isl_union_pw_multi_aff_add_pw_multi_aff (*isl_pointers__.p_isl_union_pw_multi_aff_add_pw_multi_aff)
++#define isl_schedule_from_domain (*isl_pointers__.p_isl_schedule_from_domain)
++#define isl_schedule_sequence (*isl_pointers__.p_isl_schedule_sequence)
++#define isl_ast_build_node_from_schedule (*isl_pointers__.p_isl_ast_build_node_from_schedule)
++#define isl_ast_node_mark_get_node (*isl_pointers__.p_isl_ast_node_mark_get_node)
++#define isl_schedule_node_band_member_get_ast_loop_type (*isl_pointers__.p_isl_schedule_node_band_member_get_ast_loop_type)
++#define isl_schedule_node_band_member_set_ast_loop_type (*isl_pointers__.p_isl_schedule_node_band_member_set_ast_loop_type)
++#define isl_val_n_abs_num_chunks (*isl_pointers__.p_isl_val_n_abs_num_chunks)
++#define isl_val_get_abs_num_chunks (*isl_pointers__.p_isl_val_get_abs_num_chunks)
++#define isl_val_int_from_chunks (*isl_pointers__.p_isl_val_int_from_chunks)
++#define isl_val_is_neg (*isl_pointers__.p_isl_val_is_neg)
++#define isl_version (*isl_pointers__.p_isl_version)
++#define isl_options_get_on_error (*isl_pointers__.p_isl_options_get_on_error)
++#define isl_ctx_reset_error (*isl_pointers__.p_isl_ctx_reset_error)
++
+ typedef struct poly_dr *poly_dr_p;
+
+ typedef struct poly_bb *poly_bb_p;
+@@ -448,5 +1033,6 @@ extern tree cached_scalar_evolution_in_r
+ extern void dot_all_sese (FILE *, vec &);
+ extern void dot_sese (sese_l &);
+ extern void dot_cfg ();
++extern const char *get_isl_version (bool);
+
+ #endif
+--- gcc/graphite.cc.jj 2015-11-04 14:15:32.000000000 +0100
++++ gcc/graphite.cc 2015-11-04 14:56:02.645536409 +0100
+@@ -60,6 +60,35 @@ along with GCC; see the file COPYING3.
+ #include "tree-into-ssa.h"
+ #include "graphite.h"
+
++__typeof (isl_pointers__) isl_pointers__;
++
++static bool
++init_isl_pointers (void)
++{
++ void *h;
++
++ if (isl_pointers__.inited)
++ return isl_pointers__.h != NULL;
++ h = dlopen ("libisl.so.15", RTLD_LAZY);
++ isl_pointers__.h = h;
++ if (h == NULL)
++ return false;
++#define DYNSYM(x) \
++ do \
++ { \
++ union { __typeof (isl_pointers__.p_##x) p; void *q; } u; \
++ u.q = dlsym (h, #x); \
++ if (u.q == NULL) \
++ return false; \
++ isl_pointers__.p_##x = u.p; \
++ } \
++ while (0)
++ DYNSYMS
++#undef DYNSYM
++ isl_pointers__.inited = true;
++ return true;
++}
++
+ /* Print global statistics to FILE. */
+
+ static void
+@@ -365,6 +394,15 @@ graphite_transform_loops (void)
+ if (parallelized_function_p (cfun->decl))
+ return;
+
++ if (number_of_loops (cfun) <= 1)
++ return;
++
++ if (!init_isl_pointers ())
++ {
++ sorry ("Graphite loop optimizations cannot be used");
++ return;
++ }
++
+ calculate_dominance_info (CDI_DOMINATORS);
+
+ /* We rely on post-dominators during merging of SESE regions so those
+@@ -455,6 +493,14 @@ graphite_transform_loops (void)
+ }
+ }
+
++const char *
++get_isl_version (bool force)
++{
++ if (force)
++ init_isl_pointers ();
++ return (isl_pointers__.inited && isl_version) ? isl_version () : "none";
++}
++
+ #else /* If isl is not available: #ifndef HAVE_isl. */
+
+ static void
+--- gcc/toplev.cc.jj 2017-02-19 13:02:31.000000000 +0100
++++ gcc/toplev.cc 2017-02-19 16:50:25.536301350 +0100
+@@ -94,6 +94,7 @@ along with GCC; see the file COPYING3.
+
+ #ifdef HAVE_isl
+ #include
++extern const char *get_isl_version (bool);
+ #endif
+
+ static void general_init (const char *, bool);
+@@ -683,7 +684,7 @@ print_version (FILE *file, const char *i
+ #ifndef HAVE_isl
+ "none"
+ #else
+- isl_version ()
++ get_isl_version (*indent == 0)
+ #endif
+ );
+ if (strcmp (GCC_GMP_STRINGIFY_VERSION, gmp_version))
diff --git a/SOURCES/gcc12-isl-dl2.patch b/SOURCES/gcc12-isl-dl2.patch
new file mode 100644
index 0000000..5402a8e
--- /dev/null
+++ b/SOURCES/gcc12-isl-dl2.patch
@@ -0,0 +1,71 @@
+2011-04-04 Jakub Jelinek
+
+ * toplev.cc (toplev_main_argv): New variable.
+ (toplev_main): Initialize it.
+ * graphite.cc (init_isl_pointers): Load libisl.so.15 from gcc's private
+ directory.
+
+--- gcc/toplev.cc.jj 2008-12-09 23:59:10.000000000 +0100
++++ gcc/toplev.cc 2009-01-27 14:33:52.000000000 +0100
+@@ -113,6 +113,8 @@ static void finalize (bool);
+ static void crash_signal (int) ATTRIBUTE_NORETURN;
+ static void compile_file (void);
+
++const char **toplev_main_argv;
++
+ /* Decoded options, and number of such options. */
+ struct cl_decoded_option *save_decoded_options;
+ unsigned int save_decoded_options_count;
+@@ -2239,6 +2241,8 @@ toplev::main (int argc, char **argv)
+
+ expandargv (&argc, &argv);
+
++ toplev_main_argv = CONST_CAST2 (const char **, char **, argv);
++
+ /* Initialization of GCC's environment, and diagnostics. */
+ general_init (argv[0], m_init_signals);
+
+--- gcc/graphite.cc.jj 2010-12-01 10:24:32.000000000 -0500
++++ gcc/graphite.cc 2010-12-01 11:46:07.832118193 -0500
+@@ -64,11 +64,39 @@ __typeof (isl_pointers__) isl_pointers__
+ static bool
+ init_isl_pointers (void)
+ {
+- void *h;
++ void *h = NULL;
++ extern const char **toplev_main_argv;
++ char *buf, *p;
++ size_t len;
+
+ if (isl_pointers__.inited)
+ return isl_pointers__.h != NULL;
+- h = dlopen ("libisl.so.15", RTLD_LAZY);
++ len = progname - toplev_main_argv[0];
++ buf = XALLOCAVAR (char, len + sizeof "libisl.so.15");
++ memcpy (buf, toplev_main_argv[0], len);
++ strcpy (buf + len, "libisl.so.15");
++ len += sizeof "libisl.so.15";
++ p = strstr (buf, "/libexec/");
++ if (p != NULL)
++ {
++ while (1)
++ {
++ char *q = strstr (p + 8, "/libexec/");
++ if (q == NULL)
++ break;
++ p = q;
++ }
++ memmove (p + 4, p + 8, len - (p + 8 - buf));
++ h = dlopen (buf, RTLD_LAZY);
++ if (h == NULL)
++ {
++ len = progname - toplev_main_argv[0];
++ memcpy (buf, toplev_main_argv[0], len);
++ strcpy (buf + len, "libisl.so.15");
++ }
++ }
++ if (h == NULL)
++ h = dlopen (buf, RTLD_LAZY);
+ isl_pointers__.h = h;
+ if (h == NULL)
+ return false;
diff --git a/SOURCES/gcc12-libgomp-omp_h-multilib.patch b/SOURCES/gcc12-libgomp-omp_h-multilib.patch
new file mode 100644
index 0000000..d0e98d1
--- /dev/null
+++ b/SOURCES/gcc12-libgomp-omp_h-multilib.patch
@@ -0,0 +1,17 @@
+2008-06-09 Jakub Jelinek
+
+ * omp.h.in (omp_nest_lock_t): Fix up for Linux multilibs.
+
+--- libgomp/omp.h.in.jj 2008-06-09 13:34:05.000000000 +0200
++++ libgomp/omp.h.in 2008-06-09 13:34:48.000000000 +0200
+@@ -42,8 +42,8 @@ typedef struct
+
+ typedef struct
+ {
+- unsigned char _x[@OMP_NEST_LOCK_SIZE@]
+- __attribute__((__aligned__(@OMP_NEST_LOCK_ALIGN@)));
++ unsigned char _x[8 + sizeof (void *)]
++ __attribute__((__aligned__(sizeof (void *))));
+ } omp_nest_lock_t;
+ #endif
+
diff --git a/SOURCES/gcc12-libstdc++-docs.patch b/SOURCES/gcc12-libstdc++-docs.patch
new file mode 100644
index 0000000..5a27a5d
--- /dev/null
+++ b/SOURCES/gcc12-libstdc++-docs.patch
@@ -0,0 +1,24 @@
+--- libstdc++-v3/doc/html/index.html.jj 2011-01-03 12:53:21.282829010 +0100
++++ libstdc++-v3/doc/html/index.html 2011-01-04 18:06:28.999851145 +0100
+@@ -5,6 +5,8 @@
+ FSF
+
+
++ Release 12.1.1
++
+ Permission is granted to copy, distribute and/or modify this
+ document under the terms of the GNU Free Documentation
+ License, Version 1.2 or any later version published by the
+--- libstdc++-v3/doc/html/api.html.jj 2011-01-03 12:53:21.000000000 +0100
++++ libstdc++-v3/doc/html/api.html 2011-01-04 18:12:01.672757784 +0100
+@@ -20,7 +20,9 @@
+ member functions for the library classes, finding out what is in a
+ particular include file, looking at inheritance diagrams, etc.
+
+- The API documentation, rendered into HTML, can be viewed online
++ The API documentation, rendered into HTML, can be viewed locally
++ for the 12.1.1 release,
++ online
+ for each GCC release
+ and
+
diff --git a/SOURCES/gcc12-libtool-no-rpath.patch b/SOURCES/gcc12-libtool-no-rpath.patch
new file mode 100644
index 0000000..466c661
--- /dev/null
+++ b/SOURCES/gcc12-libtool-no-rpath.patch
@@ -0,0 +1,27 @@
+libtool sucks.
+--- ltmain.sh.jj 2007-12-07 14:53:21.000000000 +0100
++++ ltmain.sh 2008-09-05 21:51:48.000000000 +0200
+@@ -5394,6 +5394,7 @@ EOF
+ rpath="$finalize_rpath"
+ test "$mode" != relink && rpath="$compile_rpath$rpath"
+ for libdir in $rpath; do
++ case "$libdir" in /usr/lib|/usr/lib64|/usr/lib/../lib|/usr/lib/../lib64) continue;; esac
+ if test -n "$hardcode_libdir_flag_spec"; then
+ if test -n "$hardcode_libdir_separator"; then
+ if test -z "$hardcode_libdirs"; then
+@@ -6071,6 +6072,7 @@ EOF
+ rpath=
+ hardcode_libdirs=
+ for libdir in $compile_rpath $finalize_rpath; do
++ case "$libdir" in /usr/lib|/usr/lib64|/usr/lib/../lib|/usr/lib/../lib64) continue;; esac
+ if test -n "$hardcode_libdir_flag_spec"; then
+ if test -n "$hardcode_libdir_separator"; then
+ if test -z "$hardcode_libdirs"; then
+@@ -6120,6 +6122,7 @@ EOF
+ rpath=
+ hardcode_libdirs=
+ for libdir in $finalize_rpath; do
++ case "$libdir" in /usr/lib|/usr/lib64|/usr/lib/../lib|/usr/lib/../lib64) continue;; esac
+ if test -n "$hardcode_libdir_flag_spec"; then
+ if test -n "$hardcode_libdir_separator"; then
+ if test -z "$hardcode_libdirs"; then
diff --git a/SOURCES/gcc12-no-add-needed.patch b/SOURCES/gcc12-no-add-needed.patch
new file mode 100644
index 0000000..5817299
--- /dev/null
+++ b/SOURCES/gcc12-no-add-needed.patch
@@ -0,0 +1,37 @@
+2010-02-08 Roland McGrath
+
+ * config/gnu-user.h (LINK_EH_SPEC): Pass --no-add-needed to the linker.
+ * config/alpha/elf.h (LINK_EH_SPEC): Likewise.
+ * config/ia64/linux.h (LINK_EH_SPEC): Likewise.
+
+--- gcc/config/alpha/elf.h.jj 2011-01-03 12:52:31.118056764 +0100
++++ gcc/config/alpha/elf.h 2011-01-04 18:14:10.931874160 +0100
+@@ -168,5 +168,5 @@ extern int alpha_this_gpdisp_sequence_nu
+ I imagine that other systems will catch up. In the meantime, it
+ doesn't harm to make sure that the data exists to be used later. */
+ #if defined(HAVE_LD_EH_FRAME_HDR)
+-#define LINK_EH_SPEC "%{!static|static-pie:--eh-frame-hdr} "
++#define LINK_EH_SPEC "--no-add-needed %{!static|static-pie:--eh-frame-hdr} "
+ #endif
+--- gcc/config/ia64/linux.h.jj 2011-01-03 13:02:11.462994522 +0100
++++ gcc/config/ia64/linux.h 2011-01-04 18:14:10.931874160 +0100
+@@ -76,7 +76,7 @@ do { \
+ Signalize that because we have fde-glibc, we don't need all C shared libs
+ linked against -lgcc_s. */
+ #undef LINK_EH_SPEC
+-#define LINK_EH_SPEC ""
++#define LINK_EH_SPEC "--no-add-needed "
+
+ #undef TARGET_INIT_LIBFUNCS
+ #define TARGET_INIT_LIBFUNCS ia64_soft_fp_init_libfuncs
+--- gcc/config/gnu-user.h.jj 2011-01-03 12:53:03.739057299 +0100
++++ gcc/config/gnu-user.h 2011-01-04 18:14:10.932814884 +0100
+@@ -106,7 +106,7 @@ see the files COPYING3 and COPYING.RUNTI
+ #define LIB_SPEC GNU_USER_TARGET_LIB_SPEC
+
+ #if defined(HAVE_LD_EH_FRAME_HDR)
+-#define LINK_EH_SPEC "%{!static|static-pie:--eh-frame-hdr} "
++#define LINK_EH_SPEC "--no-add-needed %{!static|static-pie:--eh-frame-hdr} "
+ #endif
+
+ #define GNU_USER_TARGET_LINK_GCC_C_SEQUENCE_SPEC \
diff --git a/SOURCES/gcc12-rh1574936.patch b/SOURCES/gcc12-rh1574936.patch
new file mode 100644
index 0000000..6b4be0c
--- /dev/null
+++ b/SOURCES/gcc12-rh1574936.patch
@@ -0,0 +1,30 @@
+crt files and statically linked libgcc objects cause false positives
+in annobin coverage, so we add the assembler flag to generate notes
+for them.
+
+The patch also adds notes to libgcc_s.so, but this is harmless because
+these notes only confer that there is no other annobin markup.
+
+2018-07-25 Florian Weimer
+
+ * Makefile.in (LIBGCC2_CFLAGS, CRTSTUFF_CFLAGS): Add
+ -Wa,--generate-missing-build-notes=yes.
+
+--- libgcc/Makefile.in 2018-01-13 13:05:41.000000000 +0100
++++ libgcc/Makefile.in 2018-07-25 13:15:02.036226940 +0200
+@@ -246,6 +246,7 @@ LIBGCC2_DEBUG_CFLAGS = -g
+ LIBGCC2_CFLAGS = -O2 $(LIBGCC2_INCLUDES) $(GCC_CFLAGS) $(HOST_LIBGCC2_CFLAGS) \
+ $(LIBGCC2_DEBUG_CFLAGS) -DIN_LIBGCC2 \
+ -fbuilding-libgcc -fno-stack-protector \
++ -Wa,--generate-missing-build-notes=yes \
+ $(INHIBIT_LIBC_CFLAGS)
+
+ # Additional options to use when compiling libgcc2.a.
+@@ -301,6 +302,7 @@ CRTSTUFF_CFLAGS = -O2 $(GCC_CFLAGS) $(IN
+ $(NO_PIE_CFLAGS) -finhibit-size-directive -fno-inline -fno-exceptions \
+ -fno-zero-initialized-in-bss -fno-toplevel-reorder -fno-tree-vectorize \
+ -fbuilding-libgcc -fno-stack-protector $(FORCE_EXPLICIT_EH_REGISTRY) \
++ -Wa,--generate-missing-build-notes=yes \
+ $(INHIBIT_LIBC_CFLAGS) $(USE_TM_CLONE_REGISTRY)
+
+ # Extra flags to use when compiling crt{begin,end}.o.
diff --git a/SOURCES/gcc12-sparc-config-detection.patch b/SOURCES/gcc12-sparc-config-detection.patch
new file mode 100644
index 0000000..bb06b35
--- /dev/null
+++ b/SOURCES/gcc12-sparc-config-detection.patch
@@ -0,0 +1,40 @@
+--- gcc/config.gcc.jj 2008-04-24 15:42:46.000000000 -0500
++++ gcc/config.gcc 2008-04-24 15:44:51.000000000 -0500
+@@ -2790,7 +2790,7 @@ sparc-*-rtems*)
+ tm_file="${tm_file} dbxelf.h elfos.h sparc/sysv4.h sparc/sp-elf.h sparc/rtemself.h rtems.h newlib-stdint.h"
+ tmake_file="${tmake_file} sparc/t-sparc sparc/t-rtems"
+ ;;
+-sparc-*-linux*)
++sparc-*-linux* | sparcv9-*-linux*)
+ tm_file="${tm_file} dbxelf.h elfos.h sparc/sysv4.h gnu-user.h linux.h glibc-stdint.h sparc/tso.h"
+ extra_options="${extra_options} sparc/long-double-switch.opt"
+ case ${target} in
+@@ -2844,7 +2844,7 @@ sparc64-*-rtems*)
+ extra_options="${extra_options}"
+ tmake_file="${tmake_file} sparc/t-sparc sparc/t-rtems-64"
+ ;;
+-sparc64-*-linux*)
++sparc64*-*-linux*)
+ tm_file="sparc/biarch64.h ${tm_file} dbxelf.h elfos.h sparc/sysv4.h gnu-user.h linux.h glibc-stdint.h sparc/default64.h sparc/linux64.h sparc/tso.h"
+ extra_options="${extra_options} sparc/long-double-switch.opt"
+ tmake_file="${tmake_file} sparc/t-sparc sparc/t-linux64"
+--- libgcc/config.host.jj 2008-04-24 15:46:19.000000000 -0500
++++ libgcc/config.host 2008-04-24 15:46:49.000000000 -0500
+@@ -1002,7 +1002,7 @@ sparc-*-elf*)
+ tmake_file="${tmake_file} t-fdpbit t-crtfm"
+ extra_parts="$extra_parts crti.o crtn.o crtfastmath.o"
+ ;;
+-sparc-*-linux*) # SPARC's running GNU/Linux, libc6
++sparc-*-linux* | sparcv9-*-linux*) # SPARC's running GNU/Linux, libc6
+ tmake_file="${tmake_file} t-crtfm"
+ if test "${host_address}" = 64; then
+ tmake_file="$tmake_file sparc/t-linux64"
+@@ -1050,7 +1050,7 @@ sparc64-*-freebsd*|ultrasparc-*-freebsd*
+ tmake_file="$tmake_file t-crtfm"
+ extra_parts="$extra_parts crtfastmath.o"
+ ;;
+-sparc64-*-linux*) # 64-bit SPARC's running GNU/Linux
++sparc64*-*-linux*) # 64-bit SPARC's running GNU/Linux
+ extra_parts="$extra_parts crtfastmath.o"
+ tmake_file="${tmake_file} t-crtfm sparc/t-linux"
+ if test "${host_address}" = 64; then
diff --git a/SPECS/compat-sap-c++-12.spec b/SPECS/compat-sap-c++-12.spec
new file mode 100644
index 0000000..747ca4b
--- /dev/null
+++ b/SPECS/compat-sap-c++-12.spec
@@ -0,0 +1,566 @@
+%global __python /usr/bin/python3
+%global scl 1
+%global scl_prefix compat-sap-
+%global _root_prefix /opt/rh/SAP
+%global _root_infodir %{_root_prefix}/%{_infodir}
+%global _root_mandir %{_root_prefix}/%{_mandir}
+%{?scl:%global __strip strip}
+%{?scl:%global __objdump objdump}
+%global DATE 20220507
+%global gitrev fa107326a13af9a7d7aa0df28fe364db0f6fb171
+%global gcc_version 12.1.1
+%global gcc_major 12
+# Note, gcc_release must be integer, if you want to add suffixes to
+# %%{release}, append them after %%{gcc_release} on Release: line.
+%global gcc_release 1
+%global _unpackaged_files_terminate_build 0
+%undefine _annotated_build
+%global multilib_64_archs sparc64 ppc64 x86_64
+%ifarch %{ix86} x86_64 ppc ppc64 ppc64le ppc64p7 s390 s390x %{arm} aarch64
+%global attr_ifunc 1
+%else
+%global attr_ifunc 0
+%endif
+%ifarch x86_64
+%global multilib_32_arch i686
+%endif
+%if 0%{?fedora} >= 36 || 0%{?rhel} >= 10
+%global build_annobin_plugin 1
+%else
+%global build_annobin_plugin 0
+%endif
+Summary: C++ compatibility runtime library for SAP applications
+Name: %{?scl_prefix}c++-12
+ExclusiveArch: x86_64 ppc64le s390x
+Version: %{gcc_version}
+Release: %{gcc_release}%{?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
+# The source for this package was pulled from upstream's vcs.
+# %%{gitrev} is some commit from the
+# https://gcc.gnu.org/git/?p=gcc.git;h=refs/vendors/redhat/heads/gcc-%%{gcc_major}-branch
+# branch. Use the following commands to generate the tarball:
+# git clone --depth 1 git://gcc.gnu.org/git/gcc.git gcc-dir.tmp
+# git --git-dir=gcc-dir.tmp/.git fetch --depth 1 origin %%{gitrev}
+# git --git-dir=gcc-dir.tmp/.git archive --prefix=%%{name}-%%{version}-%%{DATE}/ %%{gitrev} | xz -9e > %%{name}-%%{version}-%%{DATE}.tar.xz
+# rm -rf gcc-dir.tmp
+Source0: gcc-%{version}-%{DATE}.tar.xz
+URL: http://gcc.gnu.org
+# Need binutils with -pie support >= 2.14.90.0.4-4
+# Need binutils which can omit dot symbols and overlap .opd on ppc64 >= 2.15.91.0.2-4
+# Need binutils which handle -msecure-plt on ppc >= 2.16.91.0.2-2
+# Need binutils which support .weakref >= 2.16.91.0.3-1
+# Need binutils which support --hash-style=gnu >= 2.17.50.0.2-7
+# Need binutils which support mffgpr and mftgpr >= 2.17.50.0.2-8
+# Need binutils which support --build-id >= 2.17.50.0.17-3
+# Need binutils which support %%gnu_unique_object >= 2.19.51.0.14
+# Need binutils which support .cfi_sections >= 2.19.51.0.14-33
+# Need binutils which support --no-add-needed >= 2.20.51.0.2-12
+# Need binutils which support -plugin
+# Need binutils which support .loc view >= 2.30
+# Need binutils which support --generate-missing-build-notes=yes >= 2.31
+BuildRequires: binutils >= 2.19.51.0.14-33
+# While gcc doesn't include statically linked binaries, during testing
+# -static is used several times.
+BuildRequires: glibc-static
+BuildRequires: zlib-devel, gettext, dejagnu, bison, flex, sharutils
+BuildRequires: texinfo, texinfo-tex, /usr/bin/pod2man
+BuildRequires: gcc, gcc-c++, make
+# For VTA guality testing
+BuildRequires: gdb
+# Make sure pthread.h doesn't contain __thread tokens
+# Make sure glibc supports stack protector
+# Make sure glibc supports DT_GNU_HASH
+BuildRequires: glibc-devel >= 2.4.90-13
+BuildRequires: elfutils-devel >= 0.147
+BuildRequires: elfutils-libelf-devel >= 0.147
+%if 0%{?rhel} >= 8
+BuildRequires: libzstd-devel
+%endif
+%ifarch ppc ppc64 ppc64le ppc64p7 s390 s390x sparc sparcv9 alpha
+# Make sure glibc supports TFmode long double
+BuildRequires: glibc >= 2.3.90-35
+%endif
+%ifarch %{multilib_64_archs} sparcv9 ppc
+# Ensure glibc{,-devel} is installed for both multilib arches
+BuildRequires: /lib/libc.so.6 /usr/lib/libc.so /lib64/libc.so.6 /usr/lib64/libc.so
+%endif
+%ifarch ia64
+BuildRequires: libunwind >= 0.98
+%endif
+# Need .eh_frame ld optimizations
+# Need proper visibility support
+# Need -pie support
+# Need --as-needed/--no-as-needed support
+# On ppc64, need omit dot symbols support and --non-overlapping-opd
+# Need binutils that owns /usr/bin/c++filt
+# Need binutils that support .weakref
+# Need binutils that supports --hash-style=gnu
+# Need binutils that support mffgpr/mftgpr
+# Need binutils that support --build-id
+# Need binutils that support %%gnu_unique_object
+# Need binutils that support .cfi_sections
+# Need binutils that support --no-add-needed
+# Need binutils that support -plugin
+# Need binutils that support .loc view >= 2.30
+# Need binutils which support --generate-missing-build-notes=yes >= 2.31
+# Don't require this for compat-sap-c++ (#1491573).
+#Requires: binutils >= 2.19.51.0.14-33
+# Make sure gdb will understand DW_FORM_strp
+Conflicts: gdb < 5.1-2
+# Don't require this for compat-sap-c++ (#1491573).
+#Requires: glibc-devel >= 2.2.90-12
+%ifarch ppc ppc64 ppc64le ppc64p7 s390 s390x sparc sparcv9 alpha
+# Make sure glibc supports TFmode long double
+Requires: glibc >= 2.3.90-35
+%endif
+Requires: libgcc >= 4.1.2-43
+# Keep this for now.
+Requires: libgomp >= 4.4.4-13
+BuildRequires: gmp-devel >= 4.1.2-8
+BuildRequires: mpfr-devel >= 3.1.0
+%if 0%{?rhel} >= 7
+BuildRequires: libmpc-devel >= 0.8.1
+%endif
+
+%if 0%{?rhel} == 8
+%ifarch ppc64le
+BuildRequires: gcc-toolset-12-runtime gcc-toolset-12-binutils
+BuildRequires: gcc-toolset-12-gcc gcc-toolset-12-gcc-c++
+%endif
+%endif
+
+AutoReq: true
+AutoProv: false
+# Don't provide this for compat-sap-c++ (#1491573).
+#%ifarch sparc64 ppc64 ppc64le s390x x86_64 ia64
+#Provides: liblto_plugin.so.0()(64bit)
+#%else
+#Provides: liblto_plugin.so.0
+#%endif
+%global oformat %{nil}
+%global oformat2 %{nil}
+%ifarch %{ix86}
+%global oformat OUTPUT_FORMAT(elf32-i386)
+%endif
+%ifarch x86_64
+%global oformat OUTPUT_FORMAT(elf64-x86-64)
+%global oformat2 OUTPUT_FORMAT(elf32-i386)
+%endif
+%ifarch ppc
+%global oformat OUTPUT_FORMAT(elf32-powerpc)
+%global oformat2 OUTPUT_FORMAT(elf64-powerpc)
+%endif
+%ifarch ppc64
+%global oformat OUTPUT_FORMAT(elf64-powerpc)
+%global oformat2 OUTPUT_FORMAT(elf32-powerpc)
+%endif
+%ifarch s390
+%global oformat OUTPUT_FORMAT(elf32-s390)
+%endif
+%ifarch s390x
+%global oformat OUTPUT_FORMAT(elf64-s390)
+%global oformat2 OUTPUT_FORMAT(elf32-s390)
+%endif
+%ifarch ia64
+%global oformat OUTPUT_FORMAT(elf64-ia64-little)
+%endif
+%ifarch ppc64le
+%global oformat OUTPUT_FORMAT(elf64-powerpcle)
+%endif
+%ifarch aarch64
+%global oformat OUTPUT_FORMAT(elf64-littleaarch64)
+%endif
+
+Patch0: gcc12-hack.patch
+Patch2: gcc12-sparc-config-detection.patch
+Patch3: gcc12-libgomp-omp_h-multilib.patch
+Patch4: gcc12-libtool-no-rpath.patch
+Patch5: gcc12-isl-dl.patch
+Patch6: gcc12-isl-dl2.patch
+Patch7: gcc12-libstdc++-docs.patch
+Patch8: gcc12-no-add-needed.patch
+Patch9: gcc12-Wno-format-security.patch
+Patch10: gcc12-rh1574936.patch
+Patch11: gcc12-d-shared-libphobos.patch
+
+Patch3000: 0001-basic_string-reserve-n-semantics-are-not-available-i.patch
+Patch3001: 0004-operator-istream-char-N-eofbit-fixes-are-not-availab.patch
+Patch3002: 0005-Disable-tests-for-PR-libstdc-79820-and-PR-libstdc-81.patch
+Patch3003: 0006-Don-t-assume-has_facet-codecvt_c16-when-run-against-.patch
+Patch3004: 0008-testsuite-build-plugins-with-std-c-11.patch
+Patch3005: 0009-Fix-22_locale-locale-cons-unicode.cc-when-run-under-.patch
+Patch3006: 0010-Don-t-verify-exception-handling-in-basic_filebuf-clo.patch
+Patch3007: 0011-Add-dts.exp-and-use-it-to-fix-22_locale-messages-136.patch
+Patch3008: 0012-dts.exp-use-usr-bin-gcc.patch
+Patch3009: 0013-Rename-__CXXSTDLIB_SO_VERSION__-to-__LIBSTDCXX_SO_VE.patch
+Patch3010: 0014-Conditionalize-tests-for-PR-libstdc-98466-on-__LIBST.patch
+Patch3011: 0015-Conditionalize-test-for-PR-libstdc-87135-on-__LIBSTD.patch
+Patch3012: 0016-Conditionalize-test-for-hashtable-bucket-sizes-on-__.patch
+Patch3013: 0017-Conditionalize-test-for-PR-libstdc-71181-on-__LIBSTD.patch
+Patch3014: gcc12-dg-ice-fixes.patch
+
+%if 0%{?rhel} == 9
+%global nonsharedver 11
+%endif
+%if 0%{?rhel} == 8
+%global nonsharedver 80
+%endif
+%if 0%{?rhel} == 7
+%global nonsharedver 48
+%endif
+%if 0%{?rhel} == 6
+%global nonsharedver 44
+%endif
+
+%if 0%{?scl:1}
+%global _gnu %{nil}
+%else
+%global _gnu -gnueabi
+%endif
+%ifarch sparcv9
+%global gcc_target_platform sparc64-%{_vendor}-%{_target_os}
+%endif
+%ifarch ppc ppc64p7
+%global gcc_target_platform ppc64-%{_vendor}-%{_target_os}
+%endif
+%ifnarch sparcv9 ppc ppc64p7
+%global gcc_target_platform %{_target_platform}
+%endif
+
+%description
+This package provides runtime compatibility libraries for use by SAP
+application binaries only.
+
+%prep
+%setup -q -n gcc-%{version}-%{DATE}
+%patch0 -p0 -b .hack~
+%patch2 -p0 -b .sparc-config-detection~
+%patch3 -p0 -b .libgomp-omp_h-multilib~
+%patch4 -p0 -b .libtool-no-rpath~
+%patch8 -p0 -b .no-add-needed~
+%patch9 -p0 -b .Wno-format-security~
+%if 0%{?fedora} >= 29 || 0%{?rhel} > 7
+%patch10 -p0 -b .rh1574936~
+%endif
+%patch11 -p0 -b .d-shared-libphobos~
+
+# Apply DTS-specific testsuite patches.
+%patch3000 -p1 -b .dts-test-0~
+%patch3001 -p1 -b .dts-test-1~
+%patch3002 -p1 -b .dts-test-2~
+%patch3003 -p1 -b .dts-test-3~
+%patch3004 -p1 -b .dts-test-4~
+%patch3005 -p1 -b .dts-test-5~
+%patch3006 -p1 -b .dts-test-6~
+%patch3007 -p1 -b .dts-test-7~
+%patch3008 -p1 -b .dts-test-8~
+%patch3009 -p1 -b .dts-test-9~
+%patch3010 -p1 -b .dts-test-10~
+%patch3011 -p1 -b .dts-test-11~
+%patch3012 -p1 -b .dts-test-12~
+%patch3013 -p1 -b .dts-test-13~
+%patch3014 -p1 -b .dts-test-14~
+
+find gcc/testsuite -name \*.pr96939~ | xargs rm -f
+
+echo 'Red Hat %{version}-%{gcc_release}' > gcc/DEV-PHASE
+
+%if 0%{?rhel} == 6
+# Default to -gdwarf-3 rather than -gdwarf-5
+sed -i '/UInteger Var(dwarf_version)/s/Init(5)/Init(3)/' gcc/common.opt
+sed -i 's/\(version for most targets is \)5 /\13 /' gcc/doc/invoke.texi
+%endif
+%if 0%{?rhel} <= 8
+# Default to -gdwarf-4 rather than -gdwarf-5
+sed -i '/UInteger Var(dwarf_version)/s/Init(5)/Init(4)/' gcc/common.opt
+sed -i 's/\(version for most targets is \)5 /\14 /' gcc/doc/invoke.texi
+%endif
+
+cp -a libstdc++-v3/config/cpu/i{4,3}86/atomicity.h
+cp -a libstdc++-v3/config/cpu/i{4,3}86/opt
+echo 'TM_H += $(srcdir)/config/rs6000/rs6000-modes.h' >> gcc/config/rs6000/t-rs6000
+
+./contrib/gcc_update --touch
+
+LC_ALL=C sed -i -e 's/\xa0/ /' gcc/doc/options.texi
+
+sed -i -e 's/Common Driver Var(flag_report_bug)/& Init(1)/' gcc/common.opt
+sed -i -e 's/context->report_bug = false;/context->report_bug = true;/' gcc/diagnostic.cc
+
+%ifarch ppc
+if [ -d libstdc++-v3/config/abi/post/powerpc64-linux-gnu ]; then
+ mkdir -p libstdc++-v3/config/abi/post/powerpc64-linux-gnu/64
+ mv libstdc++-v3/config/abi/post/powerpc64-linux-gnu/{,64/}baseline_symbols.txt
+ mv libstdc++-v3/config/abi/post/powerpc64-linux-gnu/{32/,}baseline_symbols.txt
+ rm -rf libstdc++-v3/config/abi/post/powerpc64-linux-gnu/32
+fi
+%endif
+%ifarch sparc
+if [ -d libstdc++-v3/config/abi/post/sparc64-linux-gnu ]; then
+ mkdir -p libstdc++-v3/config/abi/post/sparc64-linux-gnu/64
+ mv libstdc++-v3/config/abi/post/sparc64-linux-gnu/{,64/}baseline_symbols.txt
+ mv libstdc++-v3/config/abi/post/sparc64-linux-gnu/{32/,}baseline_symbols.txt
+ rm -rf libstdc++-v3/config/abi/post/sparc64-linux-gnu/32
+fi
+%endif
+
+# This test causes fork failures, because it spawns way too many threads
+rm -f gcc/testsuite/go.test/test/chan/goroutines.go
+
+# These tests get stuck and don't timeout.
+%ifarch ppc ppc64 ppc64le
+rm -f libgomp/testsuite/libgomp.c/target-*.c
+rm -rf libgomp/testsuite/libgomp.oacc*
+rm -rf libgomp/testsuite/libgomp.graphite*
+%endif
+# This test gets stuck.
+%ifarch %{ix86} ppc64 s390x
+rm -f libstdc++-v3/testsuite/30_threads/future/members/poll.cc
+%endif
+
+%build
+
+# Undo the broken autoconf change in recent Fedora versions
+export CONFIG_SITE=NONE
+
+rm -rf obj-%{gcc_target_platform}
+mkdir obj-%{gcc_target_platform}
+cd obj-%{gcc_target_platform}
+
+%{?scl:PATH=%{_bindir}${PATH:+:${PATH}}}
+
+%if 0%{?rhel} == 8
+%ifarch ppc64le
+export PATH=/opt/rh/gcc-toolset-12/root/usr/bin:${PATH:+:${PATH}}
+%endif
+%endif
+
+CC=gcc
+CXX=g++
+OPT_FLAGS=`echo %{optflags}|sed -e 's/\(-Wp,\)\?-D_FORTIFY_SOURCE=[12]//g'`
+OPT_FLAGS=`echo $OPT_FLAGS|sed -e 's/-flto=auto//g;s/-flto//g;s/-ffat-lto-objects//g'`
+OPT_FLAGS=`echo $OPT_FLAGS|sed -e 's/-m64//g;s/-m32//g;s/-m31//g'`
+OPT_FLAGS=`echo $OPT_FLAGS|sed -e 's/-mfpmath=sse/-mfpmath=sse -msse2/g'`
+OPT_FLAGS=`echo $OPT_FLAGS|sed -e 's/ -pipe / /g'`
+OPT_FLAGS=`echo $OPT_FLAGS|sed -e 's/-Werror=format-security/-Wformat-security/g'`
+%ifarch sparc
+OPT_FLAGS=`echo $OPT_FLAGS|sed -e 's/-mcpu=ultrasparc/-mtune=ultrasparc/g;s/-mcpu=v[78]//g'`
+%endif
+%ifarch %{ix86}
+OPT_FLAGS=`echo $OPT_FLAGS|sed -e 's/-march=i.86//g'`
+%endif
+OPT_FLAGS=`echo "$OPT_FLAGS" | sed -e 's/[[:blank:]]\+/ /g'`
+# We're going to use the old long double format (double double) until RHEL10.
+# Only -static-lib{stdc++,gfortran}/libgcc would work with IEEE double.
+# Upstream also uses the old long double format, but Fedora uses the new
+# format. To make things clearer, --with-long-double-format=ibm is used
+# explicitly.
+CONFIGURE_OPTS="\
+ --prefix=%{_prefix} --mandir=%{_mandir} --infodir=%{_infodir} \
+ --with-bugurl=http://bugzilla.redhat.com/bugzilla \
+ --enable-shared --enable-threads=posix --enable-checking=release \
+%ifarch ppc64le
+ --enable-targets=powerpcle-linux \
+%endif
+%ifarch ppc64le %{mips} s390x
+ --disable-multilib \
+%else
+ --enable-multilib \
+%endif
+ --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions \
+ --enable-gnu-unique-object --enable-linker-build-id --with-gcc-major-version-only \
+ --enable-libstdcxx-backtrace \
+ --with-linker-hash-style=gnu \
+ --enable-plugin --enable-initfini-array \
+ --disable-libquadmath \
+ --disable-libsanitizer \
+ --disable-libvtv \
+ --disable-libgomp \
+ --disable-libitm \
+ --disable-libssp \
+ --disable-libatomic \
+ --disable-libcilkrts \
+ --without-isl \
+ --disable-libmpx \
+%if 0%{?fedora} >= 21 || 0%{?rhel} >= 7
+%if %{attr_ifunc}
+ --enable-gnu-indirect-function \
+%endif
+%endif
+%ifarch ppc ppc64 ppc64le ppc64p7
+ --enable-secureplt \
+%endif
+%ifarch sparc sparcv9 sparc64 ppc ppc64 ppc64le ppc64p7 s390 s390x alpha
+ --with-long-double-128 \
+%endif
+%ifarch ppc64le
+ --with-long-double-format=ibm \
+%endif
+%ifarch ppc ppc64 ppc64p7
+%if 0%{?rhel} >= 7
+ --with-cpu-32=power7 --with-tune-32=power7 --with-cpu-64=power7 --with-tune-64=power7 \
+%endif
+%if 0%{?rhel} == 6
+ --with-cpu-32=power4 --with-tune-32=power6 --with-cpu-64=power4 --with-tune-64=power6 \
+%endif
+%endif
+%ifarch ppc64le
+%if 0%{?rhel} == 9
+ --with-cpu-32=power9 --with-tune-32=power9 --with-cpu-64=power9 --with-tune-64=power9 \
+%else
+ --with-cpu-32=power8 --with-tune-32=power8 --with-cpu-64=power8 --with-tune-64=power8 \
+%endif
+%endif
+%ifarch ppc
+ --build=%{gcc_target_platform} --target=%{gcc_target_platform} --with-cpu=default32
+%endif
+%ifarch %{ix86} x86_64
+%if 0%{?rhel} >= 8
+ --enable-cet \
+%endif
+ --with-tune=generic \
+%endif
+%if 0%{?rhel} >= 7
+%ifarch %{ix86}
+ --with-arch=x86-64 \
+%endif
+%ifarch x86_64
+%if 0%{?rhel} > 8
+ --with-arch_64=x86-64-v2 \
+%endif
+ --with-arch_32=x86-64 \
+%endif
+%else
+%ifarch %{ix86}
+ --with-arch=i686 \
+%endif
+%ifarch x86_64
+ --with-arch_32=i686 \
+%endif
+%endif
+%ifarch s390 s390x
+%if 0%{?rhel} >= 7
+%if 0%{?rhel} > 7
+%if 0%{?rhel} > 8
+%if 0%{?rhel} == 9
+ --with-arch=z14 --with-tune=z15 \
+%else
+ --with-arch=z13 --with-tune=arch13 \
+%endif
+%else
+ --with-arch=z13 --with-tune=z14 \
+%endif
+%else
+ --with-arch=z196 --with-tune=zEC12 \
+%endif
+%else
+%if 0%{?fedora} >= 26
+ --with-arch=zEC12 --with-tune=z13 \
+%else
+ --with-arch=z9-109 --with-tune=z10 \
+%endif
+%endif
+ --enable-decimal-float \
+%endif
+ --build=%{gcc_target_platform} \
+ "
+
+CC="$CC" CXX="$CXX" CFLAGS="$OPT_FLAGS" \
+ CXXFLAGS="`echo " $OPT_FLAGS " | sed 's/ -Wall / /g;s/ -fexceptions / /g' \
+ | sed 's/ -Wformat-security / -Wformat -Wformat-security /'`" \
+ XCFLAGS="$OPT_FLAGS" TCFLAGS="$OPT_FLAGS" \
+ ../configure --enable-bootstrap \
+ --enable-languages=c,c++,lto \
+ $CONFIGURE_OPTS
+
+
+make %{?_smp_mflags} BOOT_CFLAGS="$OPT_FLAGS"
+
+%install
+rm -fr %{buildroot}
+
+%{?scl:PATH=%{_bindir}${PATH:+:${PATH}}}
+mkdir -p %{buildroot}%{_root_prefix}/%{_lib}
+cd obj-%{gcc_target_platform}
+./gcc/xgcc -v 2> %{buildroot}%{_root_prefix}/%{_lib}/README%{gcc_major}
+
+cp %{gcc_target_platform}/libstdc++-v3/src/.libs/libstdc++.so.6.0.* %{buildroot}%{_root_prefix}/%{_lib}/compat-sap-c++-%{gcc_version}.so
+cd %{buildroot}%{_root_prefix}/%{_lib}/
+ln -sf compat-sap-c++-%{gcc_version}.so %{buildroot}%{_root_prefix}/%{_lib}/compat-sap-c++-%{gcc_major}.so
+
+%check
+
+
+cd obj-%{gcc_target_platform}
+
+%{?scl:PATH=%{_bindir}${PATH:+:${PATH}}}
+
+
+# run the tests.
+LC_ALL=C make %{?_smp_mflags} -k check ALT_CC_UNDER_TEST=gcc ALT_CXX_UNDER_TEST=g++ \
+%if 0%{?fedora} >= 20 || 0%{?rhel} > 7
+ RUNTESTFLAGS="--target_board=unix/'{,-fstack-protector-strong}'" || :
+%else
+%ifnarch ppc ppc64 ppc64le s390x
+ RUNTESTFLAGS="--target_board=unix/'{,-fstack-protector}'" || :
+%else
+ || :
+%endif
+%endif
+( LC_ALL=C ../contrib/test_summary -t || : ) 2>&1 | sed -n '/^cat.*EOF/,/^EOF/{/^cat.*EOF/d;/^EOF/d;/^LAST_UPDATED:/d;p;}' > testresults
+rm -rf gcc/testsuite.prev
+mv gcc/testsuite{,.prev}
+rm -f gcc/site.exp
+LC_ALL=C make %{?_smp_mflags} -C gcc -k check-gcc check-g++ ALT_CC_UNDER_TEST=gcc ALT_CXX_UNDER_TEST=g++ RUNTESTFLAGS="--target_board=unix/'{,-fstack-protector}' compat.exp struct-layout-1.exp" || :
+mv gcc/testsuite/gcc/gcc.sum{,.sent}
+mv gcc/testsuite/g++/g++.sum{,.sent}
+( LC_ALL=C ../contrib/test_summary -o -t || : ) 2>&1 | sed -n '/^cat.*EOF/,/^EOF/{/^cat.*EOF/d;/^EOF/d;/^LAST_UPDATED:/d;p;}' > testresults2
+rm -rf gcc/testsuite.compat
+mv gcc/testsuite{,.compat}
+mv gcc/testsuite{.prev,}
+echo ====================TESTING=========================
+cat testresults
+echo ===`gcc --version | head -1` compatibility tests====
+cat testresults2
+echo ====================TESTING END=====================
+mkdir testlogs-%{_target_platform}-%{version}-%{release}
+for i in `find . -name \*.log | grep -F testsuite/ | grep -v 'config.log\|acats.*/tests/'`; do
+ ln $i testlogs-%{_target_platform}-%{version}-%{release}/ || :
+done
+for i in `find gcc/testsuite.compat -name \*.log | grep -v 'config.log\|acats.*/tests/'`; do
+ ln $i testlogs-%{_target_platform}-%{version}-%{release}/`basename $i`.compat || :
+done
+tar cf - testlogs-%{_target_platform}-%{version}-%{release} | bzip2 -9c \
+ | uuencode testlogs-%{_target_platform}.tar.bz2 || :
+rm -rf testlogs-%{_target_platform}-%{version}-%{release}
+
+
+%files
+%defattr(-,root,root,-)
+%dir %{_root_prefix}
+%dir %{_root_prefix}/%{_lib}
+%{_root_prefix}/%{_lib}/compat-sap-c++-%{gcc_version}.so
+%{_root_prefix}/%{_lib}/compat-sap-c++-%{gcc_major}.so
+%{_root_prefix}/%{_lib}/README%{gcc_major}
+
+%changelog
+* Mon May 16 2022 Marek Polacek 12.1.1-1
+- update to GCC 12 (#2070133)
+
+* Wed Jul 14 2021 Marek Polacek 11.1.1-6
+- update to GCC 11 (#1957766)
+
+* Wed May 19 2021 Marek Polacek 10.2.1-11
+- update from Fedora gcc 10.2.1-11 (#1933097)
+- apply gcc10-SIZE_MAX.patch
+
+* Wed Jul 29 2020 Marek Polacek 10.2.1-1
+- GCC 10.2 release
+- disable -flto in %%{optflags}, lto bootstrap will be enabled the GCC way
+ later
+- require MPFR Library version 3.1.0 (or later)
+
+* Thu Jun 4 2020 Marek Polacek 10.1.1-1
+- new package