commit
070a7fed67
@ -0,0 +1,8 @@
|
||||
7f4348418dc3efefd357b32a2b5c8010211ab284 SOURCES/doxygen-1.8.0.src.tar.gz
|
||||
54f8e112180f2cad6cf9459aab4681c7f157aca9 SOURCES/gcc-11.2.1-20220127.tar.xz
|
||||
db38c7b67f8eea9f2e5b8a48d219165b2fdab11f SOURCES/gmp-6.1.0.tar.bz2
|
||||
bbffc5a2b05e4f0c97e882f96c448504491dc4ed SOURCES/isl-0.18.tar.bz2
|
||||
b8be66396c726fdc36ebb0f692ed8a8cca3bcc66 SOURCES/mpc-1.0.3.tar.gz
|
||||
e3b0af77f18505184410d621fe0aae179e229dba SOURCES/mpfr-3.1.4.tar.bz2
|
||||
6ec33952e824e837fef0e829c93d39d6a507082f SOURCES/newlib-cygwin-50e2a63b04bdd018484605fbb954fd1bd5147fa0.tar.xz
|
||||
0e0c6f8d68ab0878f02287ac082c1077c831cd81 SOURCES/nvptx-tools-5f6f343a302d620b0868edab376c00b15741e39e.tar.xz
|
@ -0,0 +1,8 @@
|
||||
SOURCES/doxygen-1.8.0.src.tar.gz
|
||||
SOURCES/gcc-11.2.1-20220127.tar.xz
|
||||
SOURCES/gmp-6.1.0.tar.bz2
|
||||
SOURCES/isl-0.18.tar.bz2
|
||||
SOURCES/mpc-1.0.3.tar.gz
|
||||
SOURCES/mpfr-3.1.4.tar.bz2
|
||||
SOURCES/newlib-cygwin-50e2a63b04bdd018484605fbb954fd1bd5147fa0.tar.xz
|
||||
SOURCES/nvptx-tools-5f6f343a302d620b0868edab376c00b15741e39e.tar.xz
|
@ -0,0 +1,85 @@
|
||||
From 8a7f364afd86a4c4c2c747ae9cb4216fe992acc8 Mon Sep 17 00:00:00 2001
|
||||
From: David Malcolm <dmalcolm@redhat.com>
|
||||
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
|
@ -0,0 +1,46 @@
|
||||
From d7fae9f17479c44dae68483d457fc3fbb58c4b83 Mon Sep 17 00:00:00 2001
|
||||
From: David Malcolm <dmalcolm@redhat.com>
|
||||
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
|
||||
|
@ -0,0 +1,53 @@
|
||||
From 3ede89bd19328c26bcd881b873cf4a766ae0da3a Mon Sep 17 00:00:00 2001
|
||||
From: David Malcolm <dmalcolm@redhat.com>
|
||||
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<char>::sys_open(int, std::_Ios_Openmode)@@GLIBCXX_3.4
|
||||
2895: 000000000007c730 95 FUNC GLOBAL DEFAULT 12 std::__basic_file<char>::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<char> 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<char> buf1(in1, std::ios::in, BUFSIZ);
|
||||
int c = buf1.sgetc();
|
||||
- VERIFY( c == std::char_traits<char>::eof() ); // PR libstdc++/81751
|
||||
|
||||
std::fflush(out);
|
||||
FILE* in2 = std::fopen("81751.txt", "r");
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,118 @@
|
||||
From 59388ee3dac5c737086ed1f83f552a44481a2213 Mon Sep 17 00:00:00 2001
|
||||
From: David Malcolm <dmalcolm@redhat.com>
|
||||
Date: Tue, 31 Aug 2021 16:08:57 -0400
|
||||
Subject: [PATCH 06/17] Don't assume has_facet<codecvt_c16> 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<codecvt_c16> 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<char16_t, char8_t, mbstate_t> codecvt_c16;
|
||||
locale loc_c = locale::classic();
|
||||
- VERIFY(has_facet<codecvt_c16>(loc_c));
|
||||
+ if (!has_facet<codecvt_c16>(loc_c))
|
||||
+ return;
|
||||
const codecvt_c16* const cvt = &use_facet<codecvt_c16>(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<char16_t, char, mbstate_t> codecvt_c16;
|
||||
locale loc_c = locale::classic();
|
||||
- VERIFY(has_facet<codecvt_c16>(loc_c));
|
||||
+ if (!has_facet<codecvt_c16>(loc_c))
|
||||
+ return;
|
||||
const codecvt_c16* const cvt = &use_facet<codecvt_c16>(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<char32_t, char8_t, mbstate_t> codecvt_c32;
|
||||
locale loc_c = locale::classic();
|
||||
- VERIFY(has_facet<codecvt_c32>(loc_c));
|
||||
+ if (!has_facet<codecvt_c32>(loc_c))
|
||||
+ return;
|
||||
const codecvt_c32* const cvt = &use_facet<codecvt_c32>(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<char32_t, char, mbstate_t> codecvt_c32;
|
||||
locale loc_c = locale::classic();
|
||||
- VERIFY(has_facet<codecvt_c32>(loc_c));
|
||||
+ if (!has_facet<codecvt_c32>(loc_c))
|
||||
+ return;
|
||||
const codecvt_c32* const cvt = &use_facet<codecvt_c32>(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<C, char8_t, std::mbstate_t>;
|
||||
+ if (!std::has_facet<test_type>(std::locale::classic()))
|
||||
+ return;
|
||||
const test_type& cvt = std::use_facet<test_type>(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<C, char, std::mbstate_t>;
|
||||
+ if (!std::has_facet<test_type>(std::locale::classic()))
|
||||
+ return;
|
||||
const test_type& cvt = std::use_facet<test_type>(std::locale::classic());
|
||||
auto from_end = from + len;
|
||||
auto from_next = from;
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,42 @@
|
||||
From 16694079a3f415f5e5683b0afe6978810ac259b1 Mon Sep 17 00:00:00 2001
|
||||
From: David Malcolm <dmalcolm@redhat.com>
|
||||
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
|
||||
|
@ -0,0 +1,36 @@
|
||||
From 87e2a4f28b444f376ebe15f38e2743eb952ff355 Mon Sep 17 00:00:00 2001
|
||||
From: David Malcolm <dmalcolm@redhat.com>
|
||||
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<w_codecvt>(loc13) );
|
||||
#endif
|
||||
#ifdef _GLIBCXX_USE_C99_STDINT_TR1
|
||||
- VERIFY( has_facet<u16_codecvt>(loc13) );
|
||||
- VERIFY( has_facet<u32_codecvt>(loc13) );
|
||||
+ (void)( has_facet<u16_codecvt>(loc13) );
|
||||
+ (void)( has_facet<u32_codecvt>(loc13) );
|
||||
#ifdef _GLIBCXX_USE_CHAR8_T
|
||||
VERIFY( has_facet<u16u8_codecvt>(loc13) );
|
||||
VERIFY( has_facet<u32u8_codecvt>(loc13) );
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,30 @@
|
||||
From d1555ffdd9b4fa6f3ceaa166bbfee0b3b9973ecf Mon Sep 17 00:00:00 2001
|
||||
From: David Malcolm <dmalcolm@redhat.com>
|
||||
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<wchar_t, std::char_traits<wchar_t> >::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
|
||||
|
@ -0,0 +1,117 @@
|
||||
From b6989e3a4acda2d75612f3f3847dbea4245ff536 Mon Sep 17 00:00:00 2001
|
||||
From: David Malcolm <dmalcolm@redhat.com>
|
||||
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
|
||||
|
@ -0,0 +1,28 @@
|
||||
From c3910bb945aba02e0c06dec041da9f1f148b0df1 Mon Sep 17 00:00:00 2001
|
||||
From: David Malcolm <dmalcolm@redhat.com>
|
||||
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
|
||||
|
@ -0,0 +1,86 @@
|
||||
From c922a56d4461c9e4ca2af07ecccb3626b99a35ae Mon Sep 17 00:00:00 2001
|
||||
From: David Malcolm <dmalcolm@redhat.com>
|
||||
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
|
||||
|
@ -0,0 +1,84 @@
|
||||
From fa770c25013df537c41d0929c4202b0a774a6a75 Mon Sep 17 00:00:00 2001
|
||||
From: David Malcolm <dmalcolm@redhat.com>
|
||||
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<int>::iterator It;
|
||||
It it = It();
|
||||
+ // Fixed upstream in GCC 11
|
||||
+#if __LIBSTDCXX_SO_VERSION >= 11
|
||||
VERIFY( it == it );
|
||||
+#endif
|
||||
|
||||
typedef typename __gnu_debug::deque<int>::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<int, int>::iterator it{};
|
||||
+ // Fixed upstream in GCC 11
|
||||
+#if __LIBSTDCXX_SO_VERSION >= 11
|
||||
VERIFY( it == it );
|
||||
+#endif
|
||||
|
||||
__gnu_debug::unordered_map<int, int>::const_iterator cit{};
|
||||
+ // Fixed upstream in GCC 11
|
||||
+#if __LIBSTDCXX_SO_VERSION >= 11
|
||||
VERIFY( cit == cit );
|
||||
+#endif
|
||||
|
||||
__gnu_debug::unordered_map<int, int>::local_iterator lit{};
|
||||
+ // Fixed upstream in GCC 11
|
||||
+#if __LIBSTDCXX_SO_VERSION >= 11
|
||||
VERIFY( lit == lit );
|
||||
+#endif
|
||||
|
||||
__gnu_debug::unordered_map<int, int>::const_local_iterator clit{};
|
||||
+ // Fixed upstream in GCC 11
|
||||
+#if __LIBSTDCXX_SO_VERSION >= 11
|
||||
VERIFY( clit == clit );
|
||||
+#endif
|
||||
}
|
||||
|
||||
int main()
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,41 @@
|
||||
From 992665eab6c48d6a4819f42509346d24b277485d Mon Sep 17 00:00:00 2001
|
||||
From: David Malcolm <dmalcolm@redhat.com>
|
||||
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
|
||||
|
@ -0,0 +1,102 @@
|
||||
From db8f53df0be1daeda3159c1413549ff40696c710 Mon Sep 17 00:00:00 2001
|
||||
From: David Malcolm <dmalcolm@redhat.com>
|
||||
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<int> 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<int> v { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 };
|
||||
|
||||
std::unordered_set<int> 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<int> fl { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 };
|
||||
|
||||
std::unordered_set<int> 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
|
||||
|
@ -0,0 +1,33 @@
|
||||
From 102adc148612b50a4e3f12a88871ddc47bfb469e Mon Sep 17 00:00:00 2001
|
||||
From: David Malcolm <dmalcolm@redhat.com>
|
||||
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<typename _USet>
|
||||
|
||||
us.insert(nb_insert);
|
||||
|
||||
+ // Fixed upstream in GCC 7
|
||||
+#if __LIBSTDCXX_SO_VERSION >= 7
|
||||
VERIFY( us.bucket_count() == bkts );
|
||||
+#endif
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,95 @@
|
||||
diff -up doxygen-1.7.1/addon/doxywizard/Makefile.in.config doxygen-1.7.1/addon/doxywizard/Makefile.in
|
||||
--- doxygen-1.7.1/addon/doxywizard/Makefile.in.config 2010-05-23 16:51:31.000000000 +0200
|
||||
+++ doxygen-1.7.1/addon/doxywizard/Makefile.in 2010-07-19 13:38:33.000000000 +0200
|
||||
@@ -10,8 +10,6 @@
|
||||
# See the GNU General Public License for more details.
|
||||
#
|
||||
|
||||
-QMAKE=qmake $(MKSPECS)
|
||||
-
|
||||
all: Makefile.doxywizard
|
||||
$(MAKE) -f Makefile.doxywizard
|
||||
|
||||
@@ -29,11 +27,11 @@ distclean: Makefile.doxywizard
|
||||
$(RM) Makefile.doxywizard
|
||||
|
||||
install:
|
||||
- $(INSTTOOL) -d $(INSTALL)/bin
|
||||
- $(INSTTOOL) -m 755 ../../bin/doxywizard $(INSTALL)/bin
|
||||
- $(INSTTOOL) -d $(INSTALL)/$(MAN1DIR)
|
||||
+ $(INSTTOOL) -d $(DESTDIR)$(INSTALL)/bin
|
||||
+ $(INSTTOOL) -m 755 ../../bin/doxywizard $(DESTDIR)$(INSTALL)/bin
|
||||
+ $(INSTTOOL) -d $(DESTDIR)$(INSTALL)/$(MAN1DIR)
|
||||
cat ../../doc/doxywizard.1 | sed -e "s/DATE/$(DATE)/g" -e "s/VERSION/$(VERSION)/g" > doxywizard.1
|
||||
- $(INSTTOOL) -m 644 doxywizard.1 $(INSTALL)/$(MAN1DIR)/doxywizard.1
|
||||
+ $(INSTTOOL) -m 644 doxywizard.1 $(DESTDIR)$(INSTALL)/$(MAN1DIR)/doxywizard.1
|
||||
rm doxywizard.1
|
||||
|
||||
FORCE:
|
||||
diff -up doxygen-1.7.1/configure.config doxygen-1.7.1/configure
|
||||
--- doxygen-1.7.1/configure.config 2010-06-25 11:46:38.000000000 +0200
|
||||
+++ doxygen-1.7.1/configure 2010-07-19 12:03:53.000000000 +0200
|
||||
@@ -268,9 +268,10 @@ if test "$f_wizard" = YES; then
|
||||
if test -z "$QTDIR"; then
|
||||
echo " QTDIR environment variable not set!"
|
||||
echo -n " Checking for Qt..."
|
||||
- for d in /usr/{lib,share,qt}/{qt-4,qt4,qt,qt*,4} /usr; do
|
||||
+ for d in /usr/{lib64,lib,share,qt}/{qt-4,qt4,qt,qt*,4} /usr; do
|
||||
if test -x "$d/bin/qmake"; then
|
||||
QTDIR=$d
|
||||
+ QMAKE=$d/bin/qmake
|
||||
fi
|
||||
done
|
||||
else
|
||||
@@ -485,6 +486,8 @@ INSTTOOL = $f_insttool
|
||||
DOXYDOCS = ..
|
||||
DOCDIR = $f_docdir
|
||||
QTDIR = $QTDIR
|
||||
+QMAKE = $QMAKE
|
||||
+MAN1DIR = share/man/man1
|
||||
EOF
|
||||
|
||||
if test "$f_dot" != NO; then
|
||||
diff -up doxygen-1.7.1/Makefile.in.config doxygen-1.7.1/Makefile.in
|
||||
--- doxygen-1.7.1/Makefile.in.config 2009-08-20 21:41:13.000000000 +0200
|
||||
+++ doxygen-1.7.1/Makefile.in 2010-07-19 12:03:53.000000000 +0200
|
||||
@@ -44,8 +44,6 @@ distclean: clean
|
||||
|
||||
DATE=$(shell date "+%B %Y")
|
||||
|
||||
-MAN1DIR = man/man1
|
||||
-
|
||||
install: doxywizard_install
|
||||
$(INSTTOOL) -d $(DESTDIR)/$(INSTALL)/bin
|
||||
$(INSTTOOL) -m 755 bin/doxygen $(DESTDIR)/$(INSTALL)/bin
|
||||
diff -up doxygen-1.7.1/tmake/lib/linux-g++/tmake.conf.config doxygen-1.7.1/tmake/lib/linux-g++/tmake.conf
|
||||
--- doxygen-1.7.1/tmake/lib/linux-g++/tmake.conf.config 2008-12-06 14:16:20.000000000 +0100
|
||||
+++ doxygen-1.7.1/tmake/lib/linux-g++/tmake.conf 2010-07-19 12:03:53.000000000 +0200
|
||||
@@ -11,7 +11,7 @@ TMAKE_CC = gcc
|
||||
TMAKE_CFLAGS = -pipe
|
||||
TMAKE_CFLAGS_WARN_ON = -Wall -W -fno-exceptions
|
||||
TMAKE_CFLAGS_WARN_OFF =
|
||||
-TMAKE_CFLAGS_RELEASE = -O2
|
||||
+TMAKE_CFLAGS_RELEASE = $(RPM_OPT_FLAGS)
|
||||
TMAKE_CFLAGS_DEBUG = -g
|
||||
TMAKE_CFLAGS_SHLIB = -fPIC
|
||||
TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
|
||||
@@ -27,12 +27,12 @@ TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YAC
|
||||
|
||||
TMAKE_INCDIR =
|
||||
TMAKE_LIBDIR =
|
||||
-TMAKE_INCDIR_X11 = /usr/X11R6/include
|
||||
-TMAKE_LIBDIR_X11 = /usr/X11R6/lib
|
||||
-TMAKE_INCDIR_QT = $(QTDIR)/include
|
||||
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
|
||||
-TMAKE_INCDIR_OPENGL = /usr/X11R6/include
|
||||
-TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
|
||||
+TMAKE_INCDIR_X11 =
|
||||
+TMAKE_LIBDIR_X11 =
|
||||
+TMAKE_INCDIR_QT =
|
||||
+TMAKE_LIBDIR_QT =
|
||||
+TMAKE_INCDIR_OPENGL =
|
||||
+TMAKE_LIBDIR_OPENGL =
|
||||
|
||||
TMAKE_LINK = g++
|
||||
TMAKE_LINK_SHLIB = g++
|
@ -0,0 +1,63 @@
|
||||
diff -up doxygen-1.7.5/src/configoptions.cpp.timestamp doxygen-1.7.5/src/configoptions.cpp
|
||||
--- doxygen-1.7.5/src/configoptions.cpp.timestamp 2011-08-03 15:54:50.000000000 +0200
|
||||
+++ doxygen-1.7.5/src/configoptions.cpp 2011-08-23 12:55:56.000000000 +0200
|
||||
@@ -1173,6 +1173,14 @@ void addConfigOptions(Config *cfg)
|
||||
cs->setWidgetType(ConfigString::File);
|
||||
cs->addDependency("GENERATE_HTML");
|
||||
//----
|
||||
+ cb = cfg->addBool(
|
||||
+ "HTML_TIMESTAMP",
|
||||
+ "If the HTML_TIMESTAMP tag is set to YES then the generated HTML\n"
|
||||
+ "documentation will contain the timesstamp.",
|
||||
+ FALSE
|
||||
+ );
|
||||
+ cb->addDependency("GENERATE_HTML");
|
||||
+ //----
|
||||
cs = cfg->addString(
|
||||
"HTML_STYLESHEET",
|
||||
"The HTML_STYLESHEET tag can be used to specify a user-defined cascading\n"
|
||||
diff -up doxygen-1.7.5/src/config.xml.timestamp doxygen-1.7.5/src/config.xml
|
||||
--- doxygen-1.7.5/src/config.xml.timestamp 2011-08-03 15:54:48.000000000 +0200
|
||||
+++ doxygen-1.7.5/src/config.xml 2011-08-23 12:55:56.000000000 +0200
|
||||
@@ -819,6 +819,11 @@ The HTML_FOOTER tag can be used to speci
|
||||
each generated HTML page. If it is left blank doxygen will generate a
|
||||
standard footer.
|
||||
' defval='' depends='GENERATE_HTML'/>
|
||||
+ <option type='bool' id='HTML_TIMESTAMP' docs='
|
||||
+If the HTML_TIMESTAMP tag is set to YES then the generated HTML
|
||||
+documentation will contain the timesstamp.
|
||||
+' defval='' depends='GENERATE_HTML'/>
|
||||
+
|
||||
<option type='string' id='HTML_STYLESHEET' format='file' docs='
|
||||
The HTML_STYLESHEET tag can be used to specify a user-defined cascading
|
||||
style sheet that is used by each HTML page. It can be used to
|
||||
diff -up doxygen-1.7.5/src/htmlgen.cpp.timestamp doxygen-1.7.5/src/htmlgen.cpp
|
||||
--- doxygen-1.7.5/src/htmlgen.cpp.timestamp 2011-08-01 22:10:17.000000000 +0200
|
||||
+++ doxygen-1.7.5/src/htmlgen.cpp 2011-08-23 13:01:16.000000000 +0200
|
||||
@@ -88,7 +88,7 @@ static const char svgpan_script[]=
|
||||
|
||||
static QCString g_header;
|
||||
static QCString g_footer;
|
||||
-
|
||||
+static bool timestamp=false;
|
||||
//------------------------- Pictures for the Tabs ------------------------
|
||||
|
||||
// active
|
||||
@@ -1072,6 +1072,8 @@ void HtmlGenerator::init()
|
||||
{
|
||||
g_footer = defaultHtmlFooter;
|
||||
}
|
||||
+ if (Config_getBool("HTML_TIMESTAMP"))
|
||||
+ timestamp=true;
|
||||
createSubDirs(d);
|
||||
|
||||
QCString fileName=dname+"/tabs.css";
|
||||
@@ -1285,7 +1287,7 @@ QCString HtmlGenerator::writeLogoAsStrin
|
||||
if (timeStamp)
|
||||
{
|
||||
result += theTranslator->trGeneratedAt(
|
||||
- dateToString(TRUE),
|
||||
+ dateToString(timestamp),
|
||||
Config_getString("PROJECT_NAME")
|
||||
);
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
--- doxygen-1.8.0/src/configgen.py 2012-01-29 10:12:54.000000000 -0500
|
||||
+++ doxygen-1.8.0/src/configgen.py 2012-08-07 17:38:54.751696536 -0400
|
||||
@@ -34,8 +34,10 @@
|
||||
if type=='bool':
|
||||
if len(adefval)>0:
|
||||
enabled = adefval
|
||||
- else:
|
||||
- enabled = "TRUE" if defval=='1' else "FALSE"
|
||||
+ elif defval=='1':
|
||||
+ enabled = "TRUE"
|
||||
+ else:
|
||||
+ enabled = "FALSE"
|
||||
print " cb = cfg->addBool("
|
||||
print " \"%s\"," % (name)
|
||||
print " \"%s\"," % (docC)
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,27 @@
|
||||
2017-02-25 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* 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
|
||||
@@ -480,7 +480,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 -Wno-error=format-diag $wf_opt])),
|
||||
--- gcc/configure.jj 2017-02-13 12:20:52.000000000 +0100
|
||||
+++ gcc/configure 2017-02-25 12:42:50.041946391 +0100
|
||||
@@ -6647,7 +6647,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
|
@ -0,0 +1,49 @@
|
||||
--- gcc/testsuite/g++.dg/compat/struct-layout-1_generate.c.jj 2011-01-03 06:50:42.000000000 -0500
|
||||
+++ gcc/testsuite/g++.dg/compat/struct-layout-1_generate.c 2011-02-18 06:28:53.858200077 -0500
|
||||
@@ -1501,6 +1501,8 @@ generate_random_tests (enum FEATURE feat
|
||||
int i, r;
|
||||
if (len > 'z' - 'a' + 1)
|
||||
abort ();
|
||||
+ if (getenv ("ALT_CXX_UNDER_TEST") != NULL)
|
||||
+ features &= ~FEATURE_VECTOR;
|
||||
memset (e, 0, sizeof (e));
|
||||
r = generate_random ();
|
||||
if ((r & 7) == 0 && !cxx14_vs_cxx17)
|
||||
--- gcc/testsuite/g++.dg/compat/compat.exp.jj 2011-01-03 06:50:42.000000000 -0500
|
||||
+++ gcc/testsuite/g++.dg/compat/compat.exp 2011-02-18 06:30:54.248200398 -0500
|
||||
@@ -116,7 +116,12 @@ if [info exists ALT_CXX_UNDER_TEST] then
|
||||
}
|
||||
|
||||
# Main loop.
|
||||
-foreach src [lsort [find $srcdir/$subdir *_main.C]] {
|
||||
+set tests [lsort [find $srcdir/$subdir *_main.C]]
|
||||
+if { $use_alt != 0 } then {
|
||||
+ set tests [prune $tests $srcdir/$subdir/decimal/*]
|
||||
+}
|
||||
+
|
||||
+foreach src $tests {
|
||||
# If we're only testing specific files and this isn't one of them, skip it.
|
||||
if ![runtest_file_p $runtests $src] then {
|
||||
continue
|
||||
--- gcc/testsuite/gcc.dg/compat/struct-layout-1_generate.c.jj 2011-01-03 06:49:58.000000000 -0500
|
||||
+++ gcc/testsuite/gcc.dg/compat/struct-layout-1_generate.c 2011-02-18 06:27:54.922262671 -0500
|
||||
@@ -1912,6 +1912,8 @@ generate_random_tests (enum FEATURE feat
|
||||
int i, r;
|
||||
if (len > 'z' - 'a' + 1)
|
||||
abort ();
|
||||
+ if (getenv ("ALT_CC_UNDER_TEST") != NULL)
|
||||
+ features &= ~FEATURE_VECTOR;
|
||||
memset (e, 0, sizeof (e));
|
||||
r = generate_random ();
|
||||
if ((r & 7) == 0)
|
||||
--- gcc/testsuite/lib/c-compat.exp.jj 2011-01-03 06:48:38.000000000 -0500
|
||||
+++ gcc/testsuite/lib/c-compat.exp 2011-02-18 06:38:19.124265008 -0500
|
||||
@@ -75,7 +75,7 @@ proc compat_setup_dfp { } {
|
||||
# If there is an alternate compiler, does it support decimal float types?
|
||||
if { $compat_have_dfp == 1 && $compat_use_alt == 1 && $compat_same_alt == 0 } {
|
||||
compat-use-alt-compiler
|
||||
- set compat_have_dfp [check_effective_target_dfprt_nocache]
|
||||
+ set compat_have_dfp 0
|
||||
compat-use-tst-compiler
|
||||
verbose "compat_have_dfp for alt compiler: $compat_have_dfp" 2
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
2019-01-17 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* 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)
|
@ -0,0 +1,32 @@
|
||||
commit 14c7757e9b751781360737f53b71f851fc356d3d
|
||||
Author: Jeff Law <jeffreyalaw@gmail.com>
|
||||
Date: Fri Oct 29 11:30:15 2021 -0400
|
||||
|
||||
Avoid overly-greedy match in dejagnu regexp.
|
||||
|
||||
Occasionally I've been seeing failures with the multi-line diagnostics. It's never been clear what's causing the spurious failures, though I have long suspected a greedy regexp match.
|
||||
|
||||
It happened again yesterday with a local change that in no way should affect diagnostics, so I finally went searching and found that sure enough the multi-line diagnostics had a ".*" in their regexp. According to the comments, the .* is primarily to catch any dg directives that may appear -- ie it should eat to EOL, but not multiple lines. But a .* can indeed match a newline and cause it to eat multiple lines.
|
||||
|
||||
The fix is simple. [^\r\n]* will eat to EOL, but not further.
|
||||
|
||||
Regression tested on x86_64 and on our internal target.
|
||||
|
||||
gcc/testsuite
|
||||
|
||||
* lib/multiline.exp (_build_multiline_regex): Use a better
|
||||
regexp than .* to match up to EOL.
|
||||
|
||||
diff --git a/gcc/testsuite/lib/multiline.exp b/gcc/testsuite/lib/multiline.exp
|
||||
index 0e151b6d222..86387f8209b 100644
|
||||
--- a/gcc/testsuite/lib/multiline.exp
|
||||
+++ b/gcc/testsuite/lib/multiline.exp
|
||||
@@ -331,7 +331,7 @@ proc _build_multiline_regex { multiline index } {
|
||||
# Support arbitrary followup text on each non-empty line,
|
||||
# to deal with comments containing containing DejaGnu
|
||||
# directives.
|
||||
- append rexp ".*"
|
||||
+ append rexp "\[^\\n\\r\]*"
|
||||
}
|
||||
}
|
||||
append rexp "\n"
|
@ -0,0 +1,83 @@
|
||||
diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-decompose-ice-1.c b/gcc/testsuite/c-c++-common/goacc/kernels-decompose-ice-1.c
|
||||
index 8c3884bdc00..141f089d4f8 100644
|
||||
--- a/gcc/testsuite/c-c++-common/goacc/kernels-decompose-ice-1.c
|
||||
+++ b/gcc/testsuite/c-c++-common/goacc/kernels-decompose-ice-1.c
|
||||
@@ -1,7 +1,7 @@
|
||||
/* Test OpenACC 'kernels' construct decomposition. */
|
||||
|
||||
/* { dg-additional-options "-fopt-info-omp-all" } */
|
||||
-/* { dg-additional-options "-fchecking --param=openacc-kernels=decompose" } */
|
||||
+/* { dg-additional-options "-fno-report-bug -fchecking --param=openacc-kernels=decompose" } */
|
||||
/* { dg-ice "TODO" }
|
||||
{ dg-prune-output "during GIMPLE pass: omplower" } */
|
||||
|
||||
diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-decompose-ice-2.c b/gcc/testsuite/c-c++-common/goacc/kernels-decompose-ice-2.c
|
||||
index 8bf60a9a509..a07e0a42116 100644
|
||||
--- a/gcc/testsuite/c-c++-common/goacc/kernels-decompose-ice-2.c
|
||||
+++ b/gcc/testsuite/c-c++-common/goacc/kernels-decompose-ice-2.c
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Test OpenACC 'kernels' construct decomposition. */
|
||||
|
||||
-/* { dg-additional-options "-fchecking --param=openacc-kernels=decompose" } */
|
||||
+/* { dg-additional-options "-fno-report-bug -fchecking --param=openacc-kernels=decompose" } */
|
||||
/* { dg-ice "TODO" }
|
||||
{ dg-prune-output "during GIMPLE pass: omplower" } */
|
||||
|
||||
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-52830.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-52830.C
|
||||
index eae0d8c377b..ed37f95e865 100644
|
||||
--- a/gcc/testsuite/g++.dg/cpp0x/constexpr-52830.C
|
||||
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-52830.C
|
||||
@@ -1,6 +1,6 @@
|
||||
// PR c++/52830
|
||||
// { dg-do compile { target c++11 } }
|
||||
-// { dg-additional-options "-fchecking" }
|
||||
+// { dg-additional-options "-fchecking -fno-report-bug" }
|
||||
// { dg-ice "comptypes" }
|
||||
|
||||
template<bool b> struct eif { typedef void type; };
|
||||
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<typename...Ts> 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 <int N>
|
||||
diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/declare-vla-kernels-decompose-ice-1.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/declare-vla-kernels-decompose-ice-1.c
|
||||
index 0777b612b63..53abbe2db83 100644
|
||||
--- a/libgomp/testsuite/libgomp.oacc-c-c++-common/declare-vla-kernels-decompose-ice-1.c
|
||||
+++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/declare-vla-kernels-decompose-ice-1.c
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* { dg-additional-options "--param=openacc-kernels=decompose" } */
|
||||
+/* { dg-additional-options "--param=openacc-kernels=decompose -fno-report-bug" } */
|
||||
/* Hopefully, this is the same issue as '../../../gcc/testsuite/c-c++-common/goacc/kernels-decompose-ice-1.c'.
|
||||
{ dg-ice "TODO" }
|
||||
TODO { dg-prune-output "during GIMPLE pass: omplower" }
|
@ -0,0 +1,116 @@
|
||||
2019-01-17 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* gcc.c (offload_targets_default): New variable.
|
||||
(process_command): Set it if -foffload is defaulted.
|
||||
(driver::maybe_putenv_OFFLOAD_TARGETS): Add OFFLOAD_TARGET_DEFAULT=1
|
||||
into environment if -foffload has been defaulted.
|
||||
* lto-wrapper.c (OFFLOAD_TARGET_DEFAULT_ENV): Define.
|
||||
(compile_offload_image): If OFFLOAD_TARGET_DEFAULT
|
||||
is in the environment, don't fail if corresponding mkoffload
|
||||
can't be found.
|
||||
(compile_images_for_offload_targets): Likewise. Free and clear
|
||||
offload_names if no valid offload is found.
|
||||
libgomp/
|
||||
* target.c (gomp_load_plugin_for_device): If a plugin can't be
|
||||
dlopened, assume it has no devices silently.
|
||||
|
||||
--- gcc/gcc.c.jj 2017-01-17 10:28:40.000000000 +0100
|
||||
+++ gcc/gcc.c 2017-01-20 16:26:29.649962902 +0100
|
||||
@@ -319,6 +319,10 @@ static const char *spec_host_machine = D
|
||||
|
||||
static char *offload_targets = NULL;
|
||||
|
||||
+/* Set to true if -foffload has not been used and offload_targets
|
||||
+ is set to the configured in default. */
|
||||
+static bool offload_targets_default;
|
||||
+
|
||||
/* Nonzero if cross-compiling.
|
||||
When -b is used, the value comes from the `specs' file. */
|
||||
|
||||
@@ -4828,7 +4832,10 @@ process_command (unsigned int decoded_op
|
||||
/* If the user didn't specify any, default to all configured offload
|
||||
targets. */
|
||||
if (ENABLE_OFFLOADING && offload_targets == NULL)
|
||||
- handle_foffload_option (OFFLOAD_TARGETS);
|
||||
+ {
|
||||
+ handle_foffload_option (OFFLOAD_TARGETS);
|
||||
+ offload_targets_default = true;
|
||||
+ }
|
||||
|
||||
/* Handle -gtoggle as it would later in toplev.c:process_options to
|
||||
make the debug-level-gt spec function work as expected. */
|
||||
@@ -8494,6 +8501,8 @@ driver::maybe_putenv_OFFLOAD_TARGETS ()
|
||||
obstack_grow (&collect_obstack, offload_targets,
|
||||
strlen (offload_targets) + 1);
|
||||
xputenv (XOBFINISH (&collect_obstack, char *));
|
||||
+ if (offload_targets_default)
|
||||
+ xputenv ("OFFLOAD_TARGET_DEFAULT=1");
|
||||
}
|
||||
|
||||
free (offload_targets);
|
||||
--- gcc/lto-wrapper.c.jj 2017-01-01 12:45:34.000000000 +0100
|
||||
+++ gcc/lto-wrapper.c 2017-01-20 16:34:18.294016997 +0100
|
||||
@@ -52,6 +52,7 @@ along with GCC; see the file COPYING3.
|
||||
/* Environment variable, used for passing the names of offload targets from GCC
|
||||
driver to lto-wrapper. */
|
||||
#define OFFLOAD_TARGET_NAMES_ENV "OFFLOAD_TARGET_NAMES"
|
||||
+#define OFFLOAD_TARGET_DEFAULT_ENV "OFFLOAD_TARGET_DEFAULT"
|
||||
|
||||
/* By default there is no special suffix for target executables. */
|
||||
#ifdef TARGET_EXECUTABLE_SUFFIX
|
||||
@@ -906,6 +907,12 @@ compile_offload_image (const char *targe
|
||||
break;
|
||||
}
|
||||
|
||||
+ if (!compiler && getenv (OFFLOAD_TARGET_DEFAULT_ENV))
|
||||
+ {
|
||||
+ free_array_of_ptrs ((void **) paths, n_paths);
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
if (!compiler)
|
||||
fatal_error (input_location,
|
||||
"could not find %s in %s (consider using %<-B%>)",
|
||||
@@ -975,6 +982,7 @@ compile_images_for_offload_targets (unsi
|
||||
if (!target_names)
|
||||
return;
|
||||
unsigned num_targets = parse_env_var (target_names, &names, NULL);
|
||||
+ int next_name_entry = 0;
|
||||
|
||||
const char *compiler_path = getenv ("COMPILER_PATH");
|
||||
if (!compiler_path)
|
||||
@@ -985,13 +993,19 @@ compile_images_for_offload_targets (unsi
|
||||
offload_names = XCNEWVEC (char *, num_targets + 1);
|
||||
for (unsigned i = 0; i < num_targets; i++)
|
||||
{
|
||||
- offload_names[i]
|
||||
+ offload_names[next_name_entry]
|
||||
= compile_offload_image (names[i], compiler_path, in_argc, in_argv,
|
||||
compiler_opts, compiler_opt_count,
|
||||
linker_opts, linker_opt_count);
|
||||
- if (!offload_names[i])
|
||||
- fatal_error (input_location,
|
||||
- "problem with building target image for %s", names[i]);
|
||||
+ if (!offload_names[next_name_entry])
|
||||
+ continue;
|
||||
+ next_name_entry++;
|
||||
+ }
|
||||
+
|
||||
+ if (next_name_entry == 0)
|
||||
+ {
|
||||
+ free (offload_names);
|
||||
+ offload_names = NULL;
|
||||
}
|
||||
|
||||
out:
|
||||
--- libgomp/target.c.jj 2017-01-01 12:45:52.000000000 +0100
|
||||
+++ libgomp/target.c 2017-01-20 20:12:13.756710875 +0100
|
||||
@@ -2356,7 +2356,7 @@ gomp_load_plugin_for_device (struct gomp
|
||||
|
||||
void *plugin_handle = dlopen (plugin_name, RTLD_LAZY);
|
||||
if (!plugin_handle)
|
||||
- goto dl_fail;
|
||||
+ return 0;
|
||||
|
||||
/* Check if all required functions are available in the plugin and store
|
||||
their handlers. None of the symbols can legitimately be NULL,
|
@ -0,0 +1,181 @@
|
||||
From 7001d522d0273658d9e1fb12ca104d56bfcae34d Mon Sep 17 00:00:00 2001
|
||||
From: Mark Eggleston <markeggleston@gcc.gnu.org>
|
||||
Date: Fri, 22 Jan 2021 15:06:08 +0000
|
||||
Subject: [PATCH 10/10] Fill in missing array dimensions using the lower bound
|
||||
|
||||
Use -fdec-add-missing-indexes to enable feature. Also enabled by fdec.
|
||||
---
|
||||
gcc/fortran/lang.opt | 8 ++++++++
|
||||
gcc/fortran/options.c | 1 +
|
||||
gcc/fortran/resolve.c | 24 ++++++++++++++++++++++++
|
||||
gcc/testsuite/gfortran.dg/array_6.f90 | 23 +++++++++++++++++++++++
|
||||
gcc/testsuite/gfortran.dg/array_7.f90 | 23 +++++++++++++++++++++++
|
||||
gcc/testsuite/gfortran.dg/array_8.f90 | 23 +++++++++++++++++++++++
|
||||
6 files changed, 102 insertions(+)
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/array_6.f90
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/array_7.f90
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/array_8.f90
|
||||
|
||||
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
|
||||
index 019c798cf09..f27de88ea3f 100644
|
||||
--- a/gcc/fortran/lang.opt
|
||||
+++ b/gcc/fortran/lang.opt
|
||||
@@ -281,6 +281,10 @@ Wmissing-include-dirs
|
||||
Fortran
|
||||
; Documented in C/C++
|
||||
|
||||
+Wmissing-index
|
||||
+Fortran Var(warn_missing_index) Warning LangEnabledBy(Fortran,Wall)
|
||||
+Warn that the lower bound of a missing index will be used.
|
||||
+
|
||||
Wuse-without-only
|
||||
Fortran Var(warn_use_without_only) Warning
|
||||
Warn about USE statements that have no ONLY qualifier.
|
||||
@@ -460,6 +464,10 @@ fdec
|
||||
Fortran Var(flag_dec)
|
||||
Enable all DEC language extensions.
|
||||
|
||||
+fdec-add-missing-indexes
|
||||
+Fortran Var(flag_dec_add_missing_indexes)
|
||||
+Enable the addition of missing indexes using their lower bounds.
|
||||
+
|
||||
fdec-blank-format-item
|
||||
Fortran Var(flag_dec_blank_format_item)
|
||||
Enable the use of blank format items in format strings.
|
||||
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
|
||||
index 050f56fdc25..c3b2822685d 100644
|
||||
--- a/gcc/fortran/options.c
|
||||
+++ b/gcc/fortran/options.c
|
||||
@@ -84,6 +84,7 @@ set_dec_flags (int value)
|
||||
SET_BITFLAG (flag_dec_non_logical_if, value, value);
|
||||
SET_BITFLAG (flag_dec_promotion, value, value);
|
||||
SET_BITFLAG (flag_dec_sequence, value, value);
|
||||
+ SET_BITFLAG (flag_dec_add_missing_indexes, value, value);
|
||||
}
|
||||
|
||||
/* Finalize DEC flags. */
|
||||
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
|
||||
index fe7d0cc5944..0efeedab46e 100644
|
||||
--- a/gcc/fortran/resolve.c
|
||||
+++ b/gcc/fortran/resolve.c
|
||||
@@ -4806,6 +4806,30 @@ compare_spec_to_ref (gfc_array_ref *ar)
|
||||
if (ar->type == AR_FULL)
|
||||
return true;
|
||||
|
||||
+ if (flag_dec_add_missing_indexes && as->rank > ar->dimen)
|
||||
+ {
|
||||
+ /* Add in the missing dimensions, assuming they are the lower bound
|
||||
+ of that dimension if not specified. */
|
||||
+ int j;
|
||||
+ if (warn_missing_index)
|
||||
+ {
|
||||
+ gfc_warning (OPT_Wmissing_index, "Using the lower bound for "
|
||||
+ "unspecified dimensions in array reference at %L",
|
||||
+ &ar->where);
|
||||
+ }
|
||||
+ /* Other parts of the code iterate ar->start and ar->end from 0 to
|
||||
+ ar->dimen, so it is safe to assume slots from ar->dimen upwards
|
||||
+ are unused (i.e. there are no gaps; the specified indexes are
|
||||
+ contiguous and start at zero. */
|
||||
+ for(j = ar->dimen; j <= as->rank; j++)
|
||||
+ {
|
||||
+ ar->start[j] = gfc_copy_expr (as->lower[j]);
|
||||
+ ar->end[j] = gfc_copy_expr (as->lower[j]);
|
||||
+ ar->dimen_type[j] = DIMEN_ELEMENT;
|
||||
+ }
|
||||
+ ar->dimen = as->rank;
|
||||
+ }
|
||||
+
|
||||
if (as->rank != ar->dimen)
|
||||
{
|
||||
gfc_error ("Rank mismatch in array reference at %L (%d/%d)",
|
||||
diff --git a/gcc/testsuite/gfortran.dg/array_6.f90 b/gcc/testsuite/gfortran.dg/array_6.f90
|
||||
new file mode 100644
|
||||
index 00000000000..5c26e18ab3e
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/array_6.f90
|
||||
@@ -0,0 +1,23 @@
|
||||
+! { dg-do run }
|
||||
+! { dg-options "-fdec -Wmissing-index" }!
|
||||
+! Checks that under-specified arrays (referencing arrays with fewer
|
||||
+! dimensions than the array spec) generates a warning.
|
||||
+!
|
||||
+! Contributed by Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||
+! Updated by Mark Eggleston <mark.eggleston@codethink.co.uk>
|
||||
+!
|
||||
+
|
||||
+program under_specified_array
|
||||
+ integer chessboard(8,8)
|
||||
+ integer chessboard3d(8,8,3:5)
|
||||
+ chessboard(3,1) = 5
|
||||
+ chessboard(3,2) = 55
|
||||
+ chessboard3d(4,1,3) = 6
|
||||
+ chessboard3d(4,1,4) = 66
|
||||
+ chessboard3d(4,4,3) = 7
|
||||
+ chessboard3d(4,4,4) = 77
|
||||
+
|
||||
+ if (chessboard(3).ne.5) stop 1 ! { dg-warning "Using the lower bound for unspecified dimensions in array reference" }
|
||||
+ if (chessboard3d(4).ne.6) stop 2 ! { dg-warning "Using the lower bound for unspecified dimensions in array reference" }
|
||||
+ if (chessboard3d(4,4).ne.7) stop 3 ! { dg-warning "Using the lower bound for unspecified dimensions in array reference" }
|
||||
+end program
|
||||
diff --git a/gcc/testsuite/gfortran.dg/array_7.f90 b/gcc/testsuite/gfortran.dg/array_7.f90
|
||||
new file mode 100644
|
||||
index 00000000000..5588a5bd02d
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/array_7.f90
|
||||
@@ -0,0 +1,23 @@
|
||||
+! { dg-do run }
|
||||
+! { dg-options "-fdec-add-missing-indexes -Wmissing-index" }!
|
||||
+! Checks that under-specified arrays (referencing arrays with fewer
|
||||
+! dimensions than the array spec) generates a warning.
|
||||
+!
|
||||
+! Contributed by Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||
+! Updated by Mark Eggleston <mark.eggleston@codethink.co.uk>
|
||||
+!
|
||||
+
|
||||
+program under_specified_array
|
||||
+ integer chessboard(8,8)
|
||||
+ integer chessboard3d(8,8,3:5)
|
||||
+ chessboard(3,1) = 5
|
||||
+ chessboard(3,2) = 55
|
||||
+ chessboard3d(4,1,3) = 6
|
||||
+ chessboard3d(4,1,4) = 66
|
||||
+ chessboard3d(4,4,3) = 7
|
||||
+ chessboard3d(4,4,4) = 77
|
||||
+
|
||||
+ if (chessboard(3).ne.5) stop 1 ! { dg-warning "Using the lower bound for unspecified dimensions in array reference" }
|
||||
+ if (chessboard3d(4).ne.6) stop 2 ! { dg-warning "Using the lower bound for unspecified dimensions in array reference" }
|
||||
+ if (chessboard3d(4,4).ne.7) stop 3 ! { dg-warning "Using the lower bound for unspecified dimensions in array reference" }
|
||||
+end program
|
||||
diff --git a/gcc/testsuite/gfortran.dg/array_8.f90 b/gcc/testsuite/gfortran.dg/array_8.f90
|
||||
new file mode 100644
|
||||
index 00000000000..f0d2ef5e37d
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/array_8.f90
|
||||
@@ -0,0 +1,23 @@
|
||||
+! { dg-do compile }
|
||||
+! { dg-options "-fdec -fno-dec-add-missing-indexes" }!
|
||||
+! Checks that under-specified arrays (referencing arrays with fewer
|
||||
+! dimensions than the array spec) generates a warning.
|
||||
+!
|
||||
+! Contributed by Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||
+! Updated by Mark Eggleston <mark.eggleston@codethink.co.uk>
|
||||
+!
|
||||
+
|
||||
+program under_specified_array
|
||||
+ integer chessboard(8,8)
|
||||
+ integer chessboard3d(8,8,3:5)
|
||||
+ chessboard(3,1) = 5
|
||||
+ chessboard(3,2) = 55
|
||||
+ chessboard3d(4,1,3) = 6
|
||||
+ chessboard3d(4,1,4) = 66
|
||||
+ chessboard3d(4,4,3) = 7
|
||||
+ chessboard3d(4,4,4) = 77
|
||||
+
|
||||
+ if (chessboard(3).ne.5) stop 1 ! { dg-error "Rank mismatch" }
|
||||
+ if (chessboard3d(4).ne.6) stop 2 ! { dg-error "Rank mismatch" }
|
||||
+ if (chessboard3d(4,4).ne.7) stop 3 ! { dg-error "Rank mismatch" }
|
||||
+end program
|
||||
--
|
||||
2.27.0
|
||||
|
@ -0,0 +1,215 @@
|
||||
From 23b1fcb104c666429451ffaf936f8da5fcd3d43a Mon Sep 17 00:00:00 2001
|
||||
From: Mark Eggleston <markeggleston@gcc.gnu.org>
|
||||
Date: Fri, 22 Jan 2021 12:29:47 +0000
|
||||
Subject: [PATCH 01/10] Allow duplicate declarations.
|
||||
|
||||
Enabled by -fdec-duplicates and -fdec.
|
||||
|
||||
Some fixes by Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||
Addition of -fdec-duplicates by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
---
|
||||
gcc/fortran/lang.opt | 4 ++++
|
||||
gcc/fortran/options.c | 1 +
|
||||
gcc/fortran/symbol.c | 21 +++++++++++++++++--
|
||||
.../gfortran.dg/duplicate_type_4.f90 | 13 ++++++++++++
|
||||
.../gfortran.dg/duplicate_type_5.f90 | 13 ++++++++++++
|
||||
.../gfortran.dg/duplicate_type_6.f90 | 13 ++++++++++++
|
||||
.../gfortran.dg/duplicate_type_7.f90 | 13 ++++++++++++
|
||||
.../gfortran.dg/duplicate_type_8.f90 | 12 +++++++++++
|
||||
.../gfortran.dg/duplicate_type_9.f90 | 12 +++++++++++
|
||||
9 files changed, 100 insertions(+), 2 deletions(-)
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/duplicate_type_4.f90
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/duplicate_type_5.f90
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/duplicate_type_6.f90
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/duplicate_type_7.f90
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/duplicate_type_8.f90
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/duplicate_type_9.f90
|
||||
|
||||
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
|
||||
index 2b1977c523b..52bd522051e 100644
|
||||
--- a/gcc/fortran/lang.opt
|
||||
+++ b/gcc/fortran/lang.opt
|
||||
@@ -469,6 +469,10 @@ Fortran Var(flag_dec_char_conversions)
|
||||
Enable the use of character literals in assignments and data statements
|
||||
for non-character variables.
|
||||
|
||||
+fdec-duplicates
|
||||
+Fortran Var(flag_dec_duplicates)
|
||||
+Allow varibles to be duplicated in the type specification matches.
|
||||
+
|
||||
fdec-include
|
||||
Fortran Var(flag_dec_include)
|
||||
Enable legacy parsing of INCLUDE as statement.
|
||||
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
|
||||
index 3a0b98bf1ec..f19ba87f8a0 100644
|
||||
--- a/gcc/fortran/options.c
|
||||
+++ b/gcc/fortran/options.c
|
||||
@@ -77,6 +77,7 @@ set_dec_flags (int value)
|
||||
SET_BITFLAG (flag_dec_format_defaults, value, value);
|
||||
SET_BITFLAG (flag_dec_blank_format_item, value, value);
|
||||
SET_BITFLAG (flag_dec_char_conversions, value, value);
|
||||
+ SET_BITFLAG (flag_dec_duplicates, value, value);
|
||||
}
|
||||
|
||||
/* Finalize DEC flags. */
|
||||
diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c
|
||||
index 3b988d1be22..9843175cc2a 100644
|
||||
--- a/gcc/fortran/symbol.c
|
||||
+++ b/gcc/fortran/symbol.c
|
||||
@@ -1995,6 +1995,8 @@ gfc_add_type (gfc_symbol *sym, gfc_typespec *ts, locus *where)
|
||||
if (sym->attr.result && type == BT_UNKNOWN && sym->ns->proc_name)
|
||||
type = sym->ns->proc_name->ts.type;
|
||||
|
||||
+ flavor = sym->attr.flavor;
|
||||
+
|
||||
if (type != BT_UNKNOWN && !(sym->attr.function && sym->attr.implicit_type)
|
||||
&& !(gfc_state_stack->previous && gfc_state_stack->previous->previous
|
||||
&& gfc_state_stack->previous->previous->state == COMP_SUBMODULE)
|
||||
@@ -2007,6 +2009,23 @@ gfc_add_type (gfc_symbol *sym, gfc_typespec *ts, locus *where)
|
||||
else if (sym->attr.function && sym->attr.result)
|
||||
gfc_error ("Symbol %qs at %L already has basic type of %s",
|
||||
sym->ns->proc_name->name, where, gfc_basic_typename (type));
|
||||
+ else if (flag_dec_duplicates)
|
||||
+ {
|
||||
+ /* Ignore temporaries and class/procedure names */
|
||||
+ if (sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS
|
||||
+ || sym->ts.type == BT_PROCEDURE)
|
||||
+ return false;
|
||||
+
|
||||
+ if (gfc_compare_types (&sym->ts, ts)
|
||||
+ && (flavor == FL_UNKNOWN || flavor == FL_VARIABLE
|
||||
+ || flavor == FL_PROCEDURE))
|
||||
+ {
|
||||
+ return gfc_notify_std (GFC_STD_LEGACY,
|
||||
+ "Symbol '%qs' at %L already has "
|
||||
+ "basic type of %s", sym->name, where,
|
||||
+ gfc_basic_typename (type));
|
||||
+ }
|
||||
+ }
|
||||
else
|
||||
gfc_error ("Symbol %qs at %L already has basic type of %s", sym->name,
|
||||
where, gfc_basic_typename (type));
|
||||
@@ -2020,8 +2039,6 @@ gfc_add_type (gfc_symbol *sym, gfc_typespec *ts, locus *where)
|
||||
return false;
|
||||
}
|
||||
|
||||
- flavor = sym->attr.flavor;
|
||||
-
|
||||
if (flavor == FL_PROGRAM || flavor == FL_BLOCK_DATA || flavor == FL_MODULE
|
||||
|| flavor == FL_LABEL
|
||||
|| (flavor == FL_PROCEDURE && sym->attr.subroutine)
|
||||
diff --git a/gcc/testsuite/gfortran.dg/duplicate_type_4.f90 b/gcc/testsuite/gfortran.dg/duplicate_type_4.f90
|
||||
new file mode 100644
|
||||
index 00000000000..cdd29ea8846
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/duplicate_type_4.f90
|
||||
@@ -0,0 +1,13 @@
|
||||
+! { dg-do compile }
|
||||
+! { dg-options "-std=f95" }
|
||||
+
|
||||
+! PR fortran/30239
|
||||
+! Check for errors when a symbol gets declared a type twice, even if it
|
||||
+! is the same.
|
||||
+
|
||||
+INTEGER FUNCTION foo ()
|
||||
+ IMPLICIT NONE
|
||||
+ INTEGER :: x
|
||||
+ INTEGER :: x ! { dg-error "basic type of" }
|
||||
+ x = 42
|
||||
+END FUNCTION foo
|
||||
diff --git a/gcc/testsuite/gfortran.dg/duplicate_type_5.f90 b/gcc/testsuite/gfortran.dg/duplicate_type_5.f90
|
||||
new file mode 100644
|
||||
index 00000000000..00f931809aa
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/duplicate_type_5.f90
|
||||
@@ -0,0 +1,13 @@
|
||||
+! { dg-do run }
|
||||
+! { dg-options "-fdec" }
|
||||
+!
|
||||
+! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+
|
||||
+program test
|
||||
+ implicit none
|
||||
+ integer :: x
|
||||
+ integer :: x
|
||||
+ x = 42
|
||||
+ if (x /= 42) stop 1
|
||||
+end program test
|
||||
diff --git a/gcc/testsuite/gfortran.dg/duplicate_type_6.f90 b/gcc/testsuite/gfortran.dg/duplicate_type_6.f90
|
||||
new file mode 100644
|
||||
index 00000000000..f0df27e323c
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/duplicate_type_6.f90
|
||||
@@ -0,0 +1,13 @@
|
||||
+! { dg-do run }
|
||||
+! { dg-options "-std=legacy -fdec-duplicates" }
|
||||
+!
|
||||
+! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+
|
||||
+program test
|
||||
+ implicit none
|
||||
+ integer :: x
|
||||
+ integer :: x
|
||||
+ x = 42
|
||||
+ if (x /= 42) stop 1
|
||||
+end program test
|
||||
diff --git a/gcc/testsuite/gfortran.dg/duplicate_type_7.f90 b/gcc/testsuite/gfortran.dg/duplicate_type_7.f90
|
||||
new file mode 100644
|
||||
index 00000000000..f32472ff586
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/duplicate_type_7.f90
|
||||
@@ -0,0 +1,13 @@
|
||||
+! { dg-do run }
|
||||
+! { dg-options "-fdec-duplicates" }
|
||||
+!
|
||||
+! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+
|
||||
+program test
|
||||
+ implicit none
|
||||
+ integer :: x
|
||||
+ integer :: x! { dg-warning "Legacy Extension" }
|
||||
+ x = 42
|
||||
+ if (x /= 42) stop 1
|
||||
+end program test
|
||||
diff --git a/gcc/testsuite/gfortran.dg/duplicate_type_8.f90 b/gcc/testsuite/gfortran.dg/duplicate_type_8.f90
|
||||
new file mode 100644
|
||||
index 00000000000..23c94add179
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/duplicate_type_8.f90
|
||||
@@ -0,0 +1,12 @@
|
||||
+! { dg-do compile }
|
||||
+! { dg-options "-fdec -fno-dec-duplicates" }
|
||||
+!
|
||||
+! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+
|
||||
+integer function foo ()
|
||||
+ implicit none
|
||||
+ integer :: x
|
||||
+ integer :: x ! { dg-error "basic type of" }
|
||||
+ x = 42
|
||||
+end function foo
|
||||
diff --git a/gcc/testsuite/gfortran.dg/duplicate_type_9.f90 b/gcc/testsuite/gfortran.dg/duplicate_type_9.f90
|
||||
new file mode 100644
|
||||
index 00000000000..d5edee4d8ee
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/duplicate_type_9.f90
|
||||
@@ -0,0 +1,12 @@
|
||||
+! { dg-do compile }
|
||||
+! { dg-options "-fdec-duplicates -fno-dec-duplicates" }
|
||||
+!
|
||||
+! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+
|
||||
+integer function foo ()
|
||||
+ implicit none
|
||||
+ integer :: x
|
||||
+ integer :: x ! { dg-error "basic type of" }
|
||||
+ x = 42
|
||||
+end function foo
|
||||
--
|
||||
2.27.0
|
||||
|
@ -0,0 +1,78 @@
|
||||
From f883ac209b0feea860354cb4ef7ff06dc8063fab Mon Sep 17 00:00:00 2001
|
||||
From: Mark Eggleston <markeggleston@gcc.gnu.org>
|
||||
Date: Fri, 22 Jan 2021 12:53:35 +0000
|
||||
Subject: [PATCH 03/10] Allow more than one character as argument to ICHAR
|
||||
|
||||
Use -fdec to enable.
|
||||
---
|
||||
gcc/fortran/check.c | 2 +-
|
||||
gcc/fortran/simplify.c | 4 ++--
|
||||
.../gfortran.dg/dec_ichar_with_string_1.f | 21 +++++++++++++++++++
|
||||
3 files changed, 24 insertions(+), 3 deletions(-)
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/dec_ichar_with_string_1.f
|
||||
|
||||
diff --git a/gcc/fortran/check.c b/gcc/fortran/check.c
|
||||
index 82db8e4e1b2..623c1cc470e 100644
|
||||
--- a/gcc/fortran/check.c
|
||||
+++ b/gcc/fortran/check.c
|
||||
@@ -3157,7 +3157,7 @@ gfc_check_ichar_iachar (gfc_expr *c, gfc_expr *kind)
|
||||
else
|
||||
return true;
|
||||
|
||||
- if (i != 1)
|
||||
+ if (i != 1 && !flag_dec)
|
||||
{
|
||||
gfc_error ("Argument of %s at %L must be of length one",
|
||||
gfc_current_intrinsic, &c->where);
|
||||
diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c
|
||||
index 23317a2e2d9..9900572424f 100644
|
||||
--- a/gcc/fortran/simplify.c
|
||||
+++ b/gcc/fortran/simplify.c
|
||||
@@ -3261,7 +3261,7 @@ gfc_simplify_iachar (gfc_expr *e, gfc_expr *kind)
|
||||
if (e->expr_type != EXPR_CONSTANT)
|
||||
return NULL;
|
||||
|
||||
- if (e->value.character.length != 1)
|
||||
+ if (e->value.character.length != 1 && !flag_dec)
|
||||
{
|
||||
gfc_error ("Argument of IACHAR at %L must be of length one", &e->where);
|
||||
return &gfc_bad_expr;
|
||||
@@ -3459,7 +3459,7 @@ gfc_simplify_ichar (gfc_expr *e, gfc_expr *kind)
|
||||
if (e->expr_type != EXPR_CONSTANT)
|
||||
return NULL;
|
||||
|
||||
- if (e->value.character.length != 1)
|
||||
+ if (e->value.character.length != 1 && !flag_dec)
|
||||
{
|
||||
gfc_error ("Argument of ICHAR at %L must be of length one", &e->where);
|
||||
return &gfc_bad_expr;
|
||||
diff --git a/gcc/testsuite/gfortran.dg/dec_ichar_with_string_1.f b/gcc/testsuite/gfortran.dg/dec_ichar_with_string_1.f
|
||||
new file mode 100644
|
||||
index 00000000000..85efccecc0f
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/dec_ichar_with_string_1.f
|
||||
@@ -0,0 +1,21 @@
|
||||
+! { dg-do run }
|
||||
+! { dg-options "-fdec" }
|
||||
+!
|
||||
+! Test ICHAR and IACHAR with more than one character as argument
|
||||
+!
|
||||
+! Test case contributed by Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+ PROGRAM ichar_more_than_one_character
|
||||
+ CHARACTER*4 st/'Test'/
|
||||
+ INTEGER i
|
||||
+
|
||||
+ i = ICHAR(st)
|
||||
+ if (i.NE.84) STOP 1
|
||||
+ i = IACHAR(st)
|
||||
+ if (i.NE.84) STOP 2
|
||||
+ i = ICHAR('Test')
|
||||
+ if (i.NE.84) STOP 3
|
||||
+ i = IACHAR('Test')
|
||||
+ if (i.NE.84) STOP 4
|
||||
+ END
|
||||
--
|
||||
2.27.0
|
||||
|
@ -0,0 +1,158 @@
|
||||
From 67aef262311d6a746786ee0f59748ccaa7e1e711 Mon Sep 17 00:00:00 2001
|
||||
From: Mark Eggleston <markeggleston@gcc.gnu.org>
|
||||
Date: Fri, 22 Jan 2021 13:09:54 +0000
|
||||
Subject: [PATCH 04/10] Allow non-integer substring indexes
|
||||
|
||||
Use -fdec-non-integer-index compiler flag to enable. Also enabled by -fdec.
|
||||
---
|
||||
gcc/fortran/lang.opt | 4 ++++
|
||||
gcc/fortran/options.c | 1 +
|
||||
gcc/fortran/resolve.c | 20 +++++++++++++++++++
|
||||
.../dec_not_integer_substring_indexes_1.f | 18 +++++++++++++++++
|
||||
.../dec_not_integer_substring_indexes_2.f | 18 +++++++++++++++++
|
||||
.../dec_not_integer_substring_indexes_3.f | 18 +++++++++++++++++
|
||||
6 files changed, 79 insertions(+)
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/dec_not_integer_substring_indexes_1.f
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/dec_not_integer_substring_indexes_2.f
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/dec_not_integer_substring_indexes_3.f
|
||||
|
||||
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
|
||||
index c4da248f07c..d527c106bd6 100644
|
||||
--- a/gcc/fortran/lang.opt
|
||||
+++ b/gcc/fortran/lang.opt
|
||||
@@ -489,6 +489,10 @@ fdec-math
|
||||
Fortran Var(flag_dec_math)
|
||||
Enable legacy math intrinsics for compatibility.
|
||||
|
||||
+fdec-non-integer-index
|
||||
+Fortran Var(flag_dec_non_integer_index)
|
||||
+Enable support for non-integer substring indexes.
|
||||
+
|
||||
fdec-structure
|
||||
Fortran Var(flag_dec_structure)
|
||||
Enable support for DEC STRUCTURE/RECORD.
|
||||
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
|
||||
index f19ba87f8a0..9a042f64881 100644
|
||||
--- a/gcc/fortran/options.c
|
||||
+++ b/gcc/fortran/options.c
|
||||
@@ -78,6 +78,7 @@ set_dec_flags (int value)
|
||||
SET_BITFLAG (flag_dec_blank_format_item, value, value);
|
||||
SET_BITFLAG (flag_dec_char_conversions, value, value);
|
||||
SET_BITFLAG (flag_dec_duplicates, value, value);
|
||||
+ SET_BITFLAG (flag_dec_non_integer_index, value, value);
|
||||
}
|
||||
|
||||
/* Finalize DEC flags. */
|
||||
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
|
||||
index 4b90cb59902..bc0df0fdb99 100644
|
||||
--- a/gcc/fortran/resolve.c
|
||||
+++ b/gcc/fortran/resolve.c
|
||||
@@ -5131,6 +5131,16 @@ gfc_resolve_substring (gfc_ref *ref, bool *equal_length)
|
||||
if (!gfc_resolve_expr (ref->u.ss.start))
|
||||
return false;
|
||||
|
||||
+ /* In legacy mode, allow non-integer string indexes by converting */
|
||||
+ if (flag_dec_non_integer_index && ref->u.ss.start->ts.type != BT_INTEGER
|
||||
+ && gfc_numeric_ts (&ref->u.ss.start->ts))
|
||||
+ {
|
||||
+ gfc_typespec t;
|
||||
+ t.type = BT_INTEGER;
|
||||
+ t.kind = ref->u.ss.start->ts.kind;
|
||||
+ gfc_convert_type_warn (ref->u.ss.start, &t, 2, 1);
|
||||
+ }
|
||||
+
|
||||
if (ref->u.ss.start->ts.type != BT_INTEGER)
|
||||
{
|
||||
gfc_error ("Substring start index at %L must be of type INTEGER",
|
||||
@@ -5160,6 +5170,16 @@ gfc_resolve_substring (gfc_ref *ref, bool *equal_length)
|
||||
if (!gfc_resolve_expr (ref->u.ss.end))
|
||||
return false;
|
||||
|
||||
+ /* Non-integer string index endings, as for start */
|
||||
+ if (flag_dec_non_integer_index && ref->u.ss.end->ts.type != BT_INTEGER
|
||||
+ && gfc_numeric_ts (&ref->u.ss.end->ts))
|
||||
+ {
|
||||
+ gfc_typespec t;
|
||||
+ t.type = BT_INTEGER;
|
||||
+ t.kind = ref->u.ss.end->ts.kind;
|
||||
+ gfc_convert_type_warn (ref->u.ss.end, &t, 2, 1);
|
||||
+ }
|
||||
+
|
||||
if (ref->u.ss.end->ts.type != BT_INTEGER)
|
||||
{
|
||||
gfc_error ("Substring end index at %L must be of type INTEGER",
|
||||
diff --git a/gcc/testsuite/gfortran.dg/dec_not_integer_substring_indexes_1.f b/gcc/testsuite/gfortran.dg/dec_not_integer_substring_indexes_1.f
|
||||
new file mode 100644
|
||||
index 00000000000..0be28abaa4b
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/dec_not_integer_substring_indexes_1.f
|
||||
@@ -0,0 +1,18 @@
|
||||
+! { dg-do run }
|
||||
+! { dg-options "-fdec" }
|
||||
+!
|
||||
+! Test not integer substring indexes
|
||||
+!
|
||||
+! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+ PROGRAM not_integer_substring_indexes
|
||||
+ CHARACTER*5 st/'Tests'/
|
||||
+ REAL ir/1.0/
|
||||
+ REAL ir2/4.0/
|
||||
+
|
||||
+ if (st(ir:4).ne.'Test') stop 1
|
||||
+ if (st(1:ir2).ne.'Test') stop 2
|
||||
+ if (st(1.0:4).ne.'Test') stop 3
|
||||
+ if (st(1:4.0).ne.'Test') stop 4
|
||||
+ if (st(2.5:4).ne.'est') stop 5
|
||||
+ END
|
||||
diff --git a/gcc/testsuite/gfortran.dg/dec_not_integer_substring_indexes_2.f b/gcc/testsuite/gfortran.dg/dec_not_integer_substring_indexes_2.f
|
||||
new file mode 100644
|
||||
index 00000000000..3cf05296d0c
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/dec_not_integer_substring_indexes_2.f
|
||||
@@ -0,0 +1,18 @@
|
||||
+! { dg-do run }
|
||||
+! { dg-options "-fdec-non-integer-index" }
|
||||
+!
|
||||
+! Test not integer substring indexes
|
||||
+!
|
||||
+! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+ PROGRAM not_integer_substring_indexes
|
||||
+ CHARACTER*5 st/'Tests'/
|
||||
+ REAL ir/1.0/
|
||||
+ REAL ir2/4.0/
|
||||
+
|
||||
+ if (st(ir:4).ne.'Test') stop 1
|
||||
+ if (st(1:ir2).ne.'Test') stop 2
|
||||
+ if (st(1.0:4).ne.'Test') stop 3
|
||||
+ if (st(1:4.0).ne.'Test') stop 4
|
||||
+ if (st(2.5:4).ne.'est') stop 5
|
||||
+ END
|
||||
diff --git a/gcc/testsuite/gfortran.dg/dec_not_integer_substring_indexes_3.f b/gcc/testsuite/gfortran.dg/dec_not_integer_substring_indexes_3.f
|
||||
new file mode 100644
|
||||
index 00000000000..703de995897
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/dec_not_integer_substring_indexes_3.f
|
||||
@@ -0,0 +1,18 @@
|
||||
+! { dg-do compile }
|
||||
+! { dg-options "-fdec -fno-dec-non-integer-index" }
|
||||
+!
|
||||
+! Test not integer substring indexes
|
||||
+!
|
||||
+! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+ PROGRAM not_integer_substring_indexes
|
||||
+ CHARACTER*5 st/'Tests'/
|
||||
+ REAL ir/1.0/
|
||||
+ REAL ir2/4.0/
|
||||
+
|
||||
+ if (st(ir:4).ne.'Test') stop 1 ! { dg-error "Substring start index" }
|
||||
+ if (st(1:ir2).ne.'Test') stop 2 ! { dg-error "Substring end index" }
|
||||
+ if (st(1.0:4).ne.'Test') stop 3 ! { dg-error "Substring start index" }
|
||||
+ if (st(1:4.0).ne.'Test') stop 4 ! { dg-error "Substring end index" }
|
||||
+ if (st(2.5:4).ne.'est') stop 5 ! { dg-error "Substring start index" }
|
||||
+ END
|
||||
--
|
||||
2.27.0
|
||||
|
@ -0,0 +1,378 @@
|
||||
From cc87ddb841017bb0976b05091733609ee17d7f05 Mon Sep 17 00:00:00 2001
|
||||
From: Mark Eggleston <markeggleston@gcc.gnu.org>
|
||||
Date: Fri, 22 Jan 2021 13:15:17 +0000
|
||||
Subject: [PATCH 07/10] Allow non-logical expressions in IF statements
|
||||
|
||||
Use -fdec-non-logical-if to enable feature. Also enabled using -fdec.
|
||||
---
|
||||
gcc/fortran/lang.opt | 4 ++
|
||||
gcc/fortran/options.c | 1 +
|
||||
gcc/fortran/resolve.c | 60 ++++++++++++++++---
|
||||
...gical_expressions_if_statements_blocks_1.f | 25 ++++++++
|
||||
...gical_expressions_if_statements_blocks_2.f | 25 ++++++++
|
||||
...gical_expressions_if_statements_blocks_3.f | 25 ++++++++
|
||||
...gical_expressions_if_statements_blocks_4.f | 45 ++++++++++++++
|
||||
...gical_expressions_if_statements_blocks_5.f | 45 ++++++++++++++
|
||||
...gical_expressions_if_statements_blocks_6.f | 45 ++++++++++++++
|
||||
9 files changed, 266 insertions(+), 9 deletions(-)
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_1.f
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_2.f
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_3.f
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_4.f
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_5.f
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_6.f
|
||||
|
||||
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
|
||||
index 4a269ebb22d..d886c2f33ed 100644
|
||||
--- a/gcc/fortran/lang.opt
|
||||
+++ b/gcc/fortran/lang.opt
|
||||
@@ -497,6 +497,10 @@ fdec-override-kind
|
||||
Fortran Var(flag_dec_override_kind)
|
||||
Enable support for per variable kind specification.
|
||||
|
||||
+fdec-non-logical-if
|
||||
+Fortran Var(flag_dec_non_logical_if)
|
||||
+Enable support for non-logical expressions in if statements.
|
||||
+
|
||||
fdec-old-init
|
||||
Fortran Var(flag_dec_old_init)
|
||||
Enable support for old style initializers in derived types.
|
||||
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
|
||||
index edbab483b36..a946c86790a 100644
|
||||
--- a/gcc/fortran/options.c
|
||||
+++ b/gcc/fortran/options.c
|
||||
@@ -81,6 +81,7 @@ set_dec_flags (int value)
|
||||
SET_BITFLAG (flag_dec_non_integer_index, value, value);
|
||||
SET_BITFLAG (flag_dec_old_init, value, value);
|
||||
SET_BITFLAG (flag_dec_override_kind, value, value);
|
||||
+ SET_BITFLAG (flag_dec_non_logical_if, value, value);
|
||||
}
|
||||
|
||||
/* Finalize DEC flags. */
|
||||
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
|
||||
index bc0df0fdb99..07dd039f3bf 100644
|
||||
--- a/gcc/fortran/resolve.c
|
||||
+++ b/gcc/fortran/resolve.c
|
||||
@@ -10789,10 +10789,31 @@ gfc_resolve_blocks (gfc_code *b, gfc_namespace *ns)
|
||||
switch (b->op)
|
||||
{
|
||||
case EXEC_IF:
|
||||
- if (t && b->expr1 != NULL
|
||||
- && (b->expr1->ts.type != BT_LOGICAL || b->expr1->rank != 0))
|
||||
- gfc_error ("IF clause at %L requires a scalar LOGICAL expression",
|
||||
- &b->expr1->where);
|
||||
+ if (t && b->expr1 != NULL)
|
||||
+ {
|
||||
+ if (flag_dec_non_logical_if && b->expr1->ts.type != BT_LOGICAL)
|
||||
+ {
|
||||
+ gfc_expr* cast;
|
||||
+ cast = gfc_ne (b->expr1,
|
||||
+ gfc_get_int_expr (1, &gfc_current_locus, 0),
|
||||
+ INTRINSIC_NE);
|
||||
+ if (cast == NULL)
|
||||
+ gfc_internal_error ("gfc_resolve_blocks(): Failed to cast "
|
||||
+ "to LOGICAL in IF");
|
||||
+ b->expr1 = cast;
|
||||
+ if (warn_conversion_extra)
|
||||
+ {
|
||||
+ gfc_warning (OPT_Wconversion_extra, "Non-LOGICAL type in"
|
||||
+ " IF statement condition %L will be true if"
|
||||
+ " it evaluates to nonzero",
|
||||
+ &b->expr1->where);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if ((b->expr1->ts.type != BT_LOGICAL || b->expr1->rank != 0))
|
||||
+ gfc_error ("IF clause at %L requires a scalar LOGICAL "
|
||||
+ "expression", &b->expr1->where);
|
||||
+ }
|
||||
break;
|
||||
|
||||
case EXEC_WHERE:
|
||||
@@ -12093,11 +12114,32 @@ start:
|
||||
break;
|
||||
|
||||
case EXEC_IF:
|
||||
- if (t && code->expr1 != NULL
|
||||
- && (code->expr1->ts.type != BT_LOGICAL
|
||||
- || code->expr1->rank != 0))
|
||||
- gfc_error ("IF clause at %L requires a scalar LOGICAL expression",
|
||||
- &code->expr1->where);
|
||||
+ if (t && code->expr1 != NULL)
|
||||
+ {
|
||||
+ if (flag_dec_non_logical_if
|
||||
+ && code->expr1->ts.type != BT_LOGICAL)
|
||||
+ {
|
||||
+ gfc_expr* cast;
|
||||
+ cast = gfc_ne (code->expr1,
|
||||
+ gfc_get_int_expr (1, &gfc_current_locus, 0),
|
||||
+ INTRINSIC_NE);
|
||||
+ if (cast == NULL)
|
||||
+ gfc_internal_error ("gfc_resolve_code(): Failed to cast "
|
||||
+ "to LOGICAL in IF");
|
||||
+ code->expr1 = cast;
|
||||
+ if (warn_conversion_extra)
|
||||
+ {
|
||||
+ gfc_warning (OPT_Wconversion_extra, "Non-LOGICAL type in"
|
||||
+ " IF statement condition %L will be true if"
|
||||
+ " it evaluates to nonzero",
|
||||
+ &code->expr1->where);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (code->expr1->ts.type != BT_LOGICAL || code->expr1->rank != 0)
|
||||
+ gfc_error ("IF clause at %L requires a scalar LOGICAL "
|
||||
+ "expression", &code->expr1->where);
|
||||
+ }
|
||||
break;
|
||||
|
||||
case EXEC_CALL:
|
||||
diff --git a/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_1.f b/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_1.f
|
||||
new file mode 100644
|
||||
index 00000000000..0101db893ca
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_1.f
|
||||
@@ -0,0 +1,25 @@
|
||||
+! { dg-do run }
|
||||
+! { dg-options "-fdec -Wconversion-extra" }
|
||||
+!
|
||||
+! Allow logical expressions in if statements and blocks
|
||||
+!
|
||||
+! Contributed by Francisco Redondo Marchena <francisco.marchema@codethink.co.uk>
|
||||
+! and Jeff Law <law@redhat.com>
|
||||
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+ PROGRAM logical_exp_if_st_bl
|
||||
+ INTEGER ipos/1/
|
||||
+ INTEGER ineg/0/
|
||||
+
|
||||
+ ! Test non logical variables
|
||||
+ if (ineg) STOP 1 ! { dg-warning "if it evaluates to nonzero" }
|
||||
+ if (0) STOP 2 ! { dg-warning "if it evaluates to nonzero" }
|
||||
+
|
||||
+ ! Test non logical expressions in if statements
|
||||
+ if (MOD(ipos, 1)) STOP 3 ! { dg-warning "if it evaluates to nonzero" }
|
||||
+
|
||||
+ ! Test non logical expressions in if blocks
|
||||
+ if (MOD(2 * ipos, 2)) then ! { dg-warning "if it evaluates to nonzero" }
|
||||
+ STOP 4
|
||||
+ endif
|
||||
+ END
|
||||
diff --git a/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_2.f b/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_2.f
|
||||
new file mode 100644
|
||||
index 00000000000..876f4e09508
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_2.f
|
||||
@@ -0,0 +1,25 @@
|
||||
+! { dg-do run }
|
||||
+! { dg-options "-fdec-non-logical-if -Wconversion-extra" }
|
||||
+!
|
||||
+! Allow logical expressions in if statements and blocks
|
||||
+!
|
||||
+! Contributed by Francisco Redondo Marchena <francisco.marchema@codethink.co.uk>
|
||||
+! and Jeff Law <law@redhat.com>
|
||||
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+ PROGRAM logical_exp_if_st_bl
|
||||
+ INTEGER ipos/1/
|
||||
+ INTEGER ineg/0/
|
||||
+
|
||||
+ ! Test non logical variables
|
||||
+ if (ineg) STOP 1 ! { dg-warning "if it evaluates to nonzero" }
|
||||
+ if (0) STOP 2 ! { dg-warning "if it evaluates to nonzero" }
|
||||
+
|
||||
+ ! Test non logical expressions in if statements
|
||||
+ if (MOD(ipos, 1)) STOP 3 ! { dg-warning "if it evaluates to nonzero" }
|
||||
+
|
||||
+ ! Test non logical expressions in if blocks
|
||||
+ if (MOD(2 * ipos, 2)) then ! { dg-warning "if it evaluates to nonzero" }
|
||||
+ STOP 4
|
||||
+ endif
|
||||
+ END
|
||||
diff --git a/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_3.f b/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_3.f
|
||||
new file mode 100644
|
||||
index 00000000000..35cb4c51b8d
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_3.f
|
||||
@@ -0,0 +1,25 @@
|
||||
+! { dg-do compile }
|
||||
+! { dg-options "-fdec -fno-dec-non-logical-if" }
|
||||
+!
|
||||
+! Allow logical expressions in if statements and blocks
|
||||
+!
|
||||
+! Contributed by Francisco Redondo Marchena <francisco.marchema@codethink.co.uk>
|
||||
+! and Jeff Law <law@redhat.com>
|
||||
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+ PROGRAM logical_exp_if_st_bl
|
||||
+ INTEGER ipos/1/
|
||||
+ INTEGER ineg/0/
|
||||
+
|
||||
+ ! Test non logical variables
|
||||
+ if (ineg) STOP 1 ! { dg-error "IF clause at" }
|
||||
+ if (0) STOP 2 ! { dg-error "IF clause at" }
|
||||
+
|
||||
+ ! Test non logical expressions in if statements
|
||||
+ if (MOD(ipos, 1)) STOP 3 ! { dg-error "IF clause at" }
|
||||
+
|
||||
+ ! Test non logical expressions in if blocks
|
||||
+ if (MOD(2 * ipos, 2)) then ! { dg-error "IF clause at" }
|
||||
+ STOP 4
|
||||
+ endif
|
||||
+ END
|
||||
diff --git a/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_4.f b/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_4.f
|
||||
new file mode 100644
|
||||
index 00000000000..7b60b60827f
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_4.f
|
||||
@@ -0,0 +1,45 @@
|
||||
+! { dg-do run }
|
||||
+! { dg-options "-fdec -Wconversion-extra" }
|
||||
+!
|
||||
+! Contributed by Francisco Redondo Marchena <francisco.marchema@codethink.co.uk>
|
||||
+! and Jeff Law <law@redhat.com>
|
||||
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+ function othersub1()
|
||||
+ integer*4 othersub1
|
||||
+ othersub1 = 9
|
||||
+ end
|
||||
+
|
||||
+ function othersub2()
|
||||
+ integer*4 othersub2
|
||||
+ othersub2 = 0
|
||||
+ end
|
||||
+
|
||||
+ program MAIN
|
||||
+ integer*4 othersub1
|
||||
+ integer*4 othersub2
|
||||
+ integer a /1/
|
||||
+ integer b /2/
|
||||
+
|
||||
+ if (othersub1()) then ! { dg-warning "if it evaluates to nonzero" }
|
||||
+ write(*,*) "OK"
|
||||
+ else
|
||||
+ stop 1
|
||||
+ end if
|
||||
+ if (othersub2()) then ! { dg-warning "if it evaluates to nonzero" }
|
||||
+ stop 2
|
||||
+ else
|
||||
+ write(*,*) "OK"
|
||||
+ end if
|
||||
+ if (a-b) then ! { dg-warning "if it evaluates to nonzero" }
|
||||
+ write(*,*) "OK"
|
||||
+ else
|
||||
+ stop 3
|
||||
+ end if
|
||||
+ if (b-(a+1)) then ! { dg-warning "if it evaluates to nonzero" }
|
||||
+ stop 3
|
||||
+ else
|
||||
+ write(*,*) "OK"
|
||||
+ end if
|
||||
+ end
|
||||
+
|
||||
diff --git a/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_5.f b/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_5.f
|
||||
new file mode 100644
|
||||
index 00000000000..80336f48ca1
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_5.f
|
||||
@@ -0,0 +1,45 @@
|
||||
+! { dg-do run }
|
||||
+! { dg-options "-fdec-non-logical-if -Wconversion-extra" }
|
||||
+!
|
||||
+! Contributed by Francisco Redondo Marchena <francisco.marchema@codethink.co.uk>
|
||||
+! and Jeff Law <law@redhat.com>
|
||||
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+ function othersub1()
|
||||
+ integer*4 othersub1
|
||||
+ othersub1 = 9
|
||||
+ end
|
||||
+
|
||||
+ function othersub2()
|
||||
+ integer*4 othersub2
|
||||
+ othersub2 = 0
|
||||
+ end
|
||||
+
|
||||
+ program MAIN
|
||||
+ integer*4 othersub1
|
||||
+ integer*4 othersub2
|
||||
+ integer a /1/
|
||||
+ integer b /2/
|
||||
+
|
||||
+ if (othersub1()) then ! { dg-warning "Non-LOGICAL type in IF statement" }
|
||||
+ write(*,*) "OK"
|
||||
+ else
|
||||
+ stop 1
|
||||
+ end if
|
||||
+ if (othersub2()) then ! { dg-warning "Non-LOGICAL type in IF statement" }
|
||||
+ stop 2
|
||||
+ else
|
||||
+ write(*,*) "OK"
|
||||
+ end if
|
||||
+ if (a-b) then ! { dg-warning "Non-LOGICAL type in IF statement" }
|
||||
+ write(*,*) "OK"
|
||||
+ else
|
||||
+ stop 3
|
||||
+ end if
|
||||
+ if (b-(a+1)) then ! { dg-warning "Non-LOGICAL type in IF statement" }
|
||||
+ stop 3
|
||||
+ else
|
||||
+ write(*,*) "OK"
|
||||
+ end if
|
||||
+ end
|
||||
+
|
||||
diff --git a/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_6.f b/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_6.f
|
||||
new file mode 100644
|
||||
index 00000000000..e1125ca717a
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_6.f
|
||||
@@ -0,0 +1,45 @@
|
||||
+! { dg-do compile }
|
||||
+! { dg-options "-fdec -fno-dec-non-logical-if" }
|
||||
+!
|
||||
+! Contributed by Francisco Redondo Marchena <francisco.marchema@codethink.co.uk>
|
||||
+! and Jeff Law <law@redhat.com>
|
||||
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+ function othersub1()
|
||||
+ integer*4 othersub1
|
||||
+ othersub1 = 9
|
||||
+ end
|
||||
+
|
||||
+ function othersub2()
|
||||
+ integer*4 othersub2
|
||||
+ othersub2 = 0
|
||||
+ end
|
||||
+
|
||||
+ program MAIN
|
||||
+ integer*4 othersub1
|
||||
+ integer*4 othersub2
|
||||
+ integer a /1/
|
||||
+ integer b /2/
|
||||
+
|
||||
+ if (othersub1()) then ! { dg-error "IF clause at" }
|
||||
+ write(*,*) "OK"
|
||||
+ else
|
||||
+ stop 1
|
||||
+ end if
|
||||
+ if (othersub2()) then ! { dg-error "IF clause at" }
|
||||
+ stop 2
|
||||
+ else
|
||||
+ write(*,*) "OK"
|
||||
+ end if
|
||||
+ if (a-b) then ! { dg-error "IF clause at" }
|
||||
+ write(*,*) "OK"
|
||||
+ else
|
||||
+ stop 3
|
||||
+ end if
|
||||
+ if (b-(a+1)) then ! { dg-error "IF clause at" }
|
||||
+ stop 3
|
||||
+ else
|
||||
+ write(*,*) "OK"
|
||||
+ end if
|
||||
+ end
|
||||
+
|
||||
--
|
||||
2.27.0
|
||||
|
@ -0,0 +1,185 @@
|
||||
From 8bcc0f85ed1718c0dd9033ad4a34df181aabaffe Mon Sep 17 00:00:00 2001
|
||||
From: Mark Eggleston <markeggleston@gcc.gnu.org>
|
||||
Date: Fri, 22 Jan 2021 13:11:06 +0000
|
||||
Subject: [PATCH 05/10] Allow old-style initializers in derived types
|
||||
|
||||
This allows simple declarations in derived types and structures, such as:
|
||||
LOGICAL*1 NIL /0/
|
||||
Only single value expressions are allowed at the moment.
|
||||
|
||||
Use -fdec-old-init to enable. Also enabled by -fdec.
|
||||
---
|
||||
gcc/fortran/decl.c | 27 +++++++++++++++----
|
||||
gcc/fortran/lang.opt | 4 +++
|
||||
gcc/fortran/options.c | 1 +
|
||||
...ec_derived_types_initialised_old_style_1.f | 25 +++++++++++++++++
|
||||
...ec_derived_types_initialised_old_style_2.f | 25 +++++++++++++++++
|
||||
...ec_derived_types_initialised_old_style_3.f | 26 ++++++++++++++++++
|
||||
6 files changed, 103 insertions(+), 5 deletions(-)
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/dec_derived_types_initialised_old_style_1.f
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/dec_derived_types_initialised_old_style_2.f
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/dec_derived_types_initialised_old_style_3.f
|
||||
|
||||
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
|
||||
index 723915822f3..5c8c1b7981b 100644
|
||||
--- a/gcc/fortran/decl.c
|
||||
+++ b/gcc/fortran/decl.c
|
||||
@@ -2827,12 +2827,29 @@ variable_decl (int elem)
|
||||
but not components of derived types. */
|
||||
else if (gfc_current_state () == COMP_DERIVED)
|
||||
{
|
||||
- gfc_error ("Invalid old style initialization for derived type "
|
||||
- "component at %C");
|
||||
- m = MATCH_ERROR;
|
||||
- goto cleanup;
|
||||
+ if (flag_dec_old_init)
|
||||
+ {
|
||||
+ /* Attempt to match an old-style initializer which is a simple
|
||||
+ integer or character expression; this will not work with
|
||||
+ multiple values. */
|
||||
+ m = gfc_match_init_expr (&initializer);
|
||||
+ if (m == MATCH_ERROR)
|
||||
+ goto cleanup;
|
||||
+ else if (m == MATCH_YES)
|
||||
+ {
|
||||
+ m = gfc_match ("/");
|
||||
+ if (m != MATCH_YES)
|
||||
+ goto cleanup;
|
||||
+ }
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ gfc_error ("Invalid old style initialization for derived type "
|
||||
+ "component at %C");
|
||||
+ m = MATCH_ERROR;
|
||||
+ goto cleanup;
|
||||
+ }
|
||||
}
|
||||
-
|
||||
/* For structure components, read the initializer as a special
|
||||
expression and let the rest of this function apply the initializer
|
||||
as usual. */
|
||||
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
|
||||
index d527c106bd6..25cc948699b 100644
|
||||
--- a/gcc/fortran/lang.opt
|
||||
+++ b/gcc/fortran/lang.opt
|
||||
@@ -493,6 +493,10 @@ fdec-non-integer-index
|
||||
Fortran Var(flag_dec_non_integer_index)
|
||||
Enable support for non-integer substring indexes.
|
||||
|
||||
+fdec-old-init
|
||||
+Fortran Var(flag_dec_old_init)
|
||||
+Enable support for old style initializers in derived types.
|
||||
+
|
||||
fdec-structure
|
||||
Fortran Var(flag_dec_structure)
|
||||
Enable support for DEC STRUCTURE/RECORD.
|
||||
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
|
||||
index 9a042f64881..d6bd36c3a8a 100644
|
||||
--- a/gcc/fortran/options.c
|
||||
+++ b/gcc/fortran/options.c
|
||||
@@ -79,6 +79,7 @@ set_dec_flags (int value)
|
||||
SET_BITFLAG (flag_dec_char_conversions, value, value);
|
||||
SET_BITFLAG (flag_dec_duplicates, value, value);
|
||||
SET_BITFLAG (flag_dec_non_integer_index, value, value);
|
||||
+ SET_BITFLAG (flag_dec_old_init, value, value);
|
||||
}
|
||||
|
||||
/* Finalize DEC flags. */
|
||||
diff --git a/gcc/testsuite/gfortran.dg/dec_derived_types_initialised_old_style_1.f b/gcc/testsuite/gfortran.dg/dec_derived_types_initialised_old_style_1.f
|
||||
new file mode 100644
|
||||
index 00000000000..eac4f9bfcf1
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/dec_derived_types_initialised_old_style_1.f
|
||||
@@ -0,0 +1,25 @@
|
||||
+! { dg-do run }
|
||||
+! { dg-options "-fdec" }
|
||||
+!
|
||||
+! Test old style initializers in derived types
|
||||
+!
|
||||
+! Contributed by Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+ PROGRAM spec_in_var
|
||||
+ TYPE STRUCT1
|
||||
+ INTEGER*4 ID /8/
|
||||
+ INTEGER*4 TYPE /5/
|
||||
+ INTEGER*8 DEFVAL /0/
|
||||
+ CHARACTER*(5) NAME /'tests'/
|
||||
+ LOGICAL*1 NIL /0/
|
||||
+ END TYPE STRUCT1
|
||||
+
|
||||
+ TYPE (STRUCT1) SINST
|
||||
+
|
||||
+ IF(SINST%ID.NE.8) STOP 1
|
||||
+ IF(SINST%TYPE.NE.5) STOP 2
|
||||
+ IF(SINST%DEFVAL.NE.0) STOP 3
|
||||
+ IF(SINST%NAME.NE.'tests') STOP 4
|
||||
+ IF(SINST%NIL) STOP 5
|
||||
+ END
|
||||
diff --git a/gcc/testsuite/gfortran.dg/dec_derived_types_initialised_old_style_2.f b/gcc/testsuite/gfortran.dg/dec_derived_types_initialised_old_style_2.f
|
||||
new file mode 100644
|
||||
index 00000000000..d904c8b2974
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/dec_derived_types_initialised_old_style_2.f
|
||||
@@ -0,0 +1,25 @@
|
||||
+! { dg-do run }
|
||||
+! { dg-options "-std=legacy -fdec-old-init" }
|
||||
+!
|
||||
+! Test old style initializers in derived types
|
||||
+!
|
||||
+! Contributed by Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+ PROGRAM spec_in_var
|
||||
+ TYPE STRUCT1
|
||||
+ INTEGER*4 ID /8/
|
||||
+ INTEGER*4 TYPE /5/
|
||||
+ INTEGER*8 DEFVAL /0/
|
||||
+ CHARACTER*(5) NAME /'tests'/
|
||||
+ LOGICAL*1 NIL /0/
|
||||
+ END TYPE STRUCT1
|
||||
+
|
||||
+ TYPE (STRUCT1) SINST
|
||||
+
|
||||
+ IF(SINST%ID.NE.8) STOP 1
|
||||
+ IF(SINST%TYPE.NE.5) STOP 2
|
||||
+ IF(SINST%DEFVAL.NE.0) STOP 3
|
||||
+ IF(SINST%NAME.NE.'tests') STOP 4
|
||||
+ IF(SINST%NIL) STOP 5
|
||||
+ END
|
||||
diff --git a/gcc/testsuite/gfortran.dg/dec_derived_types_initialised_old_style_3.f b/gcc/testsuite/gfortran.dg/dec_derived_types_initialised_old_style_3.f
|
||||
new file mode 100644
|
||||
index 00000000000..58c2b4b66cf
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/dec_derived_types_initialised_old_style_3.f
|
||||
@@ -0,0 +1,26 @@
|
||||
+! { dg-do compile }
|
||||
+! { dg-options "-std=legacy -fdec -fno-dec-old-init" }
|
||||
+!
|
||||
+! Test old style initializers in derived types
|
||||
+!
|
||||
+! Contributed by Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+
|
||||
+ PROGRAM spec_in_var
|
||||
+ TYPE STRUCT1
|
||||
+ INTEGER*4 ID /8/ ! { dg-error "Invalid old style initialization" }
|
||||
+ INTEGER*4 TYPE /5/ ! { dg-error "Invalid old style initialization" }
|
||||
+ INTEGER*8 DEFVAL /0/ ! { dg-error "Invalid old style initialization" }
|
||||
+ CHARACTER*(5) NAME /'tests'/ ! { dg-error "Invalid old style initialization" }
|
||||
+ LOGICAL*1 NIL /0/ ! { dg-error "Invalid old style initialization" }
|
||||
+ END TYPE STRUCT1
|
||||
+
|
||||
+ TYPE (STRUCT1) SINST
|
||||
+
|
||||
+ IF(SINST%ID.NE.8) STOP 1 ! { dg-error "'id' at \\(1\\) is not a member" }
|
||||
+ IF(SINST%TYPE.NE.5) STOP 2 ! { dg-error "'type' at \\(1\\) is not a member" }
|
||||
+ IF(SINST%DEFVAL.NE.0) STOP 3 ! { dg-error "'defval' at \\(1\\) is not a member" }
|
||||
+ IF(SINST%NAME.NE.'tests') STOP 4 ! { dg-error "'name' at \\(1\\) is not a member" }
|
||||
+ IF(SINST%NIL) STOP 5 ! { dg-error "'nil' at \\(1\\) is not a member" }
|
||||
+ END
|
||||
--
|
||||
2.27.0
|
||||
|
@ -0,0 +1,588 @@
|
||||
From 786869fd62813e80da9b6545a295d53c36275c19 Mon Sep 17 00:00:00 2001
|
||||
From: Mark Eggleston <markeggleston@gcc.gnu.org>
|
||||
Date: Fri, 22 Jan 2021 13:12:14 +0000
|
||||
Subject: [PATCH 06/10] Allow string length and kind to be specified on a per
|
||||
variable basis.
|
||||
|
||||
This allows kind/length to be mixed with array specification in
|
||||
declarations.
|
||||
|
||||
e.g.
|
||||
|
||||
INTEGER*4 x*2, y*8
|
||||
CHARACTER names*20(10)
|
||||
REAL v(100)*8, vv*4(50)
|
||||
|
||||
The per-variable size overrides the kind or length specified for the type.
|
||||
|
||||
Use -fdec-override-kind to enable. Also enabled by -fdec.
|
||||
|
||||
Note: this feature is a merger of two previously separate features.
|
||||
|
||||
Now accepts named constants as kind parameters:
|
||||
|
||||
INTEGER A
|
||||
PARAMETER (A=2)
|
||||
INTEGER B*(A)
|
||||
|
||||
Contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
|
||||
Now rejects invalid kind parameters and prints error messages:
|
||||
|
||||
INTEGER X*3
|
||||
|
||||
caused an internal compiler error.
|
||||
|
||||
Contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
---
|
||||
gcc/fortran/decl.c | 156 ++++++++++++++----
|
||||
gcc/fortran/lang.opt | 4 +
|
||||
gcc/fortran/options.c | 1 +
|
||||
.../dec_mixed_char_array_declaration_1.f | 13 ++
|
||||
.../dec_mixed_char_array_declaration_2.f | 13 ++
|
||||
.../dec_mixed_char_array_declaration_3.f | 13 ++
|
||||
.../gfortran.dg/dec_spec_in_variable_1.f | 31 ++++
|
||||
.../gfortran.dg/dec_spec_in_variable_2.f | 31 ++++
|
||||
.../gfortran.dg/dec_spec_in_variable_3.f | 31 ++++
|
||||
.../gfortran.dg/dec_spec_in_variable_4.f | 14 ++
|
||||
.../gfortran.dg/dec_spec_in_variable_5.f | 19 +++
|
||||
.../gfortran.dg/dec_spec_in_variable_6.f | 19 +++
|
||||
.../gfortran.dg/dec_spec_in_variable_7.f | 15 ++
|
||||
.../gfortran.dg/dec_spec_in_variable_8.f | 14 ++
|
||||
14 files changed, 340 insertions(+), 34 deletions(-)
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/dec_mixed_char_array_declaration_1.f
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/dec_mixed_char_array_declaration_2.f
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/dec_mixed_char_array_declaration_3.f
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/dec_spec_in_variable_1.f
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/dec_spec_in_variable_2.f
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/dec_spec_in_variable_3.f
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/dec_spec_in_variable_4.f
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/dec_spec_in_variable_5.f
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/dec_spec_in_variable_6.f
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/dec_spec_in_variable_7.f
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/dec_spec_in_variable_8.f
|
||||
|
||||
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
|
||||
index 5c8c1b7981b..f7dc9d8263d 100644
|
||||
--- a/gcc/fortran/decl.c
|
||||
+++ b/gcc/fortran/decl.c
|
||||
@@ -1213,6 +1213,54 @@ syntax:
|
||||
return MATCH_ERROR;
|
||||
}
|
||||
|
||||
+/* This matches the nonstandard kind given after a variable name, like:
|
||||
+ INTEGER x*2, y*4
|
||||
+ The per-variable kind will override any kind given in the type
|
||||
+ declaration.
|
||||
+*/
|
||||
+
|
||||
+static match
|
||||
+match_per_symbol_kind (int *length)
|
||||
+{
|
||||
+ match m;
|
||||
+ gfc_expr *expr = NULL;
|
||||
+
|
||||
+ m = gfc_match_char ('*');
|
||||
+ if (m != MATCH_YES)
|
||||
+ return m;
|
||||
+
|
||||
+ m = gfc_match_small_literal_int (length, NULL);
|
||||
+ if (m == MATCH_YES || m == MATCH_ERROR)
|
||||
+ return m;
|
||||
+
|
||||
+ if (gfc_match_char ('(') == MATCH_NO)
|
||||
+ return MATCH_ERROR;
|
||||
+
|
||||
+ m = gfc_match_expr (&expr);
|
||||
+ if (m == MATCH_YES)
|
||||
+ {
|
||||
+ m = MATCH_ERROR; // Assume error
|
||||
+ if (gfc_expr_check_typed (expr, gfc_current_ns, false))
|
||||
+ {
|
||||
+ if ((expr->expr_type == EXPR_CONSTANT)
|
||||
+ && (expr->ts.type == BT_INTEGER))
|
||||
+ {
|
||||
+ *length = mpz_get_si(expr->value.integer);
|
||||
+ m = MATCH_YES;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (m == MATCH_YES)
|
||||
+ {
|
||||
+ if (gfc_match_char (')') == MATCH_NO)
|
||||
+ m = MATCH_ERROR;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (expr != NULL)
|
||||
+ gfc_free_expr (expr);
|
||||
+ return m;
|
||||
+}
|
||||
|
||||
/* Special subroutine for finding a symbol. Check if the name is found
|
||||
in the current name space. If not, and we're compiling a function or
|
||||
@@ -2443,6 +2491,35 @@ check_function_name (char *name)
|
||||
}
|
||||
|
||||
|
||||
+static match
|
||||
+match_character_length_clause (gfc_charlen **cl, bool *cl_deferred, int elem)
|
||||
+{
|
||||
+ gfc_expr* char_len;
|
||||
+ char_len = NULL;
|
||||
+
|
||||
+ match m = match_char_length (&char_len, cl_deferred, false);
|
||||
+ if (m == MATCH_YES)
|
||||
+ {
|
||||
+ *cl = gfc_new_charlen (gfc_current_ns, NULL);
|
||||
+ (*cl)->length = char_len;
|
||||
+ }
|
||||
+ else if (m == MATCH_NO)
|
||||
+ {
|
||||
+ if (elem > 1
|
||||
+ && (current_ts.u.cl->length == NULL
|
||||
+ || current_ts.u.cl->length->expr_type != EXPR_CONSTANT))
|
||||
+ {
|
||||
+ *cl = gfc_new_charlen (gfc_current_ns, NULL);
|
||||
+ (*cl)->length = gfc_copy_expr (current_ts.u.cl->length);
|
||||
+ }
|
||||
+ else
|
||||
+ *cl = current_ts.u.cl;
|
||||
+
|
||||
+ *cl_deferred = current_ts.deferred;
|
||||
+ }
|
||||
+ return m;
|
||||
+}
|
||||
+
|
||||
/* Match a variable name with an optional initializer. When this
|
||||
subroutine is called, a variable is expected to be parsed next.
|
||||
Depending on what is happening at the moment, updates either the
|
||||
@@ -2453,7 +2530,7 @@ variable_decl (int elem)
|
||||
{
|
||||
char name[GFC_MAX_SYMBOL_LEN + 1];
|
||||
static unsigned int fill_id = 0;
|
||||
- gfc_expr *initializer, *char_len;
|
||||
+ gfc_expr *initializer;
|
||||
gfc_array_spec *as;
|
||||
gfc_array_spec *cp_as; /* Extra copy for Cray Pointees. */
|
||||
gfc_charlen *cl;
|
||||
@@ -2462,11 +2539,15 @@ variable_decl (int elem)
|
||||
match m;
|
||||
bool t;
|
||||
gfc_symbol *sym;
|
||||
+ match cl_match;
|
||||
+ match kind_match;
|
||||
+ int overridden_kind;
|
||||
char c;
|
||||
|
||||
initializer = NULL;
|
||||
as = NULL;
|
||||
cp_as = NULL;
|
||||
+ kind_match = MATCH_NO;
|
||||
|
||||
/* When we get here, we've just matched a list of attributes and
|
||||
maybe a type and a double colon. The next thing we expect to see
|
||||
@@ -2519,6 +2600,28 @@ variable_decl (int elem)
|
||||
|
||||
var_locus = gfc_current_locus;
|
||||
|
||||
+
|
||||
+ cl = NULL;
|
||||
+ cl_deferred = false;
|
||||
+ cl_match = MATCH_NO;
|
||||
+
|
||||
+ /* Check for a character length clause before an array clause */
|
||||
+ if (flag_dec_override_kind)
|
||||
+ {
|
||||
+ if (current_ts.type == BT_CHARACTER)
|
||||
+ {
|
||||
+ cl_match = match_character_length_clause (&cl, &cl_deferred, elem);
|
||||
+ if (cl_match == MATCH_ERROR)
|
||||
+ goto cleanup;
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ kind_match = match_per_symbol_kind (&overridden_kind);
|
||||
+ if (kind_match == MATCH_ERROR)
|
||||
+ goto cleanup;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
/* Now we could see the optional array spec. or character length. */
|
||||
m = gfc_match_array_spec (&as, true, true);
|
||||
if (m == MATCH_ERROR)
|
||||
@@ -2667,40 +2770,12 @@ variable_decl (int elem)
|
||||
}
|
||||
}
|
||||
|
||||
- char_len = NULL;
|
||||
- cl = NULL;
|
||||
- cl_deferred = false;
|
||||
-
|
||||
- if (current_ts.type == BT_CHARACTER)
|
||||
+ /* Second chance for a character length clause */
|
||||
+ if (cl_match == MATCH_NO && current_ts.type == BT_CHARACTER)
|
||||
{
|
||||
- switch (match_char_length (&char_len, &cl_deferred, false))
|
||||
- {
|
||||
- case MATCH_YES:
|
||||
- cl = gfc_new_charlen (gfc_current_ns, NULL);
|
||||
-
|
||||
- cl->length = char_len;
|
||||
- break;
|
||||
-
|
||||
- /* Non-constant lengths need to be copied after the first
|
||||
- element. Also copy assumed lengths. */
|
||||
- case MATCH_NO:
|
||||
- if (elem > 1
|
||||
- && (current_ts.u.cl->length == NULL
|
||||
- || current_ts.u.cl->length->expr_type != EXPR_CONSTANT))
|
||||
- {
|
||||
- cl = gfc_new_charlen (gfc_current_ns, NULL);
|
||||
- cl->length = gfc_copy_expr (current_ts.u.cl->length);
|
||||
- }
|
||||
- else
|
||||
- cl = current_ts.u.cl;
|
||||
-
|
||||
- cl_deferred = current_ts.deferred;
|
||||
-
|
||||
- break;
|
||||
-
|
||||
- case MATCH_ERROR:
|
||||
- goto cleanup;
|
||||
- }
|
||||
+ m = match_character_length_clause (&cl, &cl_deferred, elem);
|
||||
+ if (m == MATCH_ERROR)
|
||||
+ goto cleanup;
|
||||
}
|
||||
|
||||
/* The dummy arguments and result of the abreviated form of MODULE
|
||||
@@ -2802,6 +2877,19 @@ variable_decl (int elem)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
+ if (kind_match == MATCH_YES)
|
||||
+ {
|
||||
+ gfc_find_symbol (name, gfc_current_ns, 1, &sym);
|
||||
+ /* sym *must* be found at this point */
|
||||
+ sym->ts.kind = overridden_kind;
|
||||
+ if (gfc_validate_kind (sym->ts.type, sym->ts.kind, true) < 0)
|
||||
+ {
|
||||
+ gfc_error ("Kind %d not supported for type %s at %C",
|
||||
+ sym->ts.kind, gfc_basic_typename (sym->ts.type));
|
||||
+ return MATCH_ERROR;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
if (!check_function_name (name))
|
||||
{
|
||||
m = MATCH_ERROR;
|
||||
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
|
||||
index 25cc948699b..4a269ebb22d 100644
|
||||
--- a/gcc/fortran/lang.opt
|
||||
+++ b/gcc/fortran/lang.opt
|
||||
@@ -493,6 +493,10 @@ fdec-non-integer-index
|
||||
Fortran Var(flag_dec_non_integer_index)
|
||||
Enable support for non-integer substring indexes.
|
||||
|
||||
+fdec-override-kind
|
||||
+Fortran Var(flag_dec_override_kind)
|
||||
+Enable support for per variable kind specification.
|
||||
+
|
||||
fdec-old-init
|
||||
Fortran Var(flag_dec_old_init)
|
||||
Enable support for old style initializers in derived types.
|
||||
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
|
||||
index d6bd36c3a8a..edbab483b36 100644
|
||||
--- a/gcc/fortran/options.c
|
||||
+++ b/gcc/fortran/options.c
|
||||
@@ -80,6 +80,7 @@ set_dec_flags (int value)
|
||||
SET_BITFLAG (flag_dec_duplicates, value, value);
|
||||
SET_BITFLAG (flag_dec_non_integer_index, value, value);
|
||||
SET_BITFLAG (flag_dec_old_init, value, value);
|
||||
+ SET_BITFLAG (flag_dec_override_kind, value, value);
|
||||
}
|
||||
|
||||
/* Finalize DEC flags. */
|
||||
diff --git a/gcc/testsuite/gfortran.dg/dec_mixed_char_array_declaration_1.f b/gcc/testsuite/gfortran.dg/dec_mixed_char_array_declaration_1.f
|
||||
new file mode 100644
|
||||
index 00000000000..706ea4112a4
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/dec_mixed_char_array_declaration_1.f
|
||||
@@ -0,0 +1,13 @@
|
||||
+! { dg-do run }
|
||||
+! { dg-options "-fdec" }
|
||||
+!
|
||||
+! Test character declaration with mixed string length and array specification
|
||||
+!
|
||||
+! Contributed by Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+ PROGRAM character_declaration
|
||||
+ CHARACTER ASPEC_SLENGTH*2 (5) /'01','02','03','04','05'/
|
||||
+ CHARACTER SLENGTH_ASPEC(5)*2 /'01','02','03','04','05'/
|
||||
+ if (ASPEC_SLENGTH(3).NE.SLENGTH_ASPEC(3)) STOP 1
|
||||
+ END
|
||||
diff --git a/gcc/testsuite/gfortran.dg/dec_mixed_char_array_declaration_2.f b/gcc/testsuite/gfortran.dg/dec_mixed_char_array_declaration_2.f
|
||||
new file mode 100644
|
||||
index 00000000000..26d2acf01de
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/dec_mixed_char_array_declaration_2.f
|
||||
@@ -0,0 +1,13 @@
|
||||
+! { dg-do run }
|
||||
+! { dg-options "-fdec-override-kind" }
|
||||
+!
|
||||
+! Test character declaration with mixed string length and array specification
|
||||
+!
|
||||
+! Contributed by Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+ PROGRAM character_declaration
|
||||
+ CHARACTER ASPEC_SLENGTH*2 (5) /'01','02','03','04','05'/
|
||||
+ CHARACTER SLENGTH_ASPEC(5)*2 /'01','02','03','04','05'/
|
||||
+ if (ASPEC_SLENGTH(3).NE.SLENGTH_ASPEC(3)) STOP 1
|
||||
+ END
|
||||
diff --git a/gcc/testsuite/gfortran.dg/dec_mixed_char_array_declaration_3.f b/gcc/testsuite/gfortran.dg/dec_mixed_char_array_declaration_3.f
|
||||
new file mode 100644
|
||||
index 00000000000..76e4f0bdb93
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/dec_mixed_char_array_declaration_3.f
|
||||
@@ -0,0 +1,13 @@
|
||||
+! { dg-do compile }
|
||||
+! { dg-options "-fdec-override-kind -fno-dec-override-kind" }
|
||||
+!
|
||||
+! Test character declaration with mixed string length and array specification
|
||||
+!
|
||||
+! Contributed by Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+ PROGRAM character_declaration
|
||||
+ CHARACTER ASPEC_SLENGTH*2 (5) /'01','02','03','04','05'/ ! { dg-error "Syntax error" }
|
||||
+ CHARACTER SLENGTH_ASPEC(5)*2 /'01','02','03','04','05'/
|
||||
+ if (ASPEC_SLENGTH(3).NE.SLENGTH_ASPEC(3)) STOP 1 ! { dg-error " Operands of comparison operator" }
|
||||
+ END
|
||||
diff --git a/gcc/testsuite/gfortran.dg/dec_spec_in_variable_1.f b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_1.f
|
||||
new file mode 100644
|
||||
index 00000000000..edd0f5874b7
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_1.f
|
||||
@@ -0,0 +1,31 @@
|
||||
+! { dg-do run }
|
||||
+! { dg-options "-fdec" }
|
||||
+!
|
||||
+! Test kind specification in variable not in type
|
||||
+!
|
||||
+! Contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+ program spec_in_var
|
||||
+ integer*8 ai*1, bi*4, ci
|
||||
+ real*4 ar*4, br*8, cr
|
||||
+
|
||||
+ ai = 1
|
||||
+ ar = 1.0
|
||||
+ bi = 2
|
||||
+ br = 2.0
|
||||
+ ci = 3
|
||||
+ cr = 3.0
|
||||
+
|
||||
+ if (ai .ne. 1) stop 1
|
||||
+ if (abs(ar - 1.0) > 1.0D-6) stop 2
|
||||
+ if (bi .ne. 2) stop 3
|
||||
+ if (abs(br - 2.0) > 1.0D-6) stop 4
|
||||
+ if (ci .ne. 3) stop 5
|
||||
+ if (abs(cr - 3.0) > 1.0D-6) stop 6
|
||||
+ if (kind(ai) .ne. 1) stop 7
|
||||
+ if (kind(ar) .ne. 4) stop 8
|
||||
+ if (kind(bi) .ne. 4) stop 9
|
||||
+ if (kind(br) .ne. 8) stop 10
|
||||
+ if (kind(ci) .ne. 8) stop 11
|
||||
+ if (kind(cr) .ne. 4) stop 12
|
||||
+ end
|
||||
diff --git a/gcc/testsuite/gfortran.dg/dec_spec_in_variable_2.f b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_2.f
|
||||
new file mode 100644
|
||||
index 00000000000..bfaba584dbb
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_2.f
|
||||
@@ -0,0 +1,31 @@
|
||||
+! { dg-do run }
|
||||
+! { dg-options "-fdec-override-kind" }
|
||||
+!
|
||||
+! Test kind specification in variable not in type
|
||||
+!
|
||||
+! Contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+ program spec_in_var
|
||||
+ integer*8 ai*1, bi*4, ci
|
||||
+ real*4 ar*4, br*8, cr
|
||||
+
|
||||
+ ai = 1
|
||||
+ ar = 1.0
|
||||
+ bi = 2
|
||||
+ br = 2.0
|
||||
+ ci = 3
|
||||
+ cr = 3.0
|
||||
+
|
||||
+ if (ai .ne. 1) stop 1
|
||||
+ if (abs(ar - 1.0) > 1.0D-6) stop 2
|
||||
+ if (bi .ne. 2) stop 3
|
||||
+ if (abs(br - 2.0) > 1.0D-6) stop 4
|
||||
+ if (ci .ne. 3) stop 5
|
||||
+ if (abs(cr - 3.0) > 1.0D-6) stop 6
|
||||
+ if (kind(ai) .ne. 1) stop 7
|
||||
+ if (kind(ar) .ne. 4) stop 8
|
||||
+ if (kind(bi) .ne. 4) stop 9
|
||||
+ if (kind(br) .ne. 8) stop 10
|
||||
+ if (kind(ci) .ne. 8) stop 11
|
||||
+ if (kind(cr) .ne. 4) stop 12
|
||||
+ end
|
||||
diff --git a/gcc/testsuite/gfortran.dg/dec_spec_in_variable_3.f b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_3.f
|
||||
new file mode 100644
|
||||
index 00000000000..5ff434e7466
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_3.f
|
||||
@@ -0,0 +1,31 @@
|
||||
+! { dg-do compile }
|
||||
+! { dg-options "-fdec -fno-dec-override-kind" }
|
||||
+!
|
||||
+! Test kind specification in variable not in type
|
||||
+!
|
||||
+! Contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+ program spec_in_var
|
||||
+ integer*8 ai*1, bi*4, ci ! { dg-error "Syntax error" }
|
||||
+ real*4 ar*4, br*8, cr ! { dg-error "Syntax error" }
|
||||
+
|
||||
+ ai = 1
|
||||
+ ar = 1.0
|
||||
+ bi = 2
|
||||
+ br = 2.0
|
||||
+ ci = 3
|
||||
+ cr = 3.0
|
||||
+
|
||||
+ if (ai .ne. 1) stop 1
|
||||
+ if (abs(ar - 1.0) > 1.0D-6) stop 2
|
||||
+ if (bi .ne. 2) stop 3
|
||||
+ if (abs(br - 2.0) > 1.0D-6) stop 4
|
||||
+ if (ci .ne. 3) stop 5
|
||||
+ if (abs(cr - 3.0) > 1.0D-6) stop 6
|
||||
+ if (kind(ai) .ne. 1) stop 7
|
||||
+ if (kind(ar) .ne. 4) stop 8
|
||||
+ if (kind(bi) .ne. 4) stop 9
|
||||
+ if (kind(br) .ne. 8) stop 10
|
||||
+ if (kind(ci) .ne. 8) stop 11
|
||||
+ if (kind(cr) .ne. 4) stop 12
|
||||
+ end
|
||||
diff --git a/gcc/testsuite/gfortran.dg/dec_spec_in_variable_4.f b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_4.f
|
||||
new file mode 100644
|
||||
index 00000000000..c01980e8b9d
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_4.f
|
||||
@@ -0,0 +1,14 @@
|
||||
+! { dg-do compile }
|
||||
+!
|
||||
+! Test kind specification in variable not in type. The per variable
|
||||
+! kind specification is not enabled so these should fail
|
||||
+!
|
||||
+! Contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+ program spec_in_var
|
||||
+ integer a
|
||||
+ parameter(a=2)
|
||||
+ integer b*(a) ! { dg-error "Syntax error" }
|
||||
+ real c*(8) ! { dg-error "Syntax error" }
|
||||
+ logical d*1_1 ! { dg-error "Syntax error" }
|
||||
+ end
|
||||
diff --git a/gcc/testsuite/gfortran.dg/dec_spec_in_variable_5.f b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_5.f
|
||||
new file mode 100644
|
||||
index 00000000000..e2f39da3f4f
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_5.f
|
||||
@@ -0,0 +1,19 @@
|
||||
+! { dg-do run }
|
||||
+! { dg-options "-fdec-override-kind" }
|
||||
+!
|
||||
+! Test kind specification in variable not in type
|
||||
+!
|
||||
+! Contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+ program spec_in_var
|
||||
+ integer a
|
||||
+ parameter(a=2)
|
||||
+ integer b*(a)
|
||||
+ real c*(8)
|
||||
+ logical d*(1_1)
|
||||
+ character e*(a)
|
||||
+ if (kind(b).ne.2) stop 1
|
||||
+ if (kind(c).ne.8) stop 2
|
||||
+ if (kind(d).ne.1) stop 3
|
||||
+ if (len(e).ne.2) stop 4
|
||||
+ end
|
||||
diff --git a/gcc/testsuite/gfortran.dg/dec_spec_in_variable_6.f b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_6.f
|
||||
new file mode 100644
|
||||
index 00000000000..569747874e3
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_6.f
|
||||
@@ -0,0 +1,19 @@
|
||||
+! { dg-do run }
|
||||
+! { dg-options "-fdec" }
|
||||
+!
|
||||
+! Test kind specification in variable not in type
|
||||
+!
|
||||
+! Contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+ program spec_in_var
|
||||
+ integer a
|
||||
+ parameter(a=2)
|
||||
+ integer b*(a)
|
||||
+ real c*(8)
|
||||
+ logical d*(1_1)
|
||||
+ character e*(a)
|
||||
+ if (kind(b).ne.2) stop 1
|
||||
+ if (kind(c).ne.8) stop 2
|
||||
+ if (kind(d).ne.1) stop 3
|
||||
+ if (len(e).ne.2) stop 4
|
||||
+ end
|
||||
diff --git a/gcc/testsuite/gfortran.dg/dec_spec_in_variable_7.f b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_7.f
|
||||
new file mode 100644
|
||||
index 00000000000..b975bfd15c5
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_7.f
|
||||
@@ -0,0 +1,15 @@
|
||||
+! { dg-do compile }
|
||||
+! { dg-options "-fdec -fno-dec-override-kind" }
|
||||
+!
|
||||
+! Test kind specification in variable not in type as the per variable
|
||||
+! kind specification is not enables these should fail
|
||||
+!
|
||||
+! Contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+ program spec_in_var
|
||||
+ integer a
|
||||
+ parameter(a=2)
|
||||
+ integer b*(a) ! { dg-error "Syntax error" }
|
||||
+ real c*(8) ! { dg-error "Syntax error" }
|
||||
+ logical d*1_1 ! { dg-error "Syntax error" }
|
||||
+ end
|
||||
diff --git a/gcc/testsuite/gfortran.dg/dec_spec_in_variable_8.f b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_8.f
|
||||
new file mode 100644
|
||||
index 00000000000..85732e0bd85
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_8.f
|
||||
@@ -0,0 +1,14 @@
|
||||
+! { dg-do compile }
|
||||
+! { dg-options "-fdec" }
|
||||
+!
|
||||
+! Check that invalid kind values are rejected.
|
||||
+!
|
||||
+! Contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+ program spec_in_var
|
||||
+ integer a
|
||||
+ parameter(a=3)
|
||||
+ integer b*(a) ! { dg-error "Kind 3 not supported" }
|
||||
+ real c*(78) ! { dg-error "Kind 78 not supported" }
|
||||
+ logical d*(*) ! { dg-error "Invalid character" }
|
||||
+ end
|
||||
--
|
||||
2.27.0
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,262 @@
|
||||
From bb76446db10c21860a4e19569ce3e350d8a2b59f Mon Sep 17 00:00:00 2001
|
||||
From: Mark Eggleston <markeggleston@gcc.gnu.org>
|
||||
Date: Fri, 22 Jan 2021 15:00:44 +0000
|
||||
Subject: [PATCH 09/10] Add the SEQUENCE attribute by default if it's not
|
||||
present.
|
||||
|
||||
Use -fdec-sequence to enable this feature. Also enabled by -fdec.
|
||||
---
|
||||
gcc/fortran/lang.opt | 4 ++
|
||||
gcc/fortran/options.c | 1 +
|
||||
gcc/fortran/resolve.c | 13 ++++-
|
||||
...dd_SEQUENCE_to_COMMON_block_by_default_1.f | 57 +++++++++++++++++++
|
||||
...dd_SEQUENCE_to_COMMON_block_by_default_2.f | 57 +++++++++++++++++++
|
||||
...dd_SEQUENCE_to_COMMON_block_by_default_3.f | 57 +++++++++++++++++++
|
||||
6 files changed, 186 insertions(+), 3 deletions(-)
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/dec_add_SEQUENCE_to_COMMON_block_by_default_1.f
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/dec_add_SEQUENCE_to_COMMON_block_by_default_2.f
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/dec_add_SEQUENCE_to_COMMON_block_by_default_3.f
|
||||
|
||||
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
|
||||
index 4ca2f93f2df..019c798cf09 100644
|
||||
--- a/gcc/fortran/lang.opt
|
||||
+++ b/gcc/fortran/lang.opt
|
||||
@@ -509,6 +509,10 @@ fdec-promotion
|
||||
Fortran Var(flag_dec_promotion)
|
||||
Add support for type promotion in intrinsic arguments.
|
||||
|
||||
+fdec-sequence
|
||||
+Fortran Var(flag_dec_sequence)
|
||||
+Add the SEQUENCE attribute by default if it's not present.
|
||||
+
|
||||
fdec-structure
|
||||
Fortran Var(flag_dec_structure)
|
||||
Enable support for DEC STRUCTURE/RECORD.
|
||||
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
|
||||
index 15079c7e95a..050f56fdc25 100644
|
||||
--- a/gcc/fortran/options.c
|
||||
+++ b/gcc/fortran/options.c
|
||||
@@ -83,6 +83,7 @@ set_dec_flags (int value)
|
||||
SET_BITFLAG (flag_dec_override_kind, value, value);
|
||||
SET_BITFLAG (flag_dec_non_logical_if, value, value);
|
||||
SET_BITFLAG (flag_dec_promotion, value, value);
|
||||
+ SET_BITFLAG (flag_dec_sequence, value, value);
|
||||
}
|
||||
|
||||
/* Finalize DEC flags. */
|
||||
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
|
||||
index 07dd039f3bf..fe7d0cc5944 100644
|
||||
--- a/gcc/fortran/resolve.c
|
||||
+++ b/gcc/fortran/resolve.c
|
||||
@@ -978,9 +978,16 @@ resolve_common_vars (gfc_common_head *common_block, bool named_common)
|
||||
|
||||
if (!(csym->ts.u.derived->attr.sequence
|
||||
|| csym->ts.u.derived->attr.is_bind_c))
|
||||
- gfc_error_now ("Derived type variable %qs in COMMON at %L "
|
||||
- "has neither the SEQUENCE nor the BIND(C) "
|
||||
- "attribute", csym->name, &csym->declared_at);
|
||||
+ {
|
||||
+ if (flag_dec_sequence)
|
||||
+ /* Assume sequence. */
|
||||
+ csym->ts.u.derived->attr.sequence = 1;
|
||||
+ else
|
||||
+ gfc_error_now ("Derived type variable '%s' in COMMON at %L "
|
||||
+ "has neither the SEQUENCE nor the BIND(C) "
|
||||
+ "attribute", csym->name, &csym->declared_at);
|
||||
+ }
|
||||
+
|
||||
if (csym->ts.u.derived->attr.alloc_comp)
|
||||
gfc_error_now ("Derived type variable %qs in COMMON at %L "
|
||||
"has an ultimate component that is "
|
||||
diff --git a/gcc/testsuite/gfortran.dg/dec_add_SEQUENCE_to_COMMON_block_by_default_1.f b/gcc/testsuite/gfortran.dg/dec_add_SEQUENCE_to_COMMON_block_by_default_1.f
|
||||
new file mode 100644
|
||||
index 00000000000..fe7b39625eb
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/dec_add_SEQUENCE_to_COMMON_block_by_default_1.f
|
||||
@@ -0,0 +1,57 @@
|
||||
+! { dg-do run }
|
||||
+! { dg-options "-fdec" }
|
||||
+!
|
||||
+! Test add default SEQUENCE attribute derived types appearing in
|
||||
+! COMMON blocks and EQUIVALENCE statements.
|
||||
+!
|
||||
+! Contributed by Francisco Redondo Marchena <francisco.marchena@codethink.co.uk>
|
||||
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+ MODULE SEQ
|
||||
+ TYPE STRUCT1
|
||||
+ INTEGER*4 ID
|
||||
+ INTEGER*4 TYPE
|
||||
+ INTEGER*8 DEFVAL
|
||||
+ CHARACTER*(4) NAME
|
||||
+ LOGICAL*1 NIL
|
||||
+ END TYPE STRUCT1
|
||||
+ END MODULE
|
||||
+
|
||||
+ SUBROUTINE A
|
||||
+ USE SEQ
|
||||
+ TYPE (STRUCT1) S
|
||||
+ COMMON /BLOCK1/ S
|
||||
+ IF (S%ID.NE.5) STOP 1
|
||||
+ IF (S%TYPE.NE.1000) STOP 2
|
||||
+ IF (S%DEFVAL.NE.-99) STOP 3
|
||||
+ IF (S%NAME.NE."JANE") STOP 4
|
||||
+ IF (S%NIL.NEQV..FALSE.) STOP 5
|
||||
+ END SUBROUTINE
|
||||
+
|
||||
+ PROGRAM sequence_att_common
|
||||
+ USE SEQ
|
||||
+ IMPLICIT NONE
|
||||
+ TYPE (STRUCT1) S1
|
||||
+ TYPE (STRUCT1) S2
|
||||
+ TYPE (STRUCT1) S3
|
||||
+
|
||||
+ EQUIVALENCE (S1,S2)
|
||||
+ COMMON /BLOCK1/ S3
|
||||
+
|
||||
+ S1%ID = 5
|
||||
+ S1%TYPE = 1000
|
||||
+ S1%DEFVAL = -99
|
||||
+ S1%NAME = "JANE"
|
||||
+ S1%NIL = .FALSE.
|
||||
+
|
||||
+ IF (S2%ID.NE.5) STOP 1
|
||||
+ IF (S2%TYPE.NE.1000) STOP 2
|
||||
+ IF (S2%DEFVAL.NE.-99) STOP 3
|
||||
+ IF (S2%NAME.NE."JANE") STOP 4
|
||||
+ IF (S2%NIL.NEQV..FALSE.) STOP 5
|
||||
+
|
||||
+ S3 = S1
|
||||
+
|
||||
+ CALL A
|
||||
+
|
||||
+ END
|
||||
diff --git a/gcc/testsuite/gfortran.dg/dec_add_SEQUENCE_to_COMMON_block_by_default_2.f b/gcc/testsuite/gfortran.dg/dec_add_SEQUENCE_to_COMMON_block_by_default_2.f
|
||||
new file mode 100644
|
||||
index 00000000000..83512f0f3a2
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/dec_add_SEQUENCE_to_COMMON_block_by_default_2.f
|
||||
@@ -0,0 +1,57 @@
|
||||
+! { dg-do run }
|
||||
+! { dg-options "-fdec-sequence" }
|
||||
+!
|
||||
+! Test add default SEQUENCE attribute derived types appearing in
|
||||
+! COMMON blocks and EQUIVALENCE statements.
|
||||
+!
|
||||
+! Contributed by Francisco Redondo Marchena <francisco.marchena@codethink.co.uk>
|
||||
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+ MODULE SEQ
|
||||
+ TYPE STRUCT1
|
||||
+ INTEGER*4 ID
|
||||
+ INTEGER*4 TYPE
|
||||
+ INTEGER*8 DEFVAL
|
||||
+ CHARACTER*(4) NAME
|
||||
+ LOGICAL*1 NIL
|
||||
+ END TYPE STRUCT1
|
||||
+ END MODULE
|
||||
+
|
||||
+ SUBROUTINE A
|
||||
+ USE SEQ
|
||||
+ TYPE (STRUCT1) S
|
||||
+ COMMON /BLOCK1/ S
|
||||
+ IF (S%ID.NE.5) STOP 1
|
||||
+ IF (S%TYPE.NE.1000) STOP 2
|
||||
+ IF (S%DEFVAL.NE.-99) STOP 3
|
||||
+ IF (S%NAME.NE."JANE") STOP 4
|
||||
+ IF (S%NIL.NEQV..FALSE.) STOP 5
|
||||
+ END SUBROUTINE
|
||||
+
|
||||
+ PROGRAM sequence_att_common
|
||||
+ USE SEQ
|
||||
+ IMPLICIT NONE
|
||||
+ TYPE (STRUCT1) S1
|
||||
+ TYPE (STRUCT1) S2
|
||||
+ TYPE (STRUCT1) S3
|
||||
+
|
||||
+ EQUIVALENCE (S1,S2)
|
||||
+ COMMON /BLOCK1/ S3
|
||||
+
|
||||
+ S1%ID = 5
|
||||
+ S1%TYPE = 1000
|
||||
+ S1%DEFVAL = -99
|
||||
+ S1%NAME = "JANE"
|
||||
+ S1%NIL = .FALSE.
|
||||
+
|
||||
+ IF (S2%ID.NE.5) STOP 1
|
||||
+ IF (S2%TYPE.NE.1000) STOP 2
|
||||
+ IF (S2%DEFVAL.NE.-99) STOP 3
|
||||
+ IF (S2%NAME.NE."JANE") STOP 4
|
||||
+ IF (S2%NIL.NEQV..FALSE.) STOP 5
|
||||
+
|
||||
+ S3 = S1
|
||||
+
|
||||
+ CALL A
|
||||
+
|
||||
+ END
|
||||
diff --git a/gcc/testsuite/gfortran.dg/dec_add_SEQUENCE_to_COMMON_block_by_default_3.f b/gcc/testsuite/gfortran.dg/dec_add_SEQUENCE_to_COMMON_block_by_default_3.f
|
||||
new file mode 100644
|
||||
index 00000000000..26cd59f9090
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/dec_add_SEQUENCE_to_COMMON_block_by_default_3.f
|
||||
@@ -0,0 +1,57 @@
|
||||
+! { dg-do compile }
|
||||
+! { dg-options "-fdec -fno-dec-sequence" }
|
||||
+!
|
||||
+! Test add default SEQUENCE attribute derived types appearing in
|
||||
+! COMMON blocks and EQUIVALENCE statements.
|
||||
+!
|
||||
+! Contributed by Francisco Redondo Marchena <francisco.marchena@codethink.co.uk>
|
||||
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+ MODULE SEQ
|
||||
+ TYPE STRUCT1
|
||||
+ INTEGER*4 ID
|
||||
+ INTEGER*4 TYPE
|
||||
+ INTEGER*8 DEFVAL
|
||||
+ CHARACTER*(4) NAME
|
||||
+ LOGICAL*1 NIL
|
||||
+ END TYPE STRUCT1
|
||||
+ END MODULE
|
||||
+
|
||||
+ SUBROUTINE A
|
||||
+ USE SEQ
|
||||
+ TYPE (STRUCT1) S ! { dg-error "Derived type variable" }
|
||||
+ COMMON /BLOCK1/ S
|
||||
+ IF (S%ID.NE.5) STOP 1
|
||||
+ IF (S%TYPE.NE.1000) STOP 2
|
||||
+ IF (S%DEFVAL.NE.-99) STOP 3
|
||||
+ IF (S%NAME.NE."JANE") STOP 4
|
||||
+ IF (S%NIL.NEQV..FALSE.) STOP 5
|
||||
+ END SUBROUTINE
|
||||
+
|
||||
+ PROGRAM sequence_att_common
|
||||
+ USE SEQ
|
||||
+ IMPLICIT NONE
|
||||
+ TYPE (STRUCT1) S1
|
||||
+ TYPE (STRUCT1) S2
|
||||
+ TYPE (STRUCT1) S3 ! { dg-error "Derived type variable" }
|
||||
+
|
||||
+ EQUIVALENCE (S1,S2) ! { dg-error "Derived type variable" }
|
||||
+ COMMON /BLOCK1/ S3
|
||||
+
|
||||
+ S1%ID = 5
|
||||
+ S1%TYPE = 1000
|
||||
+ S1%DEFVAL = -99
|
||||
+ S1%NAME = "JANE"
|
||||
+ S1%NIL = .FALSE.
|
||||
+
|
||||
+ IF (S2%ID.NE.5) STOP 1
|
||||
+ IF (S2%TYPE.NE.1000) STOP 2
|
||||
+ IF (S2%DEFVAL.NE.-99) STOP 3
|
||||
+ IF (S2%NAME.NE."JANE") STOP 4
|
||||
+ IF (S2%NIL.NEQV..FALSE.) STOP 5
|
||||
+
|
||||
+ S3 = S1
|
||||
+
|
||||
+ CALL A
|
||||
+
|
||||
+ END
|
||||
--
|
||||
2.27.0
|
||||
|
@ -0,0 +1,305 @@
|
||||
From 9b45f3063dfd2b893e7963a4828c1b0afecdc68a Mon Sep 17 00:00:00 2001
|
||||
From: Mark Eggleston <markeggleston@gcc.gnu.org>
|
||||
Date: Fri, 22 Jan 2021 12:41:46 +0000
|
||||
Subject: [PATCH 02/10] Convert LOGICAL to INTEGER for arithmetic ops, and vice
|
||||
versa
|
||||
|
||||
We allow converting LOGICAL types to INTEGER when doing arithmetic
|
||||
operations, and converting INTEGER types to LOGICAL for use in
|
||||
boolean operations.
|
||||
|
||||
This feature is enabled with the -flogical-as-integer flag.
|
||||
|
||||
Note: using this feature will disable bitwise logical operations enabled by
|
||||
-fdec.
|
||||
---
|
||||
gcc/fortran/lang.opt | 4 ++
|
||||
gcc/fortran/resolve.c | 55 ++++++++++++++++++-
|
||||
.../logical_to_integer_and_vice_versa_1.f | 31 +++++++++++
|
||||
.../logical_to_integer_and_vice_versa_2.f | 31 +++++++++++
|
||||
.../logical_to_integer_and_vice_versa_3.f | 33 +++++++++++
|
||||
.../logical_to_integer_and_vice_versa_4.f | 33 +++++++++++
|
||||
6 files changed, 186 insertions(+), 1 deletion(-)
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_1.f
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_2.f
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_3.f
|
||||
create mode 100644 gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_4.f
|
||||
|
||||
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
|
||||
index 52bd522051e..c4da248f07c 100644
|
||||
--- a/gcc/fortran/lang.opt
|
||||
+++ b/gcc/fortran/lang.opt
|
||||
@@ -497,6 +497,10 @@ fdec-static
|
||||
Fortran Var(flag_dec_static)
|
||||
Enable DEC-style STATIC and AUTOMATIC attributes.
|
||||
|
||||
+flogical-as-integer
|
||||
+Fortran Var(flag_logical_as_integer)
|
||||
+Convert from integer to logical or logical to integer for arithmetic operations.
|
||||
+
|
||||
fdefault-double-8
|
||||
Fortran Var(flag_default_double)
|
||||
Set the default double precision kind to an 8 byte wide type.
|
||||
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
|
||||
index c075d0fa0c4..4b90cb59902 100644
|
||||
--- a/gcc/fortran/resolve.c
|
||||
+++ b/gcc/fortran/resolve.c
|
||||
@@ -3915,7 +3915,6 @@ lookup_uop_fuzzy (const char *op, gfc_symtree *uop)
|
||||
return gfc_closest_fuzzy_match (op, candidates);
|
||||
}
|
||||
|
||||
-
|
||||
/* Callback finding an impure function as an operand to an .and. or
|
||||
.or. expression. Remember the last function warned about to
|
||||
avoid double warnings when recursing. */
|
||||
@@ -3975,6 +3974,22 @@ convert_hollerith_to_character (gfc_expr *e)
|
||||
}
|
||||
}
|
||||
|
||||
+/* If E is a logical, convert it to an integer and issue a warning
|
||||
+ for the conversion. */
|
||||
+
|
||||
+static void
|
||||
+convert_integer_to_logical (gfc_expr *e)
|
||||
+{
|
||||
+ if (e->ts.type == BT_INTEGER)
|
||||
+ {
|
||||
+ /* Convert to LOGICAL */
|
||||
+ gfc_typespec t;
|
||||
+ t.type = BT_LOGICAL;
|
||||
+ t.kind = 1;
|
||||
+ gfc_convert_type_warn (e, &t, 2, 1);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
/* Convert to numeric and issue a warning for the conversion. */
|
||||
|
||||
static void
|
||||
@@ -3987,6 +4002,22 @@ convert_to_numeric (gfc_expr *a, gfc_expr *b)
|
||||
gfc_convert_type_warn (a, &t, 2, 1);
|
||||
}
|
||||
|
||||
+/* If E is a logical, convert it to an integer and issue a warning
|
||||
+ for the conversion. */
|
||||
+
|
||||
+static void
|
||||
+convert_logical_to_integer (gfc_expr *e)
|
||||
+{
|
||||
+ if (e->ts.type == BT_LOGICAL)
|
||||
+ {
|
||||
+ /* Convert to INTEGER */
|
||||
+ gfc_typespec t;
|
||||
+ t.type = BT_INTEGER;
|
||||
+ t.kind = 1;
|
||||
+ gfc_convert_type_warn (e, &t, 2, 1);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
/* Resolve an operator expression node. This can involve replacing the
|
||||
operation with a user defined function call. */
|
||||
|
||||
@@ -4072,6 +4103,12 @@ resolve_operator (gfc_expr *e)
|
||||
case INTRINSIC_TIMES:
|
||||
case INTRINSIC_DIVIDE:
|
||||
case INTRINSIC_POWER:
|
||||
+ if (flag_logical_as_integer)
|
||||
+ {
|
||||
+ convert_logical_to_integer (op1);
|
||||
+ convert_logical_to_integer (op2);
|
||||
+ }
|
||||
+
|
||||
if (gfc_numeric_ts (&op1->ts) && gfc_numeric_ts (&op2->ts))
|
||||
{
|
||||
gfc_type_convert_binary (e, 1);
|
||||
@@ -4108,6 +4145,13 @@ resolve_operator (gfc_expr *e)
|
||||
case INTRINSIC_OR:
|
||||
case INTRINSIC_EQV:
|
||||
case INTRINSIC_NEQV:
|
||||
+
|
||||
+ if (flag_logical_as_integer)
|
||||
+ {
|
||||
+ convert_integer_to_logical (op1);
|
||||
+ convert_integer_to_logical (op2);
|
||||
+ }
|
||||
+
|
||||
if (op1->ts.type == BT_LOGICAL && op2->ts.type == BT_LOGICAL)
|
||||
{
|
||||
e->ts.type = BT_LOGICAL;
|
||||
@@ -4158,6 +4202,9 @@ resolve_operator (gfc_expr *e)
|
||||
goto simplify_op;
|
||||
}
|
||||
|
||||
+ if (flag_logical_as_integer)
|
||||
+ convert_integer_to_logical (op1);
|
||||
+
|
||||
if (op1->ts.type == BT_LOGICAL)
|
||||
{
|
||||
e->ts.type = BT_LOGICAL;
|
||||
@@ -4198,6 +4245,12 @@ resolve_operator (gfc_expr *e)
|
||||
convert_hollerith_to_character (op2);
|
||||
}
|
||||
|
||||
+ if (flag_logical_as_integer)
|
||||
+ {
|
||||
+ convert_logical_to_integer (op1);
|
||||
+ convert_logical_to_integer (op2);
|
||||
+ }
|
||||
+
|
||||
if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER
|
||||
&& op1->ts.kind == op2->ts.kind)
|
||||
{
|
||||
diff --git a/gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_1.f b/gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_1.f
|
||||
new file mode 100644
|
||||
index 00000000000..938a91d9e9a
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_1.f
|
||||
@@ -0,0 +1,31 @@
|
||||
+! { dg-do run }
|
||||
+! { dg-options "-std=legacy -flogical-as-integer" }
|
||||
+!
|
||||
+! Test conversion between logical and integer for logical operators
|
||||
+!
|
||||
+! Test case contributed by Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||
+! Modified for -flogical-as-integer by Mark Eggleston
|
||||
+! <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+ PROGRAM logical_integer_conversion
|
||||
+ LOGICAL lpos /.true./
|
||||
+ INTEGER ineg/0/
|
||||
+ INTEGER ires
|
||||
+ LOGICAL lres
|
||||
+
|
||||
+ ! Test Logicals converted to Integers
|
||||
+ if ((lpos.AND.ineg).EQ.1) STOP 3
|
||||
+ if ((ineg.AND.lpos).NE.0) STOP 4
|
||||
+ ires = (.true..AND.0)
|
||||
+ if (ires.NE.0) STOP 5
|
||||
+ ires = (1.AND..false.)
|
||||
+ if (ires.EQ.1) STOP 6
|
||||
+
|
||||
+ ! Test Integers converted to Logicals
|
||||
+ if (lpos.EQ.ineg) STOP 7
|
||||
+ if (ineg.EQ.lpos) STOP 8
|
||||
+ lres = (.true..EQ.0)
|
||||
+ if (lres) STOP 9
|
||||
+ lres = (1.EQ..false.)
|
||||
+ if (lres) STOP 10
|
||||
+ END
|
||||
diff --git a/gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_2.f b/gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_2.f
|
||||
new file mode 100644
|
||||
index 00000000000..9f146202ba5
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_2.f
|
||||
@@ -0,0 +1,31 @@
|
||||
+! { dg-do compile }
|
||||
+! { dg-options "-std=legacy -flogical-as-integer -fno-logical-as-integer" }
|
||||
+!
|
||||
+! Based on logical_to_integer_and_vice_versa_1.f but with option disabled
|
||||
+! to test for error messages.
|
||||
+!
|
||||
+! Test case contributed by by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
+!
|
||||
+!
|
||||
+ PROGRAM logical_integer_conversion
|
||||
+ LOGICAL lpos /.true./
|
||||
+ INTEGER ineg/0/
|
||||
+ INTEGER ires
|
||||
+ LOGICAL lres
|
||||
+
|
||||
+ ! Test Logicals converted to Integers
|
||||
+ if ((lpos.AND.ineg).EQ.1) STOP 3 ! { dg-error "Operands of logical operator" }
|
||||
+ if ((ineg.AND.lpos).NE.0) STOP 4 ! { dg-error "Operands of logical operator" }
|
||||
+ ires = (.true..AND.0) ! { dg-error "Operands of logical operator" }
|
||||
+ if (ires.NE.0) STOP 5
|
||||
+ ires = (1.AND..false.) ! { dg-error "Operands of logical operator" }
|
||||
+ if (ires.EQ.1) STOP 6
|
||||
+
|
||||
+ ! Test Integers converted to Logicals
|
||||
+ if (lpos.EQ.ineg) STOP 7 ! { dg-error "Operands of comparison operator" }
|
||||
+ if (ineg.EQ.lpos) STOP 8 ! { dg-error "Operands of comparison operator" }
|
||||
+ lres = (.true..EQ.0) ! { dg-error "Operands of comparison operator" }
|
||||
+ if (lres) STOP 9
|
||||
+ lres = (1.EQ..false.) ! { dg-error "Operands of comparison operator" }
|
||||
+ if (lres) STOP 10
|
||||
+ END
|
||||
diff --git a/gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_3.f b/gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_3.f
|
||||
new file mode 100644
|
||||
index 00000000000..446873eb2dc
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_3.f
|
||||
@@ -0,0 +1,33 @@
|
||||
+! { dg-do compile }
|
||||
+! { dg-options "-std=legacy -flogical-as-integer" }
|
||||
+!
|
||||
+! Test conversion between logical and integer for logical operators
|
||||
+!
|
||||
+ program test
|
||||
+ logical f /.false./
|
||||
+ logical t /.true./
|
||||
+ real x
|
||||
+
|
||||
+ x = 7.7
|
||||
+ x = x + t*3.0
|
||||
+ if (abs(x - 10.7).gt.0.00001) stop 1
|
||||
+ x = x + .false.*5.0
|
||||
+ if (abs(x - 10.7).gt.0.00001) stop 2
|
||||
+ x = x - .true.*5.0
|
||||
+ if (abs(x - 5.7).gt.0.00001) stop 3
|
||||
+ x = x + t
|
||||
+ if (abs(x - 6.7).gt.0.00001) stop 4
|
||||
+ x = x + f
|
||||
+ if (abs(x - 6.7).gt.0.00001) stop 5
|
||||
+ x = x - t
|
||||
+ if (abs(x - 5.7).gt.0.00001) stop 6
|
||||
+ x = x - f
|
||||
+ if (abs(x - 5.7).gt.0.00001) stop 7
|
||||
+ x = x**.true.
|
||||
+ if (abs(x - 5.7).gt.0.00001) stop 8
|
||||
+ x = x**.false.
|
||||
+ if (abs(x - 1.0).gt.0.00001) stop 9
|
||||
+ x = x/t
|
||||
+ if (abs(x - 1.0).gt.0.00001) stop 10
|
||||
+ if ((x/.false.).le.huge(x)) stop 11
|
||||
+ end
|
||||
diff --git a/gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_4.f b/gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_4.f
|
||||
new file mode 100644
|
||||
index 00000000000..4301a4988d8
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_4.f
|
||||
@@ -0,0 +1,33 @@
|
||||
+! { dg-do compile }
|
||||
+! { dg-options "-std=legacy -flogical-as-integer -fno-logical-as-integer" }
|
||||
+!
|
||||
+! Test conversion between logical and integer for logical operators
|
||||
+!
|
||||
+ program test
|
||||
+ logical f /.false./
|
||||
+ logical t /.true./
|
||||
+ real x
|
||||
+
|
||||
+ x = 7.7
|
||||
+ x = x + t*3.0 ! { dg-error "Operands of binary numeric" }
|
||||
+ if (abs(x - 10.7).gt.0.00001) stop 1
|
||||
+ x = x + .false.*5.0 ! { dg-error "Operands of binary numeric" }
|
||||
+ if (abs(x - 10.7).gt.0.00001) stop 2
|
||||
+ x = x - .true.*5.0 ! { dg-error "Operands of binary numeric" }
|
||||
+ if (abs(x - 5.7).gt.0.00001) stop 3
|
||||
+ x = x + t ! { dg-error "Operands of binary numeric" }
|
||||
+ if (abs(x - 6.7).gt.0.00001) stop 4
|
||||
+ x = x + f ! { dg-error "Operands of binary numeric" }
|
||||
+ if (abs(x - 6.7).gt.0.00001) stop 5
|
||||
+ x = x - t ! { dg-error "Operands of binary numeric" }
|
||||
+ if (abs(x - 5.7).gt.0.00001) stop 6
|
||||
+ x = x - f ! { dg-error "Operands of binary numeric" }
|
||||
+ if (abs(x - 5.7).gt.0.00001) stop 7
|
||||
+ x = x**.true. ! { dg-error "Operands of binary numeric" }
|
||||
+ if (abs(x - 5.7).gt.0.00001) stop 8
|
||||
+ x = x**.false. ! { dg-error "Operands of binary numeric" }
|
||||
+ if (abs(x - 1.0).gt.0.00001) stop 9
|
||||
+ x = x/t ! { dg-error "Operands of binary numeric" }
|
||||
+ if (abs(x - 1.0).gt.0.00001) stop 10
|
||||
+ if ((x/.false.).le.huge(x)) stop 11 ! { dg-error "Operands of binary numeric" }
|
||||
+ end
|
||||
--
|
||||
2.27.0
|
||||
|
@ -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.c.jj 2019-01-09 13:01:21.420552123 +0100
|
||||
+++ libcpp/macro.c 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.c.jj 2019-01-09 13:01:22.415535734 +0100
|
||||
+++ libcpp/expr.c 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
|
@ -0,0 +1,71 @@
|
||||
2011-04-04 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* toplev.c (toplev_main_argv): New variable.
|
||||
(toplev_main): Initialize it.
|
||||
* graphite.c (init_isl_pointers): Load libisl.so.15 from gcc's private
|
||||
directory.
|
||||
|
||||
--- gcc/toplev.c.jj 2008-12-09 23:59:10.000000000 +0100
|
||||
+++ gcc/toplev.c 2009-01-27 14:33:52.000000000 +0100
|
||||
@@ -117,6 +117,8 @@ static void compile_file (void);
|
||||
/* True if we don't need a backend (e.g. preprocessing only). */
|
||||
static bool no_backend;
|
||||
|
||||
+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;
|
||||
@@ -2287,6 +2289,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.c.jj 2010-12-01 10:24:32.000000000 -0500
|
||||
+++ gcc/graphite.c 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;
|
@ -0,0 +1,57 @@
|
||||
libgcc: Honor LDFLAGS_FOR_TARGET when linking libgcc_s
|
||||
|
||||
When building gcc with some specific LDFLAGS_FOR_TARGET, e.g.
|
||||
LDFLAGS_FOR_TARGET=-Wl,-z,relro,-z,now
|
||||
those flags propagate info linking of target shared libraries,
|
||||
e.g. lib{ubsan,tsan,stdc++,quadmath,objc,lsan,itm,gphobos,gdruntime,gomp,go,gfortran,atomic,asan}.so.*
|
||||
but there is one important exception, libgcc_s.so.* linking ignores it.
|
||||
|
||||
The following patch fixes that.
|
||||
|
||||
Bootstrapped/regtested on x86_64-linux with LDFLAGS_FOR_TARGET=-Wl,-z,relro,-z,now
|
||||
and verified that libgcc_s.so.* is BIND_NOW when it previously wasn't, and
|
||||
without any LDFLAGS_FOR_TARGET on x86_64-linux and i686-linux.
|
||||
There on x86_64-linux I've verified that the libgcc_s.so.1 linking command
|
||||
line for -m64 is identical except for whitespace to one without the patch,
|
||||
and for -m32 multilib $(LDFLAGS) actually do supply there an extra -m32
|
||||
that also repeats later in the @multilib_flags@, which should be harmless.
|
||||
|
||||
2021-08-04 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* config/t-slibgcc (SHLIB_LINK): Add $(LDFLAGS).
|
||||
* config/t-slibgcc-darwin (SHLIB_LINK): Likewise.
|
||||
* config/t-slibgcc-vms (SHLIB_LINK): Likewise.
|
||||
|
||||
--- libgcc/config/t-slibgcc
|
||||
+++ libgcc/config/t-slibgcc
|
||||
@@ -32,7 +32,7 @@ SHLIB_INSTALL_SOLINK = $(LN_S) $(SHLIB_SONAME) \
|
||||
$(DESTDIR)$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK)
|
||||
|
||||
SHLIB_LINK = $(CC) $(LIBGCC2_CFLAGS) -shared -nodefaultlibs \
|
||||
- $(SHLIB_LDFLAGS) \
|
||||
+ $(SHLIB_LDFLAGS) $(LDFLAGS) \
|
||||
-o $(SHLIB_DIR)/$(SHLIB_SONAME).tmp @multilib_flags@ \
|
||||
$(SHLIB_OBJS) $(SHLIB_LC) && \
|
||||
rm -f $(SHLIB_DIR)/$(SHLIB_SOLINK) && \
|
||||
--- libgcc/config/t-slibgcc-darwin
|
||||
+++ libgcc/config/t-slibgcc-darwin
|
||||
@@ -15,7 +15,7 @@ SHLIB_LC = -lc
|
||||
# Note that this version is used for the loader, not the linker; the linker
|
||||
# uses the stub versions named by the versioned members of $(INSTALL_FILES).
|
||||
|
||||
-SHLIB_LINK = $(CC) $(LIBGCC2_CFLAGS) -dynamiclib -nodefaultlibs \
|
||||
+SHLIB_LINK = $(CC) $(LIBGCC2_CFLAGS) $(LDFLAGS) -dynamiclib -nodefaultlibs \
|
||||
-install_name @shlib_slibdir@/$(SHLIB_INSTALL_NAME) \
|
||||
-single_module -o $(SHLIB_DIR)/$(SHLIB_SONAME) \
|
||||
-Wl,-exported_symbols_list,$(SHLIB_MAP) \
|
||||
--- libgcc/config/t-slibgcc-vms
|
||||
+++ libgcc/config/t-slibgcc-vms
|
||||
@@ -22,7 +22,7 @@ SHLIB_LINK = \
|
||||
objdump --syms $(SHLIB_OBJS) | \
|
||||
$(SHLIB_SYMVEC) >> SYMVEC_$$$$.opt ; \
|
||||
echo "case_sensitive=NO" >> SYMVEC_$$$$.opt; \
|
||||
- $(CC) $(LIBGCC2_CFLAGS) -nodefaultlibs \
|
||||
+ $(CC) $(LIBGCC2_CFLAGS) $(LDFLAGS) -nodefaultlibs \
|
||||
-shared --for-linker=/noinform -o $(SHLIB_NAME) $(SHLIB_OBJS) \
|
||||
--for-linker=SYMVEC_$$$$.opt \
|
||||
--for-linker=gsmatch=equal,$(shlib_version)
|
@ -0,0 +1,671 @@
|
||||
--- libgfortran/Makefile.am.jj 2021-04-20 10:33:07.504337576 +0200
|
||||
+++ libgfortran/Makefile.am 2021-05-11 20:24:31.211422979 +0200
|
||||
@@ -37,6 +37,7 @@ LTLDFLAGS = $(shell $(SHELL) $(top_srcdi
|
||||
$(lt_host_flags)
|
||||
|
||||
toolexeclib_LTLIBRARIES = libgfortran.la
|
||||
+noinst_LTLIBRARIES = libgfortran_nonshared80.la
|
||||
toolexeclib_DATA = libgfortran.spec
|
||||
libgfortran_la_LINK = $(LINK) $(libgfortran_la_LDFLAGS)
|
||||
libgfortran_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` \
|
||||
@@ -1041,6 +1042,91 @@ libgfortran_la_SOURCES = $(prereq_SRC)
|
||||
|
||||
endif
|
||||
|
||||
+$(patsubst %.c,%.lo,$(nonshared_generated_C_SRC) $(nonshared)): \
|
||||
+nonshared-%.lo: $(srcdir)/generated/%.c
|
||||
+ $(LTCOMPILE) -c -o $@ $< -DLIBGFORTRAN_NONSHARED
|
||||
+
|
||||
+$(patsubst %.c,%.o,$(nonshared_generated_C_SRC) $(nonshared)): \
|
||||
+nonshared-%.o: $(srcdir)/generated/%.c
|
||||
+ $(COMPILE) -c -o $@ $< -DLIBGFORTRAN_NONSHARED
|
||||
+
|
||||
+$(patsubst %.c,%.lo,$(nonshared_intrinsics_C_SRC) $(nonshared)): \
|
||||
+nonshared-%.lo: $(srcdir)/intrinsics/%.c
|
||||
+ $(LTCOMPILE) -c -o $@ $< -DLIBGFORTRAN_NONSHARED
|
||||
+
|
||||
+$(patsubst %.c,%.o,$(nonshared_intrinsics_C_SRC) $(nonshared)): \
|
||||
+nonshared-%.o: $(srcdir)/intrinsics/%.c
|
||||
+ $(COMPILE) -c -o $@ $< -DLIBGFORTRAN_NONSHARED
|
||||
+
|
||||
+$(patsubst %.c,%.lo,$(nonshared_runtime_C_SRC) $(nonshared)): \
|
||||
+nonshared-%.lo: $(srcdir)/runtime/%.c
|
||||
+ $(LTCOMPILE) -c -o $@ $< -DLIBGFORTRAN_NONSHARED
|
||||
+
|
||||
+$(patsubst %.c,%.o,$(nonshared_runtime_C_SRC) $(nonshared)): \
|
||||
+nonshared-%.o: $(srcdir)/runtime/%.c
|
||||
+ $(COMPILE) -c -o $@ $< -DLIBGFORTRAN_NONSHARED
|
||||
+
|
||||
+$(patsubst %.f90,%.lo,$(nonshared_intrinsics_f90_SRC) $(nonshared)): \
|
||||
+nonshared-%.lo: $(srcdir)/intrinsics/%.f90
|
||||
+ $(LTPPFCCOMPILE) -c -o $@ $< -fallow-leading-underscore
|
||||
+
|
||||
+$(patsubst %.f90,%.o,$(nonshared_intrinsics_f90_SRC) $(nonshared)): \
|
||||
+nonshared-%.o: $(srcdir)/intrinsics/%.f90
|
||||
+ $(PPFCCOMPILE) -c -o $@ $< -fallow-leading-underscore
|
||||
+
|
||||
+nonshared_runtime_C_SRC = \
|
||||
+nonshared-ISO_Fortran_binding.c
|
||||
+
|
||||
+nonshared_generated_C_SRC = \
|
||||
+nonshared-findloc0_i1.c \
|
||||
+nonshared-findloc0_i2.c \
|
||||
+nonshared-findloc0_i4.c \
|
||||
+nonshared-findloc0_i8.c \
|
||||
+nonshared-findloc0_i16.c \
|
||||
+nonshared-findloc0_r4.c \
|
||||
+nonshared-findloc0_r8.c \
|
||||
+nonshared-findloc0_r10.c \
|
||||
+nonshared-findloc0_r16.c \
|
||||
+nonshared-findloc0_c4.c \
|
||||
+nonshared-findloc0_c8.c \
|
||||
+nonshared-findloc0_c10.c \
|
||||
+nonshared-findloc0_c16.c \
|
||||
+nonshared-findloc0_s1.c \
|
||||
+nonshared-findloc0_s4.c \
|
||||
+nonshared-findloc1_i1.c \
|
||||
+nonshared-findloc1_i2.c \
|
||||
+nonshared-findloc1_i4.c \
|
||||
+nonshared-findloc1_i8.c \
|
||||
+nonshared-findloc1_i16.c \
|
||||
+nonshared-findloc1_r4.c \
|
||||
+nonshared-findloc1_r8.c \
|
||||
+nonshared-findloc1_r10.c \
|
||||
+nonshared-findloc1_r16.c \
|
||||
+nonshared-findloc1_c4.c \
|
||||
+nonshared-findloc1_c8.c \
|
||||
+nonshared-findloc1_c10.c \
|
||||
+nonshared-findloc1_c16.c \
|
||||
+nonshared-findloc1_s1.c \
|
||||
+nonshared-findloc1_s4.c \
|
||||
+nonshared-findloc2_s1.c \
|
||||
+nonshared-findloc2_s4.c
|
||||
+
|
||||
+nonshared_intrinsics_C_SRC = \
|
||||
+nonshared-is_contiguous.c \
|
||||
+nonshared-trigd.c
|
||||
+
|
||||
+nonshared_intrinsics_f90_SRC = \
|
||||
+nonshared-random_init.f90
|
||||
+
|
||||
+libgfortran_nonshared80_la_SOURCES = \
|
||||
+$(nonshared_runtime_C_SRC) \
|
||||
+$(nonshared_generated_C_SRC) \
|
||||
+$(nonshared_intrinsics_C_SRC) \
|
||||
+$(nonshared_intrinsics_f90_SRC) \
|
||||
+$(srcdir)/ieee/nonshared-ieee_arithmetic.c \
|
||||
+$(srcdir)/io/nonshared-transfer.c \
|
||||
+$(srcdir)/runtime/nonshared-error.c
|
||||
+
|
||||
I_M4_DEPS=m4/iparm.m4
|
||||
I_M4_DEPS0=$(I_M4_DEPS) m4/iforeach.m4
|
||||
I_M4_DEPS1=$(I_M4_DEPS) m4/ifunction.m4
|
||||
--- libgfortran/ieee/nonshared-ieee_arithmetic.c.jj 2021-05-11 20:24:18.918549661 +0200
|
||||
+++ libgfortran/ieee/nonshared-ieee_arithmetic.c 2021-05-11 20:24:18.918549661 +0200
|
||||
@@ -0,0 +1,64 @@
|
||||
+/* Helper functions in C for IEEE modules
|
||||
+ Copyright (C) 2013-2021 Free Software Foundation, Inc.
|
||||
+ Contributed by Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
|
||||
+
|
||||
+This file is part of the GNU Fortran runtime library (libgfortran).
|
||||
+
|
||||
+Libgfortran is free software; you can redistribute it and/or
|
||||
+modify it under the terms of the GNU General Public
|
||||
+License as published by the Free Software Foundation; either
|
||||
+version 3 of the License, or (at your option) any later version.
|
||||
+
|
||||
+Libgfortran is distributed in the hope that it will be useful,
|
||||
+but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+GNU General Public License for more details.
|
||||
+
|
||||
+Under Section 7 of GPL version 3, you are granted additional
|
||||
+permissions described in the GCC Runtime Library Exception, version
|
||||
+3.1, as published by the Free Software Foundation.
|
||||
+
|
||||
+You should have received a copy of the GNU General Public License and
|
||||
+a copy of the GCC Runtime Library Exception along with this program;
|
||||
+see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||
+<http://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+#include "libgfortran.h"
|
||||
+
|
||||
+GFC_LOGICAL_4
|
||||
+__ieee_arithmetic_MOD_ieee_support_subnormal_4 (gfc_array_r4 *arg)
|
||||
+{
|
||||
+ (void) arg;
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
+GFC_LOGICAL_4
|
||||
+__ieee_arithmetic_MOD_ieee_support_subnormal_8 (gfc_array_r8 *arg)
|
||||
+{
|
||||
+ (void) arg;
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
+#ifdef HAVE_GFC_REAL_10
|
||||
+GFC_LOGICAL_4
|
||||
+__ieee_arithmetic_MOD_ieee_support_subnormal_10 (gfc_array_r10 *arg)
|
||||
+{
|
||||
+ (void) arg;
|
||||
+ return 1;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
+#ifdef HAVE_GFC_REAL_16
|
||||
+GFC_LOGICAL_4
|
||||
+__ieee_arithmetic_MOD_ieee_support_subnormal_16 (gfc_array_r16 *arg)
|
||||
+{
|
||||
+ (void) arg;
|
||||
+ return 1;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
+GFC_LOGICAL_4
|
||||
+__ieee_arithmetic_MOD_ieee_support_subnormal_noarg (void)
|
||||
+{
|
||||
+ return 1;
|
||||
+}
|
||||
--- libgfortran/Makefile.in.jj 2021-04-20 10:33:07.518337421 +0200
|
||||
+++ libgfortran/Makefile.in 2021-05-11 20:24:50.660222546 +0200
|
||||
@@ -217,7 +217,8 @@ am__uninstall_files_from_dir = { \
|
||||
am__installdirs = "$(DESTDIR)$(cafexeclibdir)" \
|
||||
"$(DESTDIR)$(toolexeclibdir)" "$(DESTDIR)$(toolexeclibdir)" \
|
||||
"$(DESTDIR)$(gfor_cdir)" "$(DESTDIR)$(fincludedir)"
|
||||
-LTLIBRARIES = $(cafexeclib_LTLIBRARIES) $(toolexeclib_LTLIBRARIES)
|
||||
+LTLIBRARIES = $(cafexeclib_LTLIBRARIES) $(noinst_LTLIBRARIES) \
|
||||
+ $(toolexeclib_LTLIBRARIES)
|
||||
libcaf_single_la_LIBADD =
|
||||
am_libcaf_single_la_OBJECTS = single.lo
|
||||
libcaf_single_la_OBJECTS = $(am_libcaf_single_la_OBJECTS)
|
||||
@@ -467,6 +468,36 @@ am__objects_65 = $(am__objects_3) $(am__
|
||||
@onestep_FALSE@am_libgfortran_la_OBJECTS = $(am__objects_65)
|
||||
@onestep_TRUE@am_libgfortran_la_OBJECTS = libgfortran_c.lo
|
||||
libgfortran_la_OBJECTS = $(am_libgfortran_la_OBJECTS)
|
||||
+libgfortran_nonshared80_la_LIBADD =
|
||||
+am__objects_66 = nonshared-ISO_Fortran_binding.lo
|
||||
+am__objects_67 = nonshared-findloc0_i1.lo nonshared-findloc0_i2.lo \
|
||||
+ nonshared-findloc0_i4.lo nonshared-findloc0_i8.lo \
|
||||
+ nonshared-findloc0_i16.lo nonshared-findloc0_r4.lo \
|
||||
+ nonshared-findloc0_r8.lo nonshared-findloc0_r10.lo \
|
||||
+ nonshared-findloc0_r16.lo nonshared-findloc0_c4.lo \
|
||||
+ nonshared-findloc0_c8.lo nonshared-findloc0_c10.lo \
|
||||
+ nonshared-findloc0_c16.lo nonshared-findloc0_s1.lo \
|
||||
+ nonshared-findloc0_s4.lo nonshared-findloc1_i1.lo \
|
||||
+ nonshared-findloc1_i2.lo nonshared-findloc1_i4.lo \
|
||||
+ nonshared-findloc1_i8.lo nonshared-findloc1_i16.lo \
|
||||
+ nonshared-findloc1_r4.lo nonshared-findloc1_r8.lo \
|
||||
+ nonshared-findloc1_r10.lo nonshared-findloc1_r16.lo \
|
||||
+ nonshared-findloc1_c4.lo nonshared-findloc1_c8.lo \
|
||||
+ nonshared-findloc1_c10.lo nonshared-findloc1_c16.lo \
|
||||
+ nonshared-findloc1_s1.lo nonshared-findloc1_s4.lo \
|
||||
+ nonshared-findloc2_s1.lo nonshared-findloc2_s4.lo
|
||||
+am__objects_68 = nonshared-is_contiguous.lo nonshared-trigd.lo
|
||||
+am__objects_69 = nonshared-random_init.lo
|
||||
+am_libgfortran_nonshared80_la_OBJECTS = $(am__objects_66) \
|
||||
+ $(am__objects_67) $(am__objects_68) $(am__objects_69) \
|
||||
+ nonshared-ieee_arithmetic.lo nonshared-transfer.lo \
|
||||
+ nonshared-error.lo
|
||||
+libgfortran_nonshared80_la_OBJECTS = \
|
||||
+ $(am_libgfortran_nonshared80_la_OBJECTS)
|
||||
+AM_V_lt = $(am__v_lt_@AM_V@)
|
||||
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
|
||||
+am__v_lt_0 = --silent
|
||||
+am__v_lt_1 =
|
||||
AM_V_P = $(am__v_P_@AM_V@)
|
||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||
am__v_P_0 = false
|
||||
@@ -483,10 +514,6 @@ DEFAULT_INCLUDES = -I.@am__isrc@
|
||||
depcomp = $(SHELL) $(top_srcdir)/../depcomp
|
||||
am__depfiles_maybe = depfiles
|
||||
am__mv = mv -f
|
||||
-AM_V_lt = $(am__v_lt_@AM_V@)
|
||||
-am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
|
||||
-am__v_lt_0 = --silent
|
||||
-am__v_lt_1 =
|
||||
PPFCCOMPILE = $(FC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
|
||||
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_FCFLAGS) $(FCFLAGS)
|
||||
LTPPFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
|
||||
@@ -530,7 +557,8 @@ AM_V_FC = $(am__v_FC_@AM_V@)
|
||||
am__v_FC_ = $(am__v_FC_@AM_DEFAULT_V@)
|
||||
am__v_FC_0 = @echo " FC " $@;
|
||||
am__v_FC_1 =
|
||||
-SOURCES = $(libcaf_single_la_SOURCES) $(libgfortran_la_SOURCES)
|
||||
+SOURCES = $(libcaf_single_la_SOURCES) $(libgfortran_la_SOURCES) \
|
||||
+ $(libgfortran_nonshared80_la_SOURCES)
|
||||
am__can_run_installinfo = \
|
||||
case $$AM_UPDATE_INFO_DIR in \
|
||||
n|no|NO) false;; \
|
||||
@@ -729,6 +757,7 @@ LTLDFLAGS = $(shell $(SHELL) $(top_srcdi
|
||||
$(lt_host_flags)
|
||||
|
||||
toolexeclib_LTLIBRARIES = libgfortran.la
|
||||
+noinst_LTLIBRARIES = libgfortran_nonshared80.la
|
||||
toolexeclib_DATA = libgfortran.spec
|
||||
libgfortran_la_LINK = $(LINK) $(libgfortran_la_LDFLAGS)
|
||||
libgfortran_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` \
|
||||
@@ -1558,6 +1587,59 @@ prereq_SRC = $(gfor_src) $(gfor_built_sr
|
||||
#libgfortran_F.lo:
|
||||
# $(LTPPFCCOMPILE) -c -o $@ $^ -combine
|
||||
@onestep_TRUE@libgfortran_la_SOURCES = libgfortran_c.c $(filter-out %.c,$(prereq_SRC))
|
||||
+nonshared_runtime_C_SRC = \
|
||||
+nonshared-ISO_Fortran_binding.c
|
||||
+
|
||||
+nonshared_generated_C_SRC = \
|
||||
+nonshared-findloc0_i1.c \
|
||||
+nonshared-findloc0_i2.c \
|
||||
+nonshared-findloc0_i4.c \
|
||||
+nonshared-findloc0_i8.c \
|
||||
+nonshared-findloc0_i16.c \
|
||||
+nonshared-findloc0_r4.c \
|
||||
+nonshared-findloc0_r8.c \
|
||||
+nonshared-findloc0_r10.c \
|
||||
+nonshared-findloc0_r16.c \
|
||||
+nonshared-findloc0_c4.c \
|
||||
+nonshared-findloc0_c8.c \
|
||||
+nonshared-findloc0_c10.c \
|
||||
+nonshared-findloc0_c16.c \
|
||||
+nonshared-findloc0_s1.c \
|
||||
+nonshared-findloc0_s4.c \
|
||||
+nonshared-findloc1_i1.c \
|
||||
+nonshared-findloc1_i2.c \
|
||||
+nonshared-findloc1_i4.c \
|
||||
+nonshared-findloc1_i8.c \
|
||||
+nonshared-findloc1_i16.c \
|
||||
+nonshared-findloc1_r4.c \
|
||||
+nonshared-findloc1_r8.c \
|
||||
+nonshared-findloc1_r10.c \
|
||||
+nonshared-findloc1_r16.c \
|
||||
+nonshared-findloc1_c4.c \
|
||||
+nonshared-findloc1_c8.c \
|
||||
+nonshared-findloc1_c10.c \
|
||||
+nonshared-findloc1_c16.c \
|
||||
+nonshared-findloc1_s1.c \
|
||||
+nonshared-findloc1_s4.c \
|
||||
+nonshared-findloc2_s1.c \
|
||||
+nonshared-findloc2_s4.c
|
||||
+
|
||||
+nonshared_intrinsics_C_SRC = \
|
||||
+nonshared-is_contiguous.c \
|
||||
+nonshared-trigd.c
|
||||
+
|
||||
+nonshared_intrinsics_f90_SRC = \
|
||||
+nonshared-random_init.f90
|
||||
+
|
||||
+libgfortran_nonshared80_la_SOURCES = \
|
||||
+$(nonshared_runtime_C_SRC) \
|
||||
+$(nonshared_generated_C_SRC) \
|
||||
+$(nonshared_intrinsics_C_SRC) \
|
||||
+$(nonshared_intrinsics_f90_SRC) \
|
||||
+$(srcdir)/ieee/nonshared-ieee_arithmetic.c \
|
||||
+$(srcdir)/io/nonshared-transfer.c \
|
||||
+$(srcdir)/runtime/nonshared-error.c
|
||||
+
|
||||
I_M4_DEPS = m4/iparm.m4
|
||||
I_M4_DEPS0 = $(I_M4_DEPS) m4/iforeach.m4
|
||||
I_M4_DEPS1 = $(I_M4_DEPS) m4/ifunction.m4
|
||||
@@ -1668,6 +1750,17 @@ clean-cafexeclibLTLIBRARIES:
|
||||
rm -f $${locs}; \
|
||||
}
|
||||
|
||||
+clean-noinstLTLIBRARIES:
|
||||
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
|
||||
+ @list='$(noinst_LTLIBRARIES)'; \
|
||||
+ locs=`for p in $$list; do echo $$p; done | \
|
||||
+ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
|
||||
+ sort -u`; \
|
||||
+ test -z "$$locs" || { \
|
||||
+ echo rm -f $${locs}; \
|
||||
+ rm -f $${locs}; \
|
||||
+ }
|
||||
+
|
||||
install-toolexeclibLTLIBRARIES: $(toolexeclib_LTLIBRARIES)
|
||||
@$(NORMAL_INSTALL)
|
||||
@list='$(toolexeclib_LTLIBRARIES)'; test -n "$(toolexeclibdir)" || list=; \
|
||||
@@ -1709,6 +1802,9 @@ libcaf_single.la: $(libcaf_single_la_OBJ
|
||||
libgfortran.la: $(libgfortran_la_OBJECTS) $(libgfortran_la_DEPENDENCIES) $(EXTRA_libgfortran_la_DEPENDENCIES)
|
||||
$(AM_V_GEN)$(libgfortran_la_LINK) -rpath $(toolexeclibdir) $(libgfortran_la_OBJECTS) $(libgfortran_la_LIBADD) $(LIBS)
|
||||
|
||||
+libgfortran_nonshared80.la: $(libgfortran_nonshared80_la_OBJECTS) $(libgfortran_nonshared80_la_DEPENDENCIES) $(EXTRA_libgfortran_nonshared80_la_DEPENDENCIES)
|
||||
+ $(AM_V_FCLD)$(FCLINK) $(libgfortran_nonshared80_la_OBJECTS) $(libgfortran_nonshared80_la_LIBADD) $(LIBS)
|
||||
+
|
||||
mostlyclean-compile:
|
||||
-rm -f *.$(OBJEXT)
|
||||
|
||||
@@ -2125,6 +2221,44 @@ distclean-compile:
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minval_r8.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/move_alloc.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mvbits.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-ISO_Fortran_binding.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-error.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_c10.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_c16.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_c4.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_c8.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_i1.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_i16.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_i2.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_i4.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_i8.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_r10.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_r16.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_r4.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_r8.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_s1.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_s4.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_c10.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_c16.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_c4.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_c8.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_i1.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_i16.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_i2.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_i4.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_i8.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_r10.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_r16.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_r4.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_r8.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_s1.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_s4.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc2_s1.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc2_s4.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-ieee_arithmetic.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-is_contiguous.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-transfer.Plo@am__quote@
|
||||
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-trigd.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/norm2_r10.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/norm2_r16.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/norm2_r4.Plo@am__quote@
|
||||
@@ -6679,6 +6813,27 @@ ieee_helper.lo: ieee/ieee_helper.c
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ieee_helper.lo `test -f 'ieee/ieee_helper.c' || echo '$(srcdir)/'`ieee/ieee_helper.c
|
||||
|
||||
+nonshared-ieee_arithmetic.lo: $(srcdir)/ieee/nonshared-ieee_arithmetic.c
|
||||
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT nonshared-ieee_arithmetic.lo -MD -MP -MF $(DEPDIR)/nonshared-ieee_arithmetic.Tpo -c -o nonshared-ieee_arithmetic.lo `test -f '$(srcdir)/ieee/nonshared-ieee_arithmetic.c' || echo '$(srcdir)/'`$(srcdir)/ieee/nonshared-ieee_arithmetic.c
|
||||
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nonshared-ieee_arithmetic.Tpo $(DEPDIR)/nonshared-ieee_arithmetic.Plo
|
||||
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(srcdir)/ieee/nonshared-ieee_arithmetic.c' object='nonshared-ieee_arithmetic.lo' libtool=yes @AMDEPBACKSLASH@
|
||||
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o nonshared-ieee_arithmetic.lo `test -f '$(srcdir)/ieee/nonshared-ieee_arithmetic.c' || echo '$(srcdir)/'`$(srcdir)/ieee/nonshared-ieee_arithmetic.c
|
||||
+
|
||||
+nonshared-transfer.lo: $(srcdir)/io/nonshared-transfer.c
|
||||
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT nonshared-transfer.lo -MD -MP -MF $(DEPDIR)/nonshared-transfer.Tpo -c -o nonshared-transfer.lo `test -f '$(srcdir)/io/nonshared-transfer.c' || echo '$(srcdir)/'`$(srcdir)/io/nonshared-transfer.c
|
||||
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nonshared-transfer.Tpo $(DEPDIR)/nonshared-transfer.Plo
|
||||
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(srcdir)/io/nonshared-transfer.c' object='nonshared-transfer.lo' libtool=yes @AMDEPBACKSLASH@
|
||||
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o nonshared-transfer.lo `test -f '$(srcdir)/io/nonshared-transfer.c' || echo '$(srcdir)/'`$(srcdir)/io/nonshared-transfer.c
|
||||
+
|
||||
+nonshared-error.lo: $(srcdir)/runtime/nonshared-error.c
|
||||
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT nonshared-error.lo -MD -MP -MF $(DEPDIR)/nonshared-error.Tpo -c -o nonshared-error.lo `test -f '$(srcdir)/runtime/nonshared-error.c' || echo '$(srcdir)/'`$(srcdir)/runtime/nonshared-error.c
|
||||
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nonshared-error.Tpo $(DEPDIR)/nonshared-error.Plo
|
||||
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(srcdir)/runtime/nonshared-error.c' object='nonshared-error.lo' libtool=yes @AMDEPBACKSLASH@
|
||||
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o nonshared-error.lo `test -f '$(srcdir)/runtime/nonshared-error.c' || echo '$(srcdir)/'`$(srcdir)/runtime/nonshared-error.c
|
||||
+
|
||||
.f90.o:
|
||||
$(AM_V_FC)$(FCCOMPILE) -c -o $@ $<
|
||||
|
||||
@@ -6873,7 +7028,8 @@ maintainer-clean-generic:
|
||||
clean: clean-am
|
||||
|
||||
clean-am: clean-cafexeclibLTLIBRARIES clean-generic clean-libtool \
|
||||
- clean-local clean-toolexeclibLTLIBRARIES mostlyclean-am
|
||||
+ clean-local clean-noinstLTLIBRARIES \
|
||||
+ clean-toolexeclibLTLIBRARIES mostlyclean-am
|
||||
|
||||
distclean: distclean-am
|
||||
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
||||
@@ -6953,14 +7109,15 @@ uninstall-am: uninstall-cafexeclibLTLIBR
|
||||
.PHONY: CTAGS GTAGS TAGS all all-am all-local am--refresh check \
|
||||
check-am clean clean-cafexeclibLTLIBRARIES clean-cscope \
|
||||
clean-generic clean-libtool clean-local \
|
||||
- clean-toolexeclibLTLIBRARIES cscope cscopelist-am ctags \
|
||||
- ctags-am distclean distclean-compile distclean-generic \
|
||||
- distclean-hdr distclean-libtool distclean-local distclean-tags \
|
||||
- dvi dvi-am html html-am info info-am install install-am \
|
||||
- install-cafexeclibLTLIBRARIES install-data install-data-am \
|
||||
- install-dvi install-dvi-am install-exec install-exec-am \
|
||||
- install-exec-local install-gfor_cHEADERS install-html \
|
||||
- install-html-am install-info install-info-am install-man \
|
||||
+ clean-noinstLTLIBRARIES clean-toolexeclibLTLIBRARIES cscope \
|
||||
+ cscopelist-am ctags ctags-am distclean distclean-compile \
|
||||
+ distclean-generic distclean-hdr distclean-libtool \
|
||||
+ distclean-local distclean-tags dvi dvi-am html html-am info \
|
||||
+ info-am install install-am install-cafexeclibLTLIBRARIES \
|
||||
+ install-data install-data-am install-dvi install-dvi-am \
|
||||
+ install-exec install-exec-am install-exec-local \
|
||||
+ install-gfor_cHEADERS install-html install-html-am \
|
||||
+ install-info install-info-am install-man \
|
||||
install-nodist_fincludeHEADERS install-pdf install-pdf-am \
|
||||
install-ps install-ps-am install-strip install-toolexeclibDATA \
|
||||
install-toolexeclibLTLIBRARIES installcheck installcheck-am \
|
||||
@@ -7018,6 +7175,38 @@ ieee_arithmetic.mod: ieee_arithmetic.lo
|
||||
@onestep_TRUE@libgfortran_c.lo: $(filter %.c,$(prereq_SRC))
|
||||
@onestep_TRUE@ $(LTCOMPILE) -c -o $@ $^ -combine
|
||||
|
||||
+$(patsubst %.c,%.lo,$(nonshared_generated_C_SRC) $(nonshared)): \
|
||||
+nonshared-%.lo: $(srcdir)/generated/%.c
|
||||
+ $(LTCOMPILE) -c -o $@ $< -DLIBGFORTRAN_NONSHARED
|
||||
+
|
||||
+$(patsubst %.c,%.o,$(nonshared_generated_C_SRC) $(nonshared)): \
|
||||
+nonshared-%.o: $(srcdir)/generated/%.c
|
||||
+ $(COMPILE) -c -o $@ $< -DLIBGFORTRAN_NONSHARED
|
||||
+
|
||||
+$(patsubst %.c,%.lo,$(nonshared_intrinsics_C_SRC) $(nonshared)): \
|
||||
+nonshared-%.lo: $(srcdir)/intrinsics/%.c
|
||||
+ $(LTCOMPILE) -c -o $@ $< -DLIBGFORTRAN_NONSHARED
|
||||
+
|
||||
+$(patsubst %.c,%.o,$(nonshared_intrinsics_C_SRC) $(nonshared)): \
|
||||
+nonshared-%.o: $(srcdir)/intrinsics/%.c
|
||||
+ $(COMPILE) -c -o $@ $< -DLIBGFORTRAN_NONSHARED
|
||||
+
|
||||
+$(patsubst %.c,%.lo,$(nonshared_runtime_C_SRC) $(nonshared)): \
|
||||
+nonshared-%.lo: $(srcdir)/runtime/%.c
|
||||
+ $(LTCOMPILE) -c -o $@ $< -DLIBGFORTRAN_NONSHARED
|
||||
+
|
||||
+$(patsubst %.c,%.o,$(nonshared_runtime_C_SRC) $(nonshared)): \
|
||||
+nonshared-%.o: $(srcdir)/runtime/%.c
|
||||
+ $(COMPILE) -c -o $@ $< -DLIBGFORTRAN_NONSHARED
|
||||
+
|
||||
+$(patsubst %.f90,%.lo,$(nonshared_intrinsics_f90_SRC) $(nonshared)): \
|
||||
+nonshared-%.lo: $(srcdir)/intrinsics/%.f90
|
||||
+ $(LTPPFCCOMPILE) -c -o $@ $< -fallow-leading-underscore
|
||||
+
|
||||
+$(patsubst %.f90,%.o,$(nonshared_intrinsics_f90_SRC) $(nonshared)): \
|
||||
+nonshared-%.o: $(srcdir)/intrinsics/%.f90
|
||||
+ $(PPFCCOMPILE) -c -o $@ $< -fallow-leading-underscore
|
||||
+
|
||||
kinds.h: $(srcdir)/mk-kinds-h.sh
|
||||
$(SHELL) $(srcdir)/mk-kinds-h.sh '@LIBGOMP_CHECKED_INT_KINDS@' '@LIBGOMP_CHECKED_REAL_KINDS@' '$(FCCOMPILE)' > $@ || rm $@
|
||||
|
||||
--- libgfortran/libgfortran.h.jj 2021-04-20 10:33:07.641336060 +0200
|
||||
+++ libgfortran/libgfortran.h 2021-05-11 20:24:18.939549444 +0200
|
||||
@@ -195,7 +195,7 @@ extern int __mingw_snprintf (char *, siz
|
||||
# define internal_proto(x) sym_rename(x, IPREFIX(x))
|
||||
#endif
|
||||
|
||||
-#if defined(HAVE_ATTRIBUTE_VISIBILITY) && defined(HAVE_ATTRIBUTE_ALIAS)
|
||||
+#if defined(HAVE_ATTRIBUTE_VISIBILITY) && defined(HAVE_ATTRIBUTE_ALIAS) && !defined(LIBGFORTRAN_NONSHARED)
|
||||
# define export_proto(x) sym_rename(x, PREFIX(x))
|
||||
# define export_proto_np(x) extern char swallow_semicolon
|
||||
# define iexport_proto(x) internal_proto(x)
|
||||
@@ -270,6 +270,10 @@ typedef GFC_UINTEGER_4 gfc_char4_t;
|
||||
simply equal to the kind parameter itself. */
|
||||
#define GFC_SIZE_OF_CHAR_KIND(kind) (kind)
|
||||
|
||||
+#ifdef LIBGFORTRAN_NONSHARED
|
||||
+#define big_endian (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
|
||||
+#endif
|
||||
+
|
||||
#define GFOR_POINTER_TO_L1(p, kind) \
|
||||
((__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ ? 1: 0) * (kind - 1) + (GFC_LOGICAL_1 *)(p))
|
||||
|
||||
@@ -1774,4 +1778,63 @@ internal_proto(cshift1_16_c16);
|
||||
#define HAVE_GFC_UINTEGER_1 1
|
||||
#define HAVE_GFC_UINTEGER_4 1
|
||||
|
||||
+#ifdef LIBGFORTRAN_NONSHARED
|
||||
+#include <stdlib.h>
|
||||
+#include <string.h>
|
||||
+#include <errno.h>
|
||||
+
|
||||
+#define internal_malloc_size nonshared_internal_malloc_size
|
||||
+#define xmalloc nonshared_internal_xmalloc
|
||||
+#define xmallocarray nonshared_internal_xmallocarray
|
||||
+#define reshape_packed nonshared_reshape_packed
|
||||
+static inline __attribute__((__always_inline__, __unused__))
|
||||
+void *
|
||||
+internal_malloc_size (size_t size)
|
||||
+{
|
||||
+ void *p;
|
||||
+
|
||||
+ if (size == 0)
|
||||
+ return NULL;
|
||||
+
|
||||
+ p = (void *) malloc (size);
|
||||
+ if (p == NULL)
|
||||
+ os_error ("Memory allocation failed");
|
||||
+ return p;
|
||||
+}
|
||||
+
|
||||
+static inline __attribute__((__always_inline__, __unused__))
|
||||
+void *
|
||||
+xmalloc (size_t size)
|
||||
+{
|
||||
+ return internal_malloc_size (size ? size : 1);
|
||||
+}
|
||||
+
|
||||
+static inline __attribute__((__always_inline__, __unused__))
|
||||
+void *
|
||||
+xmallocarray (size_t nmemb, size_t size)
|
||||
+{
|
||||
+ if (!nmemb || !size)
|
||||
+ size = nmemb = 1;
|
||||
+ else if (__builtin_expect ((nmemb | size)
|
||||
+ >= (((size_t) 1) << (__CHAR_BIT__
|
||||
+ * sizeof (size_t) / 2)), 0)
|
||||
+ && nmemb > __SIZE_MAX__ / size)
|
||||
+ {
|
||||
+ errno = ENOMEM;
|
||||
+ os_error ("Integer overflow in xmallocarray");
|
||||
+ }
|
||||
+
|
||||
+ return internal_malloc_size (nmemb * size);
|
||||
+}
|
||||
+
|
||||
+static inline __attribute__((__always_inline__, __unused__))
|
||||
+#include "intrinsics/reshape_packed.c"
|
||||
+
|
||||
+struct no_bounds_check { int bounds_check; };
|
||||
+#define compile_options ((struct no_bounds_check) { .bounds_check = 0 })
|
||||
+
|
||||
+#define internal_error(x, y...) runtime_error (y)
|
||||
+
|
||||
+#endif
|
||||
+
|
||||
#endif /* LIBGFOR_H */
|
||||
--- libgfortran/runtime/nonshared-error.c.jj 2021-05-11 20:24:18.939549444 +0200
|
||||
+++ libgfortran/runtime/nonshared-error.c 2021-05-11 20:24:18.939549444 +0200
|
||||
@@ -0,0 +1,56 @@
|
||||
+/* Copyright (C) 2020-2021 Free Software Foundation, Inc.
|
||||
+
|
||||
+This file is part of the GNU Fortran runtime library (libgfortran).
|
||||
+
|
||||
+Libgfortran is free software; you can redistribute it and/or modify
|
||||
+it under the terms of the GNU General Public License as published by
|
||||
+the Free Software Foundation; either version 3, or (at your option)
|
||||
+any later version.
|
||||
+
|
||||
+Libgfortran is distributed in the hope that it will be useful,
|
||||
+but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+GNU General Public License for more details.
|
||||
+
|
||||
+Under Section 7 of GPL version 3, you are granted additional
|
||||
+permissions described in the GCC Runtime Library Exception, version
|
||||
+3.1, as published by the Free Software Foundation.
|
||||
+
|
||||
+You should have received a copy of the GNU General Public License and
|
||||
+a copy of the GCC Runtime Library Exception along with this program;
|
||||
+see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||
+<http://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+
|
||||
+#define LIBGFORTRAN_NONSHARED
|
||||
+#include "libgfortran.h"
|
||||
+#include "io.h"
|
||||
+#include "async.h"
|
||||
+
|
||||
+#include <string.h>
|
||||
+#include <stdio.h>
|
||||
+
|
||||
+/* Improved version of os_error with a printf style format string and
|
||||
+ a locus. */
|
||||
+
|
||||
+void
|
||||
+os_error_at (const char *where, const char *message, ...)
|
||||
+{
|
||||
+ char buf[4096];
|
||||
+ size_t len = strlen (where);
|
||||
+ int written;
|
||||
+ va_list ap;
|
||||
+
|
||||
+ if (len >= 2048)
|
||||
+ os_error ("Unknown error");
|
||||
+ memcpy (buf, where, len);
|
||||
+ memcpy (buf + len, ": ", 2);
|
||||
+ va_start (ap, message);
|
||||
+ written = vsnprintf (buf + len + 2, 4095 - len - 2, message, ap);
|
||||
+ va_end (ap);
|
||||
+ if (written < 0)
|
||||
+ written = 0;
|
||||
+ buf[len + 2 + written] = '\0';
|
||||
+ os_error (buf);
|
||||
+}
|
||||
+iexport(os_error_at);
|
||||
--- libgfortran/io/nonshared-transfer.c.jj 2021-05-11 20:24:18.950549331 +0200
|
||||
+++ libgfortran/io/nonshared-transfer.c 2021-05-11 20:24:18.950549331 +0200
|
||||
@@ -0,0 +1,42 @@
|
||||
+/* Copyright (C) 2002-2021 Free Software Foundation, Inc.
|
||||
+ Contributed by Andy Vaught
|
||||
+ Namelist transfer functions contributed by Paul Thomas
|
||||
+ F2003 I/O support contributed by Jerry DeLisle
|
||||
+
|
||||
+This file is part of the GNU Fortran runtime library (libgfortran).
|
||||
+
|
||||
+Libgfortran is free software; you can redistribute it and/or modify
|
||||
+it under the terms of the GNU General Public License as published by
|
||||
+the Free Software Foundation; either version 3, or (at your option)
|
||||
+any later version.
|
||||
+
|
||||
+Libgfortran is distributed in the hope that it will be useful,
|
||||
+but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+GNU General Public License for more details.
|
||||
+
|
||||
+Under Section 7 of GPL version 3, you are granted additional
|
||||
+permissions described in the GCC Runtime Library Exception, version
|
||||
+3.1, as published by the Free Software Foundation.
|
||||
+
|
||||
+You should have received a copy of the GNU General Public License and
|
||||
+a copy of the GCC Runtime Library Exception along with this program;
|
||||
+see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||
+<http://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+
|
||||
+/* transfer.c -- Top level handling of data transfer statements. */
|
||||
+
|
||||
+#include "io.h"
|
||||
+#include "fbuf.h"
|
||||
+#include "format.h"
|
||||
+#include "unix.h"
|
||||
+#include "async.h"
|
||||
+#include <string.h>
|
||||
+#include <errno.h>
|
||||
+
|
||||
+void
|
||||
+st_wait_async (st_parameter_wait *wtp)
|
||||
+{
|
||||
+ (void) wtp;
|
||||
+}
|
@ -0,0 +1,17 @@
|
||||
2008-06-09 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* 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
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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 @@
|
||||
<a class="link" href="https://www.fsf.org" target="_top">FSF
|
||||
</a>
|
||||
</p><p>
|
||||
+ Release 11.2.1
|
||||
+ </p><p>
|
||||
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.
|
||||
</p><p>
|
||||
- The API documentation, rendered into HTML, can be viewed online
|
||||
+ The API documentation, rendered into HTML, can be viewed locally
|
||||
+ <a class="link" href="api/index.html" target="_top">for the 11.2.1 release</a>,
|
||||
+ online
|
||||
<a class="link" href="http://gcc.gnu.org/onlinedocs/" target="_top">for each GCC release</a>
|
||||
and
|
||||
<a class="link" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/index.html" target="_top">
|
@ -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
|
@ -0,0 +1,457 @@
|
||||
From 54ccc52ba3f842cd94718967465a6015a752ca47 Mon Sep 17 00:00:00 2001
|
||||
From: "Cui,Lili" <lili.cui@intel.com>
|
||||
Date: Thu, 4 Nov 2021 10:38:56 +0800
|
||||
Subject: [PATCH] x86: Update -mtune=alderlake
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Update mtune for alderlake, Alder Lake Intel Hybrid Technology will not support
|
||||
Intel® AVX-512. ISA features such as Intel® AVX, AVX-VNNI, Intel® AVX2, and
|
||||
UMONITOR/UMWAIT/TPAUSE are supported.
|
||||
|
||||
gcc/ChangeLog
|
||||
|
||||
* config/i386/i386-options.c (m_CORE_AVX2): Remove Alderlake
|
||||
from m_CORE_AVX2.
|
||||
(processor_cost_table): Use alderlake_cost for Alderlake.
|
||||
* config/i386/i386.c (ix86_sched_init_global): Handle Alderlake.
|
||||
* config/i386/x86-tune-costs.h (struct processor_costs): Add alderlake
|
||||
cost.
|
||||
* config/i386/x86-tune-sched.c (ix86_issue_rate): Change Alderlake
|
||||
issue rate to 4.
|
||||
(ix86_adjust_cost): Handle Alderlake.
|
||||
* config/i386/x86-tune.def (X86_TUNE_SCHEDULE): Enable for Alderlake.
|
||||
(X86_TUNE_PARTIAL_REG_DEPENDENCY): Likewise.
|
||||
(X86_TUNE_SSE_PARTIAL_REG_DEPENDENCY): Likewise.
|
||||
(X86_TUNE_SSE_PARTIAL_REG_FP_CONVERTS_DEPENDENCY): Likewise.
|
||||
(X86_TUNE_SSE_PARTIAL_REG_CONVERTS_DEPENDENCY): Likewise.
|
||||
(X86_TUNE_MEMORY_MISMATCH_STALL): Likewise.
|
||||
(X86_TUNE_USE_LEAVE): Likewise.
|
||||
(X86_TUNE_PUSH_MEMORY): Likewise.
|
||||
(X86_TUNE_USE_INCDEC): Likewise.
|
||||
(X86_TUNE_INTEGER_DFMODE_MOVES): Likewise.
|
||||
(X86_TUNE_MISALIGNED_MOVE_STRING_PRO_EPILOGUES): Likewise.
|
||||
(X86_TUNE_USE_SAHF): Likewise.
|
||||
(X86_TUNE_USE_BT): Likewise.
|
||||
(X86_TUNE_AVOID_FALSE_DEP_FOR_BMI): Likewise.
|
||||
(X86_TUNE_ONE_IF_CONV_INSN): Likewise.
|
||||
(X86_TUNE_AVOID_MFENCE): Likewise.
|
||||
(X86_TUNE_USE_SIMODE_FIOP): Likewise.
|
||||
(X86_TUNE_EXT_80387_CONSTANTS): Likewise.
|
||||
(X86_TUNE_SSE_UNALIGNED_LOAD_OPTIMAL): Likewise.
|
||||
(X86_TUNE_SSE_UNALIGNED_STORE_OPTIMAL): Likewise.
|
||||
(X86_TUNE_SSE_TYPELESS_STORES): Likewise.
|
||||
(X86_TUNE_SSE_LOAD0_BY_PXOR): Likewise.
|
||||
(X86_TUNE_AVOID_4BYTE_PREFIXES): Likewise.
|
||||
(X86_TUNE_USE_GATHER): Disable for Alderlake.
|
||||
---
|
||||
gcc/config/i386/i386-options.c | 4 +-
|
||||
gcc/config/i386/i386.c | 1 +
|
||||
gcc/config/i386/x86-tune-costs.h | 120 +++++++++++++++++++++++++++++++
|
||||
gcc/config/i386/x86-tune-sched.c | 2 +
|
||||
gcc/config/i386/x86-tune.def | 58 +++++++--------
|
||||
5 files changed, 155 insertions(+), 30 deletions(-)
|
||||
|
||||
diff --git a/gcc/config/i386/i386-options.c b/gcc/config/i386/i386-options.c
|
||||
index e7a3bd4aaea..a8cc0664f11 100644
|
||||
--- a/gcc/config/i386/i386-options.c
|
||||
+++ b/gcc/config/i386/i386-options.c
|
||||
@@ -131,7 +131,7 @@ along with GCC; see the file COPYING3. If not see
|
||||
| m_ICELAKE_CLIENT | m_ICELAKE_SERVER | m_CASCADELAKE \
|
||||
| m_TIGERLAKE | m_COOPERLAKE | m_SAPPHIRERAPIDS \
|
||||
| m_ROCKETLAKE)
|
||||
-#define m_CORE_AVX2 (m_HASWELL | m_SKYLAKE | m_ALDERLAKE | m_CORE_AVX512)
|
||||
+#define m_CORE_AVX2 (m_HASWELL | m_SKYLAKE | m_CORE_AVX512)
|
||||
#define m_CORE_ALL (m_CORE2 | m_NEHALEM | m_SANDYBRIDGE | m_CORE_AVX2)
|
||||
#define m_GOLDMONT (HOST_WIDE_INT_1U<<PROCESSOR_GOLDMONT)
|
||||
#define m_GOLDMONT_PLUS (HOST_WIDE_INT_1U<<PROCESSOR_GOLDMONT_PLUS)
|
||||
@@ -736,7 +736,7 @@ static const struct processor_costs *processor_cost_table[] =
|
||||
&icelake_cost,
|
||||
&skylake_cost,
|
||||
&icelake_cost,
|
||||
- &icelake_cost,
|
||||
+ &alderlake_cost,
|
||||
&icelake_cost,
|
||||
&intel_cost,
|
||||
&geode_cost,
|
||||
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
|
||||
index e94efdf39fb..73c4d5115bb 100644
|
||||
--- a/gcc/config/i386/i386.c
|
||||
+++ b/gcc/config/i386/i386.c
|
||||
@@ -17014,6 +17014,7 @@ ix86_sched_init_global (FILE *, int, int)
|
||||
case PROCESSOR_SANDYBRIDGE:
|
||||
case PROCESSOR_HASWELL:
|
||||
case PROCESSOR_TREMONT:
|
||||
+ case PROCESSOR_ALDERLAKE:
|
||||
case PROCESSOR_GENERIC:
|
||||
/* Do not perform multipass scheduling for pre-reload schedule
|
||||
to save compile time. */
|
||||
diff --git a/gcc/config/i386/x86-tune-costs.h b/gcc/config/i386/x86-tune-costs.h
|
||||
index 93644be9cb3..dd5563d2e64 100644
|
||||
--- a/gcc/config/i386/x86-tune-costs.h
|
||||
+++ b/gcc/config/i386/x86-tune-costs.h
|
||||
@@ -2070,6 +2070,126 @@ struct processor_costs icelake_cost = {
|
||||
"16", /* Func alignment. */
|
||||
};
|
||||
|
||||
+/* alderlake_cost should produce code tuned for alderlake family of CPUs. */
|
||||
+static stringop_algs alderlake_memcpy[2] = {
|
||||
+ {libcall,
|
||||
+ {{256, rep_prefix_1_byte, true},
|
||||
+ {256, loop, false},
|
||||
+ {-1, libcall, false}}},
|
||||
+ {libcall,
|
||||
+ {{256, rep_prefix_1_byte, true},
|
||||
+ {256, loop, false},
|
||||
+ {-1, libcall, false}}}};
|
||||
+static stringop_algs alderlake_memset[2] = {
|
||||
+ {libcall,
|
||||
+ {{256, rep_prefix_1_byte, true},
|
||||
+ {256, loop, false},
|
||||
+ {-1, libcall, false}}},
|
||||
+ {libcall,
|
||||
+ {{256, rep_prefix_1_byte, true},
|
||||
+ {256, loop, false},
|
||||
+ {-1, libcall, false}}}};
|
||||
+static const
|
||||
+struct processor_costs alderlake_cost = {
|
||||
+ {
|
||||
+ /* Start of register allocator costs. integer->integer move cost is 2. */
|
||||
+ 6, /* cost for loading QImode using movzbl */
|
||||
+ {6, 6, 6}, /* cost of loading integer registers
|
||||
+ in QImode, HImode and SImode.
|
||||
+ Relative to reg-reg move (2). */
|
||||
+ {6, 6, 6}, /* cost of storing integer registers */
|
||||
+ 4, /* cost of reg,reg fld/fst */
|
||||
+ {6, 6, 12}, /* cost of loading fp registers
|
||||
+ in SFmode, DFmode and XFmode */
|
||||
+ {6, 6, 12}, /* cost of storing fp registers
|
||||
+ in SFmode, DFmode and XFmode */
|
||||
+ 2, /* cost of moving MMX register */
|
||||
+ {6, 6}, /* cost of loading MMX registers
|
||||
+ in SImode and DImode */
|
||||
+ {6, 6}, /* cost of storing MMX registers
|
||||
+ in SImode and DImode */
|
||||
+ 2, 3, 4, /* cost of moving XMM,YMM,ZMM register */
|
||||
+ {6, 6, 6, 10, 15}, /* cost of loading SSE registers
|
||||
+ in 32,64,128,256 and 512-bit */
|
||||
+ {6, 6, 6, 10, 15}, /* cost of storing SSE registers
|
||||
+ in 32,64,128,256 and 512-bit */
|
||||
+ 6, 6, /* SSE->integer and integer->SSE moves */
|
||||
+ 6, 6, /* mask->integer and integer->mask moves */
|
||||
+ {6, 6, 6}, /* cost of loading mask register
|
||||
+ in QImode, HImode, SImode. */
|
||||
+ {6, 6, 6}, /* cost if storing mask register
|
||||
+ in QImode, HImode, SImode. */
|
||||
+ 2, /* cost of moving mask register. */
|
||||
+ /* End of register allocator costs. */
|
||||
+ },
|
||||
+
|
||||
+ COSTS_N_INSNS (1), /* cost of an add instruction */
|
||||
+ COSTS_N_INSNS (1) + 1, /* cost of a lea instruction */
|
||||
+ COSTS_N_INSNS (1), /* variable shift costs */
|
||||
+ COSTS_N_INSNS (1), /* constant shift costs */
|
||||
+ {COSTS_N_INSNS (3), /* cost of starting multiply for QI */
|
||||
+ COSTS_N_INSNS (4), /* HI */
|
||||
+ COSTS_N_INSNS (3), /* SI */
|
||||
+ COSTS_N_INSNS (4), /* DI */
|
||||
+ COSTS_N_INSNS (4)}, /* other */
|
||||
+ 0, /* cost of multiply per each bit set */
|
||||
+ {COSTS_N_INSNS (16), /* cost of a divide/mod for QI */
|
||||
+ COSTS_N_INSNS (22), /* HI */
|
||||
+ COSTS_N_INSNS (30), /* SI */
|
||||
+ COSTS_N_INSNS (74), /* DI */
|
||||
+ COSTS_N_INSNS (74)}, /* other */
|
||||
+ COSTS_N_INSNS (1), /* cost of movsx */
|
||||
+ COSTS_N_INSNS (1), /* cost of movzx */
|
||||
+ 8, /* "large" insn */
|
||||
+ 17, /* MOVE_RATIO */
|
||||
+ 17, /* CLEAR_RATIO */
|
||||
+ {6, 6, 6}, /* cost of loading integer registers
|
||||
+ in QImode, HImode and SImode.
|
||||
+ Relative to reg-reg move (2). */
|
||||
+ {6, 6, 6}, /* cost of storing integer registers */
|
||||
+ {6, 6, 6, 10, 15}, /* cost of loading SSE register
|
||||
+ in 32bit, 64bit, 128bit, 256bit and 512bit */
|
||||
+ {6, 6, 6, 10, 15}, /* cost of storing SSE register
|
||||
+ in 32bit, 64bit, 128bit, 256bit and 512bit */
|
||||
+ {6, 6, 6, 10, 15}, /* cost of unaligned loads. */
|
||||
+ {6, 6, 6, 10, 15}, /* cost of unaligned storess. */
|
||||
+ 2, 3, 4, /* cost of moving XMM,YMM,ZMM register */
|
||||
+ 6, /* cost of moving SSE register to integer. */
|
||||
+ 18, 6, /* Gather load static, per_elt. */
|
||||
+ 18, 6, /* Gather store static, per_elt. */
|
||||
+ 32, /* size of l1 cache. */
|
||||
+ 512, /* size of l2 cache. */
|
||||
+ 64, /* size of prefetch block */
|
||||
+ 6, /* number of parallel prefetches */
|
||||
+ 3, /* Branch cost */
|
||||
+ COSTS_N_INSNS (3), /* cost of FADD and FSUB insns. */
|
||||
+ COSTS_N_INSNS (5), /* cost of FMUL instruction. */
|
||||
+ COSTS_N_INSNS (17), /* cost of FDIV instruction. */
|
||||
+ COSTS_N_INSNS (1), /* cost of FABS instruction. */
|
||||
+ COSTS_N_INSNS (1), /* cost of FCHS instruction. */
|
||||
+ COSTS_N_INSNS (14), /* cost of FSQRT instruction. */
|
||||
+
|
||||
+ COSTS_N_INSNS (1), /* cost of cheap SSE instruction. */
|
||||
+ COSTS_N_INSNS (3), /* cost of ADDSS/SD SUBSS/SD insns. */
|
||||
+ COSTS_N_INSNS (4), /* cost of MULSS instruction. */
|
||||
+ COSTS_N_INSNS (5), /* cost of MULSD instruction. */
|
||||
+ COSTS_N_INSNS (5), /* cost of FMA SS instruction. */
|
||||
+ COSTS_N_INSNS (5), /* cost of FMA SD instruction. */
|
||||
+ COSTS_N_INSNS (13), /* cost of DIVSS instruction. */
|
||||
+ COSTS_N_INSNS (17), /* cost of DIVSD instruction. */
|
||||
+ COSTS_N_INSNS (14), /* cost of SQRTSS instruction. */
|
||||
+ COSTS_N_INSNS (18), /* cost of SQRTSD instruction. */
|
||||
+ 1, 4, 3, 3, /* reassoc int, fp, vec_int, vec_fp. */
|
||||
+ alderlake_memcpy,
|
||||
+ alderlake_memset,
|
||||
+ COSTS_N_INSNS (4), /* cond_taken_branch_cost. */
|
||||
+ COSTS_N_INSNS (2), /* cond_not_taken_branch_cost. */
|
||||
+ "16:11:8", /* Loop alignment. */
|
||||
+ "16:11:8", /* Jump alignment. */
|
||||
+ "0:0:8", /* Label alignment. */
|
||||
+ "16", /* Func alignment. */
|
||||
+};
|
||||
+
|
||||
/* BTVER1 has optimized REP instruction for medium sized blocks, but for
|
||||
very small blocks it is better to use loop. For large blocks, libcall can
|
||||
do nontemporary accesses and beat inline considerably. */
|
||||
diff --git a/gcc/config/i386/x86-tune-sched.c b/gcc/config/i386/x86-tune-sched.c
|
||||
index 56ada99a450..0c149a09531 100644
|
||||
--- a/gcc/config/i386/x86-tune-sched.c
|
||||
+++ b/gcc/config/i386/x86-tune-sched.c
|
||||
@@ -72,6 +72,7 @@ ix86_issue_rate (void)
|
||||
case PROCESSOR_SANDYBRIDGE:
|
||||
case PROCESSOR_HASWELL:
|
||||
case PROCESSOR_TREMONT:
|
||||
+ case PROCESSOR_ALDERLAKE:
|
||||
case PROCESSOR_GENERIC:
|
||||
return 4;
|
||||
|
||||
@@ -431,6 +432,7 @@ ix86_adjust_cost (rtx_insn *insn, int dep_type, rtx_insn *dep_insn, int cost,
|
||||
case PROCESSOR_SANDYBRIDGE:
|
||||
case PROCESSOR_HASWELL:
|
||||
case PROCESSOR_TREMONT:
|
||||
+ case PROCESSOR_ALDERLAKE:
|
||||
case PROCESSOR_GENERIC:
|
||||
/* Stack engine allows to execute push&pop instructions in parall. */
|
||||
if ((insn_type == TYPE_PUSH || insn_type == TYPE_POP)
|
||||
diff --git a/gcc/config/i386/x86-tune.def b/gcc/config/i386/x86-tune.def
|
||||
index 58e8ead56b4..4ae0b569841 100644
|
||||
--- a/gcc/config/i386/x86-tune.def
|
||||
+++ b/gcc/config/i386/x86-tune.def
|
||||
@@ -42,7 +42,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||
DEF_TUNE (X86_TUNE_SCHEDULE, "schedule",
|
||||
m_PENT | m_LAKEMONT | m_PPRO | m_CORE_ALL | m_BONNELL | m_SILVERMONT
|
||||
| m_INTEL | m_KNL | m_KNM | m_K6_GEODE | m_AMD_MULTIPLE | m_GOLDMONT
|
||||
- | m_GOLDMONT_PLUS | m_TREMONT | m_GENERIC)
|
||||
+ | m_GOLDMONT_PLUS | m_TREMONT | m_ALDERLAKE |m_GENERIC)
|
||||
|
||||
/* X86_TUNE_PARTIAL_REG_DEPENDENCY: Enable more register renaming
|
||||
on modern chips. Preffer stores affecting whole integer register
|
||||
@@ -51,7 +51,7 @@ DEF_TUNE (X86_TUNE_SCHEDULE, "schedule",
|
||||
DEF_TUNE (X86_TUNE_PARTIAL_REG_DEPENDENCY, "partial_reg_dependency",
|
||||
m_P4_NOCONA | m_CORE2 | m_NEHALEM | m_SANDYBRIDGE | m_CORE_AVX2
|
||||
| m_BONNELL | m_SILVERMONT | m_GOLDMONT | m_GOLDMONT_PLUS | m_INTEL
|
||||
- | m_KNL | m_KNM | m_AMD_MULTIPLE | m_TREMONT
|
||||
+ | m_KNL | m_KNM | m_AMD_MULTIPLE | m_TREMONT | m_ALDERLAKE
|
||||
| m_GENERIC)
|
||||
|
||||
/* X86_TUNE_SSE_PARTIAL_REG_DEPENDENCY: This knob promotes all store
|
||||
@@ -62,7 +62,7 @@ DEF_TUNE (X86_TUNE_PARTIAL_REG_DEPENDENCY, "partial_reg_dependency",
|
||||
that can be partly masked by careful scheduling of moves. */
|
||||
DEF_TUNE (X86_TUNE_SSE_PARTIAL_REG_DEPENDENCY, "sse_partial_reg_dependency",
|
||||
m_PPRO | m_P4_NOCONA | m_CORE_ALL | m_BONNELL | m_AMDFAM10
|
||||
- | m_BDVER | m_ZNVER | m_TREMONT | m_GENERIC)
|
||||
+ | m_BDVER | m_ZNVER | m_TREMONT | m_ALDERLAKE | m_GENERIC)
|
||||
|
||||
/* X86_TUNE_SSE_PARTIAL_REG_FP_CONVERTS_DEPENDENCY: This knob avoids
|
||||
partial write to the destination in scalar SSE conversion from FP
|
||||
@@ -70,14 +70,14 @@ DEF_TUNE (X86_TUNE_SSE_PARTIAL_REG_DEPENDENCY, "sse_partial_reg_dependency",
|
||||
DEF_TUNE (X86_TUNE_SSE_PARTIAL_REG_FP_CONVERTS_DEPENDENCY,
|
||||
"sse_partial_reg_fp_converts_dependency",
|
||||
m_PPRO | m_P4_NOCONA | m_CORE_ALL | m_BONNELL | m_AMDFAM10
|
||||
- | m_BDVER | m_ZNVER | m_GENERIC)
|
||||
+ | m_BDVER | m_ZNVER | m_ALDERLAKE| m_GENERIC)
|
||||
|
||||
/* X86_TUNE_SSE_PARTIAL_REG_CONVERTS_DEPENDENCY: This knob avoids partial
|
||||
write to the destination in scalar SSE conversion from integer to FP. */
|
||||
DEF_TUNE (X86_TUNE_SSE_PARTIAL_REG_CONVERTS_DEPENDENCY,
|
||||
"sse_partial_reg_converts_dependency",
|
||||
m_PPRO | m_P4_NOCONA | m_CORE_ALL | m_BONNELL | m_AMDFAM10
|
||||
- | m_BDVER | m_ZNVER | m_GENERIC)
|
||||
+ | m_BDVER | m_ZNVER | m_ALDERLAKE | m_GENERIC)
|
||||
|
||||
/* X86_TUNE_SSE_SPLIT_REGS: Set for machines where the type and dependencies
|
||||
are resolved on SSE register parts instead of whole registers, so we may
|
||||
@@ -103,14 +103,14 @@ DEF_TUNE (X86_TUNE_MOVX, "movx",
|
||||
m_PPRO | m_P4_NOCONA | m_CORE2 | m_NEHALEM | m_SANDYBRIDGE
|
||||
| m_BONNELL | m_SILVERMONT | m_GOLDMONT | m_KNL | m_KNM | m_INTEL
|
||||
| m_GOLDMONT_PLUS | m_GEODE | m_AMD_MULTIPLE
|
||||
- | m_CORE_AVX2 | m_TREMONT | m_GENERIC)
|
||||
+ | m_CORE_AVX2 | m_TREMONT | m_ALDERLAKE | m_GENERIC)
|
||||
|
||||
/* X86_TUNE_MEMORY_MISMATCH_STALL: Avoid partial stores that are followed by
|
||||
full sized loads. */
|
||||
DEF_TUNE (X86_TUNE_MEMORY_MISMATCH_STALL, "memory_mismatch_stall",
|
||||
m_P4_NOCONA | m_CORE_ALL | m_BONNELL | m_SILVERMONT | m_INTEL
|
||||
| m_KNL | m_KNM | m_GOLDMONT | m_GOLDMONT_PLUS | m_AMD_MULTIPLE
|
||||
- | m_TREMONT | m_GENERIC)
|
||||
+ | m_TREMONT | m_ALDERLAKE | m_GENERIC)
|
||||
|
||||
/* X86_TUNE_FUSE_CMP_AND_BRANCH_32: Fuse compare with a subsequent
|
||||
conditional jump instruction for 32 bit TARGET. */
|
||||
@@ -166,14 +166,14 @@ DEF_TUNE (X86_TUNE_EPILOGUE_USING_MOVE, "epilogue_using_move",
|
||||
/* X86_TUNE_USE_LEAVE: Use "leave" instruction in epilogues where it fits. */
|
||||
DEF_TUNE (X86_TUNE_USE_LEAVE, "use_leave",
|
||||
m_386 | m_CORE_ALL | m_K6_GEODE | m_AMD_MULTIPLE | m_TREMONT
|
||||
- | m_GENERIC)
|
||||
+ | m_ALDERLAKE | m_GENERIC)
|
||||
|
||||
/* X86_TUNE_PUSH_MEMORY: Enable generation of "push mem" instructions.
|
||||
Some chips, like 486 and Pentium works faster with separate load
|
||||
and push instructions. */
|
||||
DEF_TUNE (X86_TUNE_PUSH_MEMORY, "push_memory",
|
||||
m_386 | m_P4_NOCONA | m_CORE_ALL | m_K6_GEODE | m_AMD_MULTIPLE
|
||||
- | m_TREMONT | m_GENERIC)
|
||||
+ | m_TREMONT | m_ALDERLAKE | m_GENERIC)
|
||||
|
||||
/* X86_TUNE_SINGLE_PUSH: Enable if single push insn is preferred
|
||||
over esp subtraction. */
|
||||
@@ -243,14 +243,14 @@ DEF_TUNE (X86_TUNE_READ_MODIFY, "read_modify", ~(m_PENT | m_LAKEMONT | m_PPRO))
|
||||
DEF_TUNE (X86_TUNE_USE_INCDEC, "use_incdec",
|
||||
~(m_P4_NOCONA | m_CORE2 | m_NEHALEM | m_SANDYBRIDGE
|
||||
| m_BONNELL | m_SILVERMONT | m_INTEL | m_KNL | m_KNM | m_GOLDMONT
|
||||
- | m_GOLDMONT_PLUS | m_TREMONT | m_GENERIC))
|
||||
+ | m_GOLDMONT_PLUS | m_TREMONT | m_ALDERLAKE | m_GENERIC))
|
||||
|
||||
/* X86_TUNE_INTEGER_DFMODE_MOVES: Enable if integer moves are preferred
|
||||
for DFmode copies */
|
||||
DEF_TUNE (X86_TUNE_INTEGER_DFMODE_MOVES, "integer_dfmode_moves",
|
||||
~(m_PPRO | m_P4_NOCONA | m_CORE_ALL | m_BONNELL | m_SILVERMONT
|
||||
| m_KNL | m_KNM | m_INTEL | m_GEODE | m_AMD_MULTIPLE | m_GOLDMONT
|
||||
- | m_GOLDMONT_PLUS | m_TREMONT | m_GENERIC))
|
||||
+ | m_GOLDMONT_PLUS | m_TREMONT | m_ALDERLAKE | m_GENERIC))
|
||||
|
||||
/* X86_TUNE_OPT_AGU: Optimize for Address Generation Unit. This flag
|
||||
will impact LEA instruction selection. */
|
||||
@@ -298,14 +298,14 @@ DEF_TUNE (X86_TUNE_PREFER_KNOWN_REP_MOVSB_STOSB,
|
||||
DEF_TUNE (X86_TUNE_MISALIGNED_MOVE_STRING_PRO_EPILOGUES,
|
||||
"misaligned_move_string_pro_epilogues",
|
||||
m_386 | m_486 | m_CORE_ALL | m_AMD_MULTIPLE | m_TREMONT
|
||||
- | m_GENERIC)
|
||||
+ | m_ALDERLAKE |m_GENERIC)
|
||||
|
||||
/* X86_TUNE_USE_SAHF: Controls use of SAHF. */
|
||||
DEF_TUNE (X86_TUNE_USE_SAHF, "use_sahf",
|
||||
m_PPRO | m_P4_NOCONA | m_CORE_ALL | m_BONNELL | m_SILVERMONT
|
||||
| m_KNL | m_KNM | m_INTEL | m_K6_GEODE | m_K8 | m_AMDFAM10 | m_BDVER
|
||||
| m_BTVER | m_ZNVER | m_GOLDMONT | m_GOLDMONT_PLUS | m_TREMONT
|
||||
- | m_GENERIC)
|
||||
+ | m_ALDERLAKE | m_GENERIC)
|
||||
|
||||
/* X86_TUNE_USE_CLTD: Controls use of CLTD and CTQO instructions. */
|
||||
DEF_TUNE (X86_TUNE_USE_CLTD, "use_cltd",
|
||||
@@ -316,12 +316,12 @@ DEF_TUNE (X86_TUNE_USE_CLTD, "use_cltd",
|
||||
DEF_TUNE (X86_TUNE_USE_BT, "use_bt",
|
||||
m_CORE_ALL | m_BONNELL | m_SILVERMONT | m_KNL | m_KNM | m_INTEL
|
||||
| m_LAKEMONT | m_AMD_MULTIPLE | m_GOLDMONT | m_GOLDMONT_PLUS
|
||||
- | m_TREMONT | m_GENERIC)
|
||||
+ | m_TREMONT | m_ALDERLAKE | m_GENERIC)
|
||||
|
||||
/* X86_TUNE_AVOID_FALSE_DEP_FOR_BMI: Avoid false dependency
|
||||
for bit-manipulation instructions. */
|
||||
DEF_TUNE (X86_TUNE_AVOID_FALSE_DEP_FOR_BMI, "avoid_false_dep_for_bmi",
|
||||
- m_SANDYBRIDGE | m_CORE_AVX2 | m_TREMONT | m_GENERIC)
|
||||
+ m_SANDYBRIDGE | m_CORE_AVX2 | m_TREMONT | m_ALDERLAKE | m_GENERIC)
|
||||
|
||||
/* X86_TUNE_ADJUST_UNROLL: This enables adjusting the unroll factor based
|
||||
on hardware capabilities. Bdver3 hardware has a loop buffer which makes
|
||||
@@ -333,11 +333,11 @@ DEF_TUNE (X86_TUNE_ADJUST_UNROLL, "adjust_unroll_factor", m_BDVER3 | m_BDVER4)
|
||||
if-converted sequence to one. */
|
||||
DEF_TUNE (X86_TUNE_ONE_IF_CONV_INSN, "one_if_conv_insn",
|
||||
m_SILVERMONT | m_KNL | m_KNM | m_INTEL | m_CORE_ALL | m_GOLDMONT
|
||||
- | m_GOLDMONT_PLUS | m_TREMONT | m_GENERIC)
|
||||
+ | m_GOLDMONT_PLUS | m_TREMONT | m_ALDERLAKE | m_GENERIC)
|
||||
|
||||
/* X86_TUNE_AVOID_MFENCE: Use lock prefixed instructions instead of mfence. */
|
||||
DEF_TUNE (X86_TUNE_AVOID_MFENCE, "avoid_mfence",
|
||||
- m_CORE_ALL | m_BDVER | m_ZNVER | m_TREMONT | m_GENERIC)
|
||||
+ m_CORE_ALL | m_BDVER | m_ZNVER | m_TREMONT | m_ALDERLAKE | m_GENERIC)
|
||||
|
||||
/* X86_TUNE_EXPAND_ABS: This enables a new abs pattern by
|
||||
generating instructions for abs (x) = (((signed) x >> (W-1) ^ x) -
|
||||
@@ -361,7 +361,8 @@ DEF_TUNE (X86_TUNE_USE_HIMODE_FIOP, "use_himode_fiop",
|
||||
DEF_TUNE (X86_TUNE_USE_SIMODE_FIOP, "use_simode_fiop",
|
||||
~(m_PENT | m_LAKEMONT | m_PPRO | m_CORE_ALL | m_BONNELL
|
||||
| m_SILVERMONT | m_KNL | m_KNM | m_INTEL | m_AMD_MULTIPLE
|
||||
- | m_GOLDMONT | m_GOLDMONT_PLUS | m_TREMONT | m_GENERIC))
|
||||
+ | m_GOLDMONT | m_GOLDMONT_PLUS | m_TREMONT | m_ALDERLAKE
|
||||
+ | m_GENERIC))
|
||||
|
||||
/* X86_TUNE_USE_FFREEP: Use freep instruction instead of fstp. */
|
||||
DEF_TUNE (X86_TUNE_USE_FFREEP, "use_ffreep", m_AMD_MULTIPLE)
|
||||
@@ -370,7 +371,7 @@ DEF_TUNE (X86_TUNE_USE_FFREEP, "use_ffreep", m_AMD_MULTIPLE)
|
||||
DEF_TUNE (X86_TUNE_EXT_80387_CONSTANTS, "ext_80387_constants",
|
||||
m_PPRO | m_P4_NOCONA | m_CORE_ALL | m_BONNELL | m_SILVERMONT
|
||||
| m_KNL | m_KNM | m_INTEL | m_K6_GEODE | m_ATHLON_K8 | m_GOLDMONT
|
||||
- | m_GOLDMONT_PLUS | m_TREMONT | m_GENERIC)
|
||||
+ | m_GOLDMONT_PLUS | m_TREMONT | m_ALDERLAKE | m_GENERIC)
|
||||
|
||||
/*****************************************************************************/
|
||||
/* SSE instruction selection tuning */
|
||||
@@ -385,15 +386,15 @@ DEF_TUNE (X86_TUNE_GENERAL_REGS_SSE_SPILL, "general_regs_sse_spill",
|
||||
of a sequence loading registers by parts. */
|
||||
DEF_TUNE (X86_TUNE_SSE_UNALIGNED_LOAD_OPTIMAL, "sse_unaligned_load_optimal",
|
||||
m_NEHALEM | m_SANDYBRIDGE | m_CORE_AVX2 | m_SILVERMONT | m_KNL | m_KNM
|
||||
- | m_INTEL | m_GOLDMONT | m_GOLDMONT_PLUS
|
||||
- | m_TREMONT | m_AMDFAM10 | m_BDVER | m_BTVER | m_ZNVER | m_GENERIC)
|
||||
+ | m_INTEL | m_GOLDMONT | m_GOLDMONT_PLUS | m_TREMONT | m_ALDERLAKE
|
||||
+ | m_AMDFAM10 | m_BDVER | m_BTVER | m_ZNVER | m_GENERIC)
|
||||
|
||||
/* X86_TUNE_SSE_UNALIGNED_STORE_OPTIMAL: Use movups for misaligned stores
|
||||
instead of a sequence loading registers by parts. */
|
||||
DEF_TUNE (X86_TUNE_SSE_UNALIGNED_STORE_OPTIMAL, "sse_unaligned_store_optimal",
|
||||
m_NEHALEM | m_SANDYBRIDGE | m_CORE_AVX2 | m_SILVERMONT | m_KNL | m_KNM
|
||||
| m_INTEL | m_GOLDMONT | m_GOLDMONT_PLUS
|
||||
- | m_TREMONT | m_BDVER | m_ZNVER | m_GENERIC)
|
||||
+ | m_TREMONT | m_ALDERLAKE | m_BDVER | m_ZNVER | m_GENERIC)
|
||||
|
||||
/* X86_TUNE_SSE_PACKED_SINGLE_INSN_OPTIMAL: Use packed single
|
||||
precision 128bit instructions instead of double where possible. */
|
||||
@@ -402,13 +403,13 @@ DEF_TUNE (X86_TUNE_SSE_PACKED_SINGLE_INSN_OPTIMAL, "sse_packed_single_insn_optim
|
||||
|
||||
/* X86_TUNE_SSE_TYPELESS_STORES: Always movaps/movups for 128bit stores. */
|
||||
DEF_TUNE (X86_TUNE_SSE_TYPELESS_STORES, "sse_typeless_stores",
|
||||
- m_AMD_MULTIPLE | m_CORE_ALL | m_TREMONT | m_GENERIC)
|
||||
+ m_AMD_MULTIPLE | m_CORE_ALL | m_TREMONT | m_ALDERLAKE | m_GENERIC)
|
||||
|
||||
/* X86_TUNE_SSE_LOAD0_BY_PXOR: Always use pxor to load0 as opposed to
|
||||
xorps/xorpd and other variants. */
|
||||
DEF_TUNE (X86_TUNE_SSE_LOAD0_BY_PXOR, "sse_load0_by_pxor",
|
||||
m_PPRO | m_P4_NOCONA | m_CORE_ALL | m_BDVER | m_BTVER | m_ZNVER
|
||||
- | m_TREMONT | m_GENERIC)
|
||||
+ | m_TREMONT | m_ALDERLAKE | m_GENERIC)
|
||||
|
||||
/* X86_TUNE_INTER_UNIT_MOVES_TO_VEC: Enable moves in from integer
|
||||
to SSE registers. If disabled, the moves will be done by storing
|
||||
@@ -454,11 +455,12 @@ DEF_TUNE (X86_TUNE_SLOW_PSHUFB, "slow_pshufb",
|
||||
|
||||
/* X86_TUNE_AVOID_4BYTE_PREFIXES: Avoid instructions requiring 4+ bytes of prefixes. */
|
||||
DEF_TUNE (X86_TUNE_AVOID_4BYTE_PREFIXES, "avoid_4byte_prefixes",
|
||||
- m_SILVERMONT | m_GOLDMONT | m_GOLDMONT_PLUS | m_TREMONT | m_INTEL)
|
||||
+ m_SILVERMONT | m_GOLDMONT | m_GOLDMONT_PLUS | m_TREMONT | m_ALDERLAKE
|
||||
+ | m_INTEL)
|
||||
|
||||
/* X86_TUNE_USE_GATHER: Use gather instructions. */
|
||||
DEF_TUNE (X86_TUNE_USE_GATHER, "use_gather",
|
||||
- ~(m_ZNVER1 | m_ZNVER2 | m_GENERIC))
|
||||
+ ~(m_ZNVER1 | m_ZNVER2 | m_GENERIC | m_ALDERLAKE))
|
||||
|
||||
/* X86_TUNE_AVOID_128FMA_CHAINS: Avoid creating loops with tight 128bit or
|
||||
smaller FMA chain. */
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,37 @@
|
||||
2010-02-08 Roland McGrath <roland@redhat.com>
|
||||
|
||||
* 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 \
|
@ -0,0 +1,66 @@
|
||||
c++: Optimize constinit thread_local vars [PR101786]
|
||||
|
||||
The paper that introduced constinit mentioned in rationale that constinit
|
||||
can be used on externs as well and that it can be used to avoid the
|
||||
thread_local initialization wrappers, because the standard requires that
|
||||
if constinit is present on any declaration, it is also present on the
|
||||
initialization declaration, even if it is in some other TU etc.
|
||||
|
||||
There is a small problem though, we use the tls wrappers not just if
|
||||
the thread_local variable needs dynamic initialization, but also when
|
||||
it has static initialization, but non-trivial destructor, as the
|
||||
"dynamic initialization" in that case needs to register the destructor.
|
||||
|
||||
So, the following patch optimizes constinit thread_local vars only
|
||||
if we can prove they will not have non-trivial destructors. That includes
|
||||
the case where we have incomplete type where we don't know and need to
|
||||
conservatively assume the type will have non-trivial destructor at the
|
||||
initializing declaration side.
|
||||
|
||||
2021-08-11 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/101786
|
||||
* decl2.c (var_defined_without_dynamic_init): Return true for
|
||||
DECL_DECLARED_CONSTINIT_P with complete type and trivial destructor.
|
||||
|
||||
* g++.dg/cpp2a/constinit16.C: New test.
|
||||
|
||||
--- gcc/cp/decl2.c
|
||||
+++ gcc/cp/decl2.c
|
||||
@@ -3447,6 +3447,12 @@ set_guard (tree guard)
|
||||
static bool
|
||||
var_defined_without_dynamic_init (tree var)
|
||||
{
|
||||
+ /* constinit vars are guaranteed to not have dynamic initializer,
|
||||
+ but still registering the destructor counts as dynamic initialization. */
|
||||
+ if (DECL_DECLARED_CONSTINIT_P (var)
|
||||
+ && COMPLETE_TYPE_P (TREE_TYPE (var))
|
||||
+ && !TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (var)))
|
||||
+ return true;
|
||||
/* If it's defined in another TU, we can't tell. */
|
||||
if (DECL_EXTERNAL (var))
|
||||
return false;
|
||||
--- gcc/testsuite/g++.dg/cpp2a/constinit16.C
|
||||
+++ gcc/testsuite/g++.dg/cpp2a/constinit16.C
|
||||
@@ -0,0 +1,21 @@
|
||||
+// PR c++/101786
|
||||
+// { dg-do compile { target c++20 } }
|
||||
+// { dg-add-options tls }
|
||||
+// { dg-require-alias "" }
|
||||
+// { dg-require-effective-target tls_runtime }
|
||||
+// { dg-final { scan-assembler-not "_ZTH17mythreadlocalvar1" } }
|
||||
+// { dg-final { scan-assembler "_ZTH17mythreadlocalvar2" } }
|
||||
+// { dg-final { scan-assembler-not "_ZTH17mythreadlocalvar3" } }
|
||||
+// { dg-final { scan-assembler "_ZTH17mythreadlocalvar4" } }
|
||||
+
|
||||
+extern thread_local constinit int mythreadlocalvar1;
|
||||
+struct S;
|
||||
+extern thread_local constinit S mythreadlocalvar2;
|
||||
+struct T { int t; };
|
||||
+extern thread_local constinit T mythreadlocalvar3;
|
||||
+struct U { int u; ~U (); };
|
||||
+extern thread_local constinit U mythreadlocalvar4;
|
||||
+int foo () { return mythreadlocalvar1; }
|
||||
+S *bar () { return &mythreadlocalvar2; }
|
||||
+T *baz () { return &mythreadlocalvar3; }
|
||||
+U *qux () { return &mythreadlocalvar4; }
|
@ -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 <fweimer@redhat.com>
|
||||
|
||||
* 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.
|
@ -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
|
@ -0,0 +1,197 @@
|
||||
libcpp: Fix up #__VA_OPT__ handling [PR103415]
|
||||
|
||||
stringify_arg uses pfile->u_buff to create the string literal.
|
||||
Unfortunately, paste_tokens -> _cpp_lex_direct -> lex_number -> _cpp_unaligned_alloc
|
||||
can in some cases use pfile->u_buff too, which results in losing everything
|
||||
prepared for the string literal until the token pasting.
|
||||
|
||||
The following patch fixes that by not calling paste_token during the
|
||||
construction of the string literal, but doing that before. All the tokens
|
||||
we are processing have been pushed into a token buffer using
|
||||
tokens_buff_add_token so it is fine if we paste some of them in that buffer
|
||||
(successful pasting creates a new token in that buffer), move following
|
||||
tokens if any to make it contiguous, pop (throw away) the extra tokens at
|
||||
the end and then do stringify_arg.
|
||||
|
||||
Also, paste_tokens now copies over PREV_WHITE and PREV_FALLTHROUGH flags
|
||||
from the original lhs token to the replacement token. Copying that way
|
||||
the PREV_WHITE flag is needed for the #__VA_OPT__ handling and copying
|
||||
over PREV_FALLTHROUGH fixes the new Wimplicit-fallthrough-38.c test.
|
||||
|
||||
2021-12-01 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR preprocessor/103415
|
||||
libcpp/
|
||||
* macro.c (stringify_arg): Remove va_opt argument and va_opt handling.
|
||||
(paste_tokens): On successful paste or in PREV_WHITE and
|
||||
PREV_FALLTHROUGH flags from the *plhs token to the new token.
|
||||
(replace_args): Adjust stringify_arg callers. For #__VA_OPT__,
|
||||
perform token pasting in a separate loop before stringify_arg call.
|
||||
gcc/testsuite/
|
||||
* c-c++-common/cpp/va-opt-8.c: New test.
|
||||
* c-c++-common/Wimplicit-fallthrough-38.c: New test.
|
||||
|
||||
--- libcpp/macro.c.jj
|
||||
+++ libcpp/macro.c
|
||||
@@ -295,7 +295,7 @@ static cpp_context *next_context (cpp_re
|
||||
static const cpp_token *padding_token (cpp_reader *, const cpp_token *);
|
||||
static const cpp_token *new_string_token (cpp_reader *, uchar *, unsigned int);
|
||||
static const cpp_token *stringify_arg (cpp_reader *, const cpp_token **,
|
||||
- unsigned int, bool);
|
||||
+ unsigned int);
|
||||
static void paste_all_tokens (cpp_reader *, const cpp_token *);
|
||||
static bool paste_tokens (cpp_reader *, location_t,
|
||||
const cpp_token **, const cpp_token *);
|
||||
@@ -826,8 +826,7 @@ cpp_quote_string (uchar *dest, const uch
|
||||
/* Convert a token sequence FIRST to FIRST+COUNT-1 to a single string token
|
||||
according to the rules of the ISO C #-operator. */
|
||||
static const cpp_token *
|
||||
-stringify_arg (cpp_reader *pfile, const cpp_token **first, unsigned int count,
|
||||
- bool va_opt)
|
||||
+stringify_arg (cpp_reader *pfile, const cpp_token **first, unsigned int count)
|
||||
{
|
||||
unsigned char *dest;
|
||||
unsigned int i, escape_it, backslash_count = 0;
|
||||
@@ -844,24 +843,6 @@ stringify_arg (cpp_reader *pfile, const
|
||||
{
|
||||
const cpp_token *token = first[i];
|
||||
|
||||
- if (va_opt && (token->flags & PASTE_LEFT))
|
||||
- {
|
||||
- location_t virt_loc = pfile->invocation_location;
|
||||
- const cpp_token *rhs;
|
||||
- do
|
||||
- {
|
||||
- if (i == count)
|
||||
- abort ();
|
||||
- rhs = first[++i];
|
||||
- if (!paste_tokens (pfile, virt_loc, &token, rhs))
|
||||
- {
|
||||
- --i;
|
||||
- break;
|
||||
- }
|
||||
- }
|
||||
- while (rhs->flags & PASTE_LEFT);
|
||||
- }
|
||||
-
|
||||
if (token->type == CPP_PADDING)
|
||||
{
|
||||
if (source == NULL
|
||||
@@ -995,6 +976,7 @@ paste_tokens (cpp_reader *pfile, locatio
|
||||
return false;
|
||||
}
|
||||
|
||||
+ lhs->flags |= (*plhs)->flags & (PREV_WHITE | PREV_FALLTHROUGH);
|
||||
*plhs = lhs;
|
||||
_cpp_pop_buffer (pfile);
|
||||
return true;
|
||||
@@ -1937,8 +1919,7 @@ replace_args (cpp_reader *pfile, cpp_has
|
||||
if (src->flags & STRINGIFY_ARG)
|
||||
{
|
||||
if (!arg->stringified)
|
||||
- arg->stringified = stringify_arg (pfile, arg->first, arg->count,
|
||||
- false);
|
||||
+ arg->stringified = stringify_arg (pfile, arg->first, arg->count);
|
||||
}
|
||||
else if ((src->flags & PASTE_LEFT)
|
||||
|| (src != macro->exp.tokens && (src[-1].flags & PASTE_LEFT)))
|
||||
@@ -2065,11 +2046,46 @@ replace_args (cpp_reader *pfile, cpp_has
|
||||
{
|
||||
unsigned int count
|
||||
= start ? paste_flag - start : tokens_buff_count (buff);
|
||||
- const cpp_token *t
|
||||
- = stringify_arg (pfile,
|
||||
- start ? start + 1
|
||||
- : (const cpp_token **) (buff->base),
|
||||
- count, true);
|
||||
+ const cpp_token **first
|
||||
+ = start ? start + 1
|
||||
+ : (const cpp_token **) (buff->base);
|
||||
+ unsigned int i, j;
|
||||
+
|
||||
+ /* Paste any tokens that need to be pasted before calling
|
||||
+ stringify_arg, because stringify_arg uses pfile->u_buff
|
||||
+ which paste_tokens can use as well. */
|
||||
+ for (i = 0, j = 0; i < count; i++, j++)
|
||||
+ {
|
||||
+ const cpp_token *token = first[i];
|
||||
+
|
||||
+ if (token->flags & PASTE_LEFT)
|
||||
+ {
|
||||
+ location_t virt_loc = pfile->invocation_location;
|
||||
+ const cpp_token *rhs;
|
||||
+ do
|
||||
+ {
|
||||
+ if (i == count)
|
||||
+ abort ();
|
||||
+ rhs = first[++i];
|
||||
+ if (!paste_tokens (pfile, virt_loc, &token, rhs))
|
||||
+ {
|
||||
+ --i;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ while (rhs->flags & PASTE_LEFT);
|
||||
+ }
|
||||
+
|
||||
+ first[j] = token;
|
||||
+ }
|
||||
+ if (j != i)
|
||||
+ {
|
||||
+ while (i-- != j)
|
||||
+ tokens_buff_remove_last_token (buff);
|
||||
+ count = j;
|
||||
+ }
|
||||
+
|
||||
+ const cpp_token *t = stringify_arg (pfile, first, count);
|
||||
while (count--)
|
||||
tokens_buff_remove_last_token (buff);
|
||||
if (src->flags & PASTE_LEFT)
|
||||
--- gcc/testsuite/c-c++-common/cpp/va-opt-8.c.jj
|
||||
+++ gcc/testsuite/c-c++-common/cpp/va-opt-8.c
|
||||
@@ -0,0 +1,18 @@
|
||||
+/* PR preprocessor/103415 */
|
||||
+/* { dg-do run } */
|
||||
+/* { dg-options "-std=gnu99" { target c } } */
|
||||
+/* { dg-options "-std=c++20" { target c++ } } */
|
||||
+
|
||||
+#define n(x, ...) = #__VA_OPT__(x##3)
|
||||
+#define o(x, ...) #__VA_OPT__(x##__VA_ARGS__##9)
|
||||
+const char *c n(1 2, 4);
|
||||
+const char *d = o(5 6, 7 8);
|
||||
+
|
||||
+int
|
||||
+main ()
|
||||
+{
|
||||
+ if (__builtin_strcmp (c, "1 23")
|
||||
+ || __builtin_strcmp (d, "5 67 89"))
|
||||
+ __builtin_abort ();
|
||||
+ return 0;
|
||||
+}
|
||||
--- gcc/testsuite/c-c++-common/Wimplicit-fallthrough-38.c.jj
|
||||
+++ gcc/testsuite/c-c++-common/Wimplicit-fallthrough-38.c
|
||||
@@ -0,0 +1,24 @@
|
||||
+/* { dg-do compile } */
|
||||
+/* { dg-options "-Wimplicit-fallthrough=3" } */
|
||||
+
|
||||
+#define FOO \
|
||||
+int \
|
||||
+foo (int a) \
|
||||
+{ \
|
||||
+ switch (a) \
|
||||
+ { \
|
||||
+ case 1: \
|
||||
+ ++a; \
|
||||
+ /* FALLTHRU */ \
|
||||
+ case 2: \
|
||||
+ ++a; \
|
||||
+ /* FALLTHRU */ \
|
||||
+ ca##se 3: \
|
||||
+ ++a; \
|
||||
+ default: \
|
||||
+ break; \
|
||||
+ } \
|
||||
+ return a; \
|
||||
+}
|
||||
+
|
||||
+FOO
|
@ -0,0 +1,307 @@
|
||||
c++: Add C++20 #__VA_OPT__ support
|
||||
|
||||
The following patch implements C++20 # __VA_OPT__ (...) support.
|
||||
Testcases cover what I came up with myself and what LLVM has for #__VA_OPT__
|
||||
in its testsuite and the string literals are identical between the two
|
||||
compilers on the va-opt-5.c testcase.
|
||||
|
||||
2021-08-17 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
libcpp/
|
||||
* macro.c (vaopt_state): Add m_stringify member.
|
||||
(vaopt_state::vaopt_state): Initialize it.
|
||||
(vaopt_state::update): Overwrite it.
|
||||
(vaopt_state::stringify): New method.
|
||||
(stringify_arg): Replace arg argument with first, count arguments
|
||||
and add va_opt argument. Use first instead of arg->first and
|
||||
count instead of arg->count, for va_opt add paste_tokens handling.
|
||||
(paste_tokens): Fix up len calculation. Don't spell rhs twice,
|
||||
instead use %.*s to supply lhs and rhs spelling lengths. Don't call
|
||||
_cpp_backup_tokens here.
|
||||
(paste_all_tokens): Call it here instead.
|
||||
(replace_args): Adjust stringify_arg caller. For vaopt_state::END
|
||||
if stringify is true handle __VA_OPT__ stringification.
|
||||
(create_iso_definition): Handle # __VA_OPT__ similarly to # macro_arg.
|
||||
gcc/testsuite/
|
||||
* c-c++-common/cpp/va-opt-5.c: New test.
|
||||
* c-c++-common/cpp/va-opt-6.c: New test.
|
||||
|
||||
--- libcpp/macro.c
|
||||
+++ libcpp/macro.c
|
||||
@@ -118,6 +118,7 @@ class vaopt_state {
|
||||
m_arg (arg),
|
||||
m_variadic (is_variadic),
|
||||
m_last_was_paste (false),
|
||||
+ m_stringify (false),
|
||||
m_state (0),
|
||||
m_paste_location (0),
|
||||
m_location (0),
|
||||
@@ -145,6 +146,7 @@ class vaopt_state {
|
||||
}
|
||||
++m_state;
|
||||
m_location = token->src_loc;
|
||||
+ m_stringify = (token->flags & STRINGIFY_ARG) != 0;
|
||||
return BEGIN;
|
||||
}
|
||||
else if (m_state == 1)
|
||||
@@ -234,6 +236,12 @@ class vaopt_state {
|
||||
return m_state == 0;
|
||||
}
|
||||
|
||||
+ /* Return true for # __VA_OPT__. */
|
||||
+ bool stringify () const
|
||||
+ {
|
||||
+ return m_stringify;
|
||||
+ }
|
||||
+
|
||||
private:
|
||||
|
||||
/* The cpp_reader. */
|
||||
@@ -247,6 +255,8 @@ class vaopt_state {
|
||||
/* If true, the previous token was ##. This is used to detect when
|
||||
a paste occurs at the end of the sequence. */
|
||||
bool m_last_was_paste;
|
||||
+ /* True for #__VA_OPT__. */
|
||||
+ bool m_stringify;
|
||||
|
||||
/* The state variable:
|
||||
0 means not parsing
|
||||
@@ -284,7 +294,8 @@ static _cpp_buff *collect_args (cpp_read
|
||||
static cpp_context *next_context (cpp_reader *);
|
||||
static const cpp_token *padding_token (cpp_reader *, const cpp_token *);
|
||||
static const cpp_token *new_string_token (cpp_reader *, uchar *, unsigned int);
|
||||
-static const cpp_token *stringify_arg (cpp_reader *, macro_arg *);
|
||||
+static const cpp_token *stringify_arg (cpp_reader *, const cpp_token **,
|
||||
+ unsigned int, bool);
|
||||
static void paste_all_tokens (cpp_reader *, const cpp_token *);
|
||||
static bool paste_tokens (cpp_reader *, location_t,
|
||||
const cpp_token **, const cpp_token *);
|
||||
@@ -812,10 +823,11 @@ cpp_quote_string (uchar *dest, const uch
|
||||
return dest;
|
||||
}
|
||||
|
||||
-/* Convert a token sequence ARG to a single string token according to
|
||||
- the rules of the ISO C #-operator. */
|
||||
+/* Convert a token sequence FIRST to FIRST+COUNT-1 to a single string token
|
||||
+ according to the rules of the ISO C #-operator. */
|
||||
static const cpp_token *
|
||||
-stringify_arg (cpp_reader *pfile, macro_arg *arg)
|
||||
+stringify_arg (cpp_reader *pfile, const cpp_token **first, unsigned int count,
|
||||
+ bool va_opt)
|
||||
{
|
||||
unsigned char *dest;
|
||||
unsigned int i, escape_it, backslash_count = 0;
|
||||
@@ -828,9 +840,27 @@ stringify_arg (cpp_reader *pfile, macro_
|
||||
*dest++ = '"';
|
||||
|
||||
/* Loop, reading in the argument's tokens. */
|
||||
- for (i = 0; i < arg->count; i++)
|
||||
+ for (i = 0; i < count; i++)
|
||||
{
|
||||
- const cpp_token *token = arg->first[i];
|
||||
+ const cpp_token *token = first[i];
|
||||
+
|
||||
+ if (va_opt && (token->flags & PASTE_LEFT))
|
||||
+ {
|
||||
+ location_t virt_loc = pfile->invocation_location;
|
||||
+ const cpp_token *rhs;
|
||||
+ do
|
||||
+ {
|
||||
+ if (i == count)
|
||||
+ abort ();
|
||||
+ rhs = first[++i];
|
||||
+ if (!paste_tokens (pfile, virt_loc, &token, rhs))
|
||||
+ {
|
||||
+ --i;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ while (rhs->flags & PASTE_LEFT);
|
||||
+ }
|
||||
|
||||
if (token->type == CPP_PADDING)
|
||||
{
|
||||
@@ -917,7 +947,7 @@ paste_tokens (cpp_reader *pfile, locatio
|
||||
cpp_token *lhs;
|
||||
unsigned int len;
|
||||
|
||||
- len = cpp_token_len (*plhs) + cpp_token_len (rhs) + 1;
|
||||
+ len = cpp_token_len (*plhs) + cpp_token_len (rhs) + 2;
|
||||
buf = (unsigned char *) alloca (len);
|
||||
end = lhsend = cpp_spell_token (pfile, *plhs, buf, true);
|
||||
|
||||
@@ -943,8 +973,10 @@ paste_tokens (cpp_reader *pfile, locatio
|
||||
location_t saved_loc = lhs->src_loc;
|
||||
|
||||
_cpp_pop_buffer (pfile);
|
||||
- _cpp_backup_tokens (pfile, 1);
|
||||
- *lhsend = '\0';
|
||||
+
|
||||
+ unsigned char *rhsstart = lhsend;
|
||||
+ if ((*plhs)->type == CPP_DIV && rhs->type != CPP_EQ)
|
||||
+ rhsstart++;
|
||||
|
||||
/* We have to remove the PASTE_LEFT flag from the old lhs, but
|
||||
we want to keep the new location. */
|
||||
@@ -956,8 +988,10 @@ paste_tokens (cpp_reader *pfile, locatio
|
||||
/* Mandatory error for all apart from assembler. */
|
||||
if (CPP_OPTION (pfile, lang) != CLK_ASM)
|
||||
cpp_error_with_line (pfile, CPP_DL_ERROR, location, 0,
|
||||
- "pasting \"%s\" and \"%s\" does not give a valid preprocessing token",
|
||||
- buf, cpp_token_as_text (pfile, rhs));
|
||||
+ "pasting \"%.*s\" and \"%.*s\" does not give "
|
||||
+ "a valid preprocessing token",
|
||||
+ (int) (lhsend - buf), buf,
|
||||
+ (int) (end - rhsstart), rhsstart);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1033,7 +1067,10 @@ paste_all_tokens (cpp_reader *pfile, con
|
||||
abort ();
|
||||
}
|
||||
if (!paste_tokens (pfile, virt_loc, &lhs, rhs))
|
||||
- break;
|
||||
+ {
|
||||
+ _cpp_backup_tokens (pfile, 1);
|
||||
+ break;
|
||||
+ }
|
||||
}
|
||||
while (rhs->flags & PASTE_LEFT);
|
||||
|
||||
@@ -1900,7 +1937,8 @@ replace_args (cpp_reader *pfile, cpp_has
|
||||
if (src->flags & STRINGIFY_ARG)
|
||||
{
|
||||
if (!arg->stringified)
|
||||
- arg->stringified = stringify_arg (pfile, arg);
|
||||
+ arg->stringified = stringify_arg (pfile, arg->first, arg->count,
|
||||
+ false);
|
||||
}
|
||||
else if ((src->flags & PASTE_LEFT)
|
||||
|| (src != macro->exp.tokens && (src[-1].flags & PASTE_LEFT)))
|
||||
@@ -2023,6 +2061,24 @@ replace_args (cpp_reader *pfile, cpp_has
|
||||
paste_flag = tokens_buff_last_token_ptr (buff);
|
||||
}
|
||||
|
||||
+ if (vaopt_tracker.stringify ())
|
||||
+ {
|
||||
+ unsigned int count
|
||||
+ = start ? paste_flag - start : tokens_buff_count (buff);
|
||||
+ const cpp_token *t
|
||||
+ = stringify_arg (pfile,
|
||||
+ start ? start + 1
|
||||
+ : (const cpp_token **) (buff->base),
|
||||
+ count, true);
|
||||
+ while (count--)
|
||||
+ tokens_buff_remove_last_token (buff);
|
||||
+ if (src->flags & PASTE_LEFT)
|
||||
+ copy_paste_flag (pfile, &t, src);
|
||||
+ tokens_buff_add_token (buff, virt_locs,
|
||||
+ t, t->src_loc, t->src_loc,
|
||||
+ NULL, 0);
|
||||
+ continue;
|
||||
+ }
|
||||
if (start && paste_flag == start && (*start)->flags & PASTE_LEFT)
|
||||
/* If __VA_OPT__ expands to nothing (either because __VA_ARGS__
|
||||
is empty or because it is __VA_OPT__() ), drop PASTE_LEFT
|
||||
@@ -3584,7 +3640,10 @@ create_iso_definition (cpp_reader *pfile
|
||||
function-like macros when lexing the subsequent token. */
|
||||
if (macro->count > 1 && token[-1].type == CPP_HASH && macro->fun_like)
|
||||
{
|
||||
- if (token->type == CPP_MACRO_ARG)
|
||||
+ if (token->type == CPP_MACRO_ARG
|
||||
+ || (macro->variadic
|
||||
+ && token->type == CPP_NAME
|
||||
+ && token->val.node.node == pfile->spec_nodes.n__VA_OPT__))
|
||||
{
|
||||
if (token->flags & PREV_WHITE)
|
||||
token->flags |= SP_PREV_WHITE;
|
||||
--- gcc/testsuite/c-c++-common/cpp/va-opt-5.c
|
||||
+++ gcc/testsuite/c-c++-common/cpp/va-opt-5.c
|
||||
@@ -0,0 +1,67 @@
|
||||
+/* { dg-do run } */
|
||||
+/* { dg-options "-std=gnu99" { target c } } */
|
||||
+/* { dg-options "-std=c++20" { target c++ } } */
|
||||
+
|
||||
+#define lparen (
|
||||
+#define a0 fooa0
|
||||
+#define a1 fooa1 a0
|
||||
+#define a2 fooa2 a1
|
||||
+#define a3 fooa3 a2
|
||||
+#define a() b lparen )
|
||||
+#define b() c lparen )
|
||||
+#define c() d lparen )
|
||||
+#define g h
|
||||
+#define i(j) j
|
||||
+#define f(...) #__VA_OPT__(g i(0))
|
||||
+#define k(x,...) # __VA_OPT__(x) #x #__VA_OPT__(__VA_ARGS__)
|
||||
+#define l(x,...) #__VA_OPT__(a1 x)
|
||||
+#define m(x,...) "a()" #__VA_OPT__(a3 __VA_ARGS__ x ## __VA_ARGS__ ## x ## c a3) "a()"
|
||||
+#define n(x,...) = #__VA_OPT__(a3 __VA_ARGS__ x ## __VA_ARGS__ ## x ## c a3) #x #__VA_OPT__(a0 __VA_ARGS__ x ## __VA_ARGS__ ## x ## c a0) ;
|
||||
+#define o(x, ...) #__VA_OPT__(x##x x##x)
|
||||
+#define p(x, ...) #__VA_OPT__(_Pragma ("foobar"))
|
||||
+#define q(...) #__VA_OPT__(/* foo */x/* bar */)
|
||||
+const char *v1 = f();
|
||||
+const char *v2 = f(123);
|
||||
+const char *v3 = k(1);
|
||||
+const char *v4 = k(1, 2, 3 );
|
||||
+const char *v5 = l(a());
|
||||
+const char *v6 = l(a1 a(), 1);
|
||||
+const char *v7 = m();
|
||||
+const char *v8 = m(,);
|
||||
+const char *v9 = m(,a3);
|
||||
+const char *v10 = m(a3,a(),a0);
|
||||
+const char *v11 n()
|
||||
+const char *v12 n(,)
|
||||
+const char *v13 n(,a0)
|
||||
+const char *v14 n(a0, a(),a0)
|
||||
+const char *v15 = o(, 0);
|
||||
+const char *v16 = p(0);
|
||||
+const char *v17 = p(0, 1);
|
||||
+const char *v18 = q();
|
||||
+const char *v19 = q(1);
|
||||
+
|
||||
+int
|
||||
+main ()
|
||||
+{
|
||||
+ if (__builtin_strcmp (v1, "")
|
||||
+ || __builtin_strcmp (v2, "g i(0)")
|
||||
+ || __builtin_strcmp (v3, "1")
|
||||
+ || __builtin_strcmp (v4, "112, 3")
|
||||
+ || __builtin_strcmp (v5, "")
|
||||
+ || __builtin_strcmp (v6, "a1 fooa1 fooa0 b ( )")
|
||||
+ || __builtin_strcmp (v7, "a()a()")
|
||||
+ || __builtin_strcmp (v8, "a()a()")
|
||||
+ || __builtin_strcmp (v9, "a()a3 fooa3 fooa2 fooa1 fooa0 a3c a3a()")
|
||||
+ || __builtin_strcmp (v10, "a()a3 b ( ),fooa0 a3a(),a0a3c a3a()")
|
||||
+ || __builtin_strcmp (v11, "")
|
||||
+ || __builtin_strcmp (v12, "")
|
||||
+ || __builtin_strcmp (v13, "a3 fooa0 a0c a3a0 fooa0 a0c a0")
|
||||
+ || __builtin_strcmp (v14, "a3 b ( ),fooa0 a0a(),a0a0c a3a0a0 b ( ),fooa0 a0a(),a0a0c a0")
|
||||
+ || __builtin_strcmp (v15, "")
|
||||
+ || __builtin_strcmp (v16, "")
|
||||
+ || __builtin_strcmp (v17, "_Pragma (\"foobar\")")
|
||||
+ || __builtin_strcmp (v18, "")
|
||||
+ || __builtin_strcmp (v19, "x"))
|
||||
+ __builtin_abort ();
|
||||
+ return 0;
|
||||
+}
|
||||
--- gcc/testsuite/c-c++-common/cpp/va-opt-6.c
|
||||
+++ gcc/testsuite/c-c++-common/cpp/va-opt-6.c
|
||||
@@ -0,0 +1,17 @@
|
||||
+/* { dg-do preprocess } */
|
||||
+/* { dg-options "-std=gnu99" { target c } } */
|
||||
+/* { dg-options "-std=c++20" { target c++ } } */
|
||||
+
|
||||
+#define a ""
|
||||
+#define b(...) a ## #__VA_OPT__(1) /* { dg-error "pasting \"a\" and \"\"\"\" does not give a valid preprocessing token" } */
|
||||
+#define c(...) a ## #__VA_OPT__(1) /* { dg-error "pasting \"a\" and \"\"1\"\" does not give a valid preprocessing token" } */
|
||||
+#define d(...) #__VA_OPT__(1) ## !
|
||||
+#define e(...) #__VA_OPT__(1) ## !
|
||||
+#define f(...) #__VA_OPT__(. ## !)
|
||||
+#define g(...) #__VA_OPT__(. ## !)
|
||||
+b()
|
||||
+c(1)
|
||||
+d( ) /* { dg-error "pasting \"\"\"\" and \"!\" does not give a valid preprocessing token" } */
|
||||
+e( 1 ) /* { dg-error "pasting \"\"1\"\" and \"!\" does not give a valid preprocessing token" } */
|
||||
+f()
|
||||
+g(0) /* { dg-error "pasting \".\" and \"!\" does not give a valid preprocessing token" } */
|
@ -0,0 +1,294 @@
|
||||
From cbd145b132c79c36e990a0eaf10c86159009f18d Mon Sep 17 00:00:00 2001
|
||||
From: "H.J. Lu" <hjl.tools@gmail.com>
|
||||
Date: Wed, 15 Sep 2021 14:15:10 +0800
|
||||
Subject: [PATCH 1/3] x86: Update -mtune=tremont
|
||||
|
||||
Initial -mtune=tremont update
|
||||
|
||||
1. Use Haswell scheduling model.
|
||||
2. Assume that stack engine allows to execute push&pop instructions in
|
||||
parall.
|
||||
3. Prepare for scheduling pass as -mtune=generic.
|
||||
4. Use the same issue rate as -mtune=generic.
|
||||
5. Enable partial_reg_dependency.
|
||||
6. Disable accumulate_outgoing_args
|
||||
7. Enable use_leave
|
||||
8. Enable push_memory
|
||||
9. Disable four_jump_limit
|
||||
10. Disable opt_agu
|
||||
11. Disable avoid_lea_for_addr
|
||||
12. Disable avoid_mem_opnd_for_cmove
|
||||
13. Enable misaligned_move_string_pro_epilogues
|
||||
14. Enable use_cltd
|
||||
16. Enable avoid_false_dep_for_bmi
|
||||
17. Enable avoid_mfence
|
||||
18. Disable expand_abs
|
||||
19. Enable sse_typeless_stores
|
||||
20. Enable sse_load0_by_pxor
|
||||
21. Disable split_mem_opnd_for_fp_converts
|
||||
22. Disable slow_pshufb
|
||||
23. Enable partial_reg_dependency
|
||||
|
||||
This is the first patch to tune for Tremont. With all patches applied,
|
||||
performance impacts on SPEC CPU 2017 are:
|
||||
|
||||
500.perlbench_r 1.81%
|
||||
502.gcc_r 0.57%
|
||||
505.mcf_r 1.16%
|
||||
520.omnetpp_r 0.00%
|
||||
523.xalancbmk_r 0.00%
|
||||
525.x264_r 4.55%
|
||||
531.deepsjeng_r 0.00%
|
||||
541.leela_r 0.39%
|
||||
548.exchange2_r 1.13%
|
||||
557.xz_r 0.00%
|
||||
geomean for intrate 0.95%
|
||||
503.bwaves_r 0.00%
|
||||
507.cactuBSSN_r 6.94%
|
||||
508.namd_r 12.37%
|
||||
510.parest_r 1.01%
|
||||
511.povray_r 3.70%
|
||||
519.lbm_r 36.61%
|
||||
521.wrf_r 8.79%
|
||||
526.blender_r 2.91%
|
||||
527.cam4_r 6.23%
|
||||
538.imagick_r 0.28%
|
||||
544.nab_r 21.99%
|
||||
549.fotonik3d_r 3.63%
|
||||
554.roms_r -1.20%
|
||||
geomean for fprate 7.50%
|
||||
|
||||
gcc/ChangeLog
|
||||
|
||||
* common/config/i386/i386-common.c: Use Haswell scheduling model
|
||||
for Tremont.
|
||||
* config/i386/i386.c (ix86_sched_init_global): Prepare for Tremont
|
||||
scheduling pass.
|
||||
* config/i386/x86-tune-sched.c (ix86_issue_rate): Change Tremont
|
||||
issue rate to 4.
|
||||
(ix86_adjust_cost): Handle Tremont.
|
||||
* config/i386/x86-tune.def (X86_TUNE_SSE_PARTIAL_REG_DEPENDENCY):
|
||||
Enable for Tremont.
|
||||
(X86_TUNE_USE_LEAVE): Likewise.
|
||||
(X86_TUNE_PUSH_MEMORY): Likewise.
|
||||
(X86_TUNE_MISALIGNED_MOVE_STRING_PRO_EPILOGUES): Likewise.
|
||||
(X86_TUNE_USE_CLTD): Likewise.
|
||||
(X86_TUNE_AVOID_FALSE_DEP_FOR_BMI): Likewise.
|
||||
(X86_TUNE_AVOID_MFENCE): Likewise.
|
||||
(X86_TUNE_SSE_TYPELESS_STORES): Likewise.
|
||||
(X86_TUNE_SSE_LOAD0_BY_PXOR): Likewise.
|
||||
(X86_TUNE_ACCUMULATE_OUTGOING_ARGS): Disable for Tremont.
|
||||
(X86_TUNE_FOUR_JUMP_LIMIT): Likewise.
|
||||
(X86_TUNE_OPT_AGU): Likewise.
|
||||
(X86_TUNE_AVOID_LEA_FOR_ADDR): Likewise.
|
||||
(X86_TUNE_AVOID_MEM_OPND_FOR_CMOVE): Likewise.
|
||||
(X86_TUNE_EXPAND_ABS): Likewise.
|
||||
(X86_TUNE_SPLIT_MEM_OPND_FOR_FP_CONVERTS): Likewise.
|
||||
(X86_TUNE_SLOW_PSHUFB): Likewise.
|
||||
---
|
||||
gcc/common/config/i386/i386-common.c | 2 +-
|
||||
gcc/config/i386/i386.c | 1 +
|
||||
gcc/config/i386/x86-tune-sched.c | 2 ++
|
||||
gcc/config/i386/x86-tune.def | 37 ++++++++++++++--------------
|
||||
4 files changed, 23 insertions(+), 19 deletions(-)
|
||||
|
||||
diff --git a/gcc/common/config/i386/i386-common.c b/gcc/common/config/i386/i386-common.c
|
||||
index 38dbb9d9263..ef382ec9a22 100644
|
||||
--- a/gcc/common/config/i386/i386-common.c
|
||||
+++ b/gcc/common/config/i386/i386-common.c
|
||||
@@ -1916,7 +1916,7 @@ const pta processor_alias_table[] =
|
||||
M_CPU_TYPE (INTEL_GOLDMONT), P_PROC_SSE4_2},
|
||||
{"goldmont-plus", PROCESSOR_GOLDMONT_PLUS, CPU_GLM, PTA_GOLDMONT_PLUS,
|
||||
M_CPU_TYPE (INTEL_GOLDMONT_PLUS), P_PROC_SSE4_2},
|
||||
- {"tremont", PROCESSOR_TREMONT, CPU_GLM, PTA_TREMONT,
|
||||
+ {"tremont", PROCESSOR_TREMONT, CPU_HASWELL, PTA_TREMONT,
|
||||
M_CPU_TYPE (INTEL_TREMONT), P_PROC_SSE4_2},
|
||||
{"knl", PROCESSOR_KNL, CPU_SLM, PTA_KNL,
|
||||
M_CPU_TYPE (INTEL_KNL), P_PROC_AVX512F},
|
||||
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
|
||||
index 42c47d2b12b..fc2a27b5cbf 100644
|
||||
--- a/gcc/config/i386/i386.c
|
||||
+++ b/gcc/config/i386/i386.c
|
||||
@@ -16732,6 +16732,7 @@ ix86_sched_init_global (FILE *, int, int)
|
||||
case PROCESSOR_NEHALEM:
|
||||
case PROCESSOR_SANDYBRIDGE:
|
||||
case PROCESSOR_HASWELL:
|
||||
+ case PROCESSOR_TREMONT:
|
||||
case PROCESSOR_GENERIC:
|
||||
/* Do not perform multipass scheduling for pre-reload schedule
|
||||
to save compile time. */
|
||||
diff --git a/gcc/config/i386/x86-tune-sched.c b/gcc/config/i386/x86-tune-sched.c
|
||||
index 2bcc64b865a..278035eec0b 100644
|
||||
--- a/gcc/config/i386/x86-tune-sched.c
|
||||
+++ b/gcc/config/i386/x86-tune-sched.c
|
||||
@@ -71,6 +71,7 @@ ix86_issue_rate (void)
|
||||
case PROCESSOR_NEHALEM:
|
||||
case PROCESSOR_SANDYBRIDGE:
|
||||
case PROCESSOR_HASWELL:
|
||||
+ case PROCESSOR_TREMONT:
|
||||
case PROCESSOR_GENERIC:
|
||||
return 4;
|
||||
|
||||
@@ -430,6 +431,7 @@ ix86_adjust_cost (rtx_insn *insn, int dep_type, rtx_insn *dep_insn, int cost,
|
||||
case PROCESSOR_NEHALEM:
|
||||
case PROCESSOR_SANDYBRIDGE:
|
||||
case PROCESSOR_HASWELL:
|
||||
+ case PROCESSOR_TREMONT:
|
||||
case PROCESSOR_GENERIC:
|
||||
/* Stack engine allows to execute push&pop instructions in parall. */
|
||||
if ((insn_type == TYPE_PUSH || insn_type == TYPE_POP)
|
||||
diff --git a/gcc/config/i386/x86-tune.def b/gcc/config/i386/x86-tune.def
|
||||
index eb057a67750..6bd7087a03f 100644
|
||||
--- a/gcc/config/i386/x86-tune.def
|
||||
+++ b/gcc/config/i386/x86-tune.def
|
||||
@@ -62,7 +62,7 @@ DEF_TUNE (X86_TUNE_PARTIAL_REG_DEPENDENCY, "partial_reg_dependency",
|
||||
that can be partly masked by careful scheduling of moves. */
|
||||
DEF_TUNE (X86_TUNE_SSE_PARTIAL_REG_DEPENDENCY, "sse_partial_reg_dependency",
|
||||
m_PPRO | m_P4_NOCONA | m_CORE_ALL | m_BONNELL | m_AMDFAM10
|
||||
- | m_BDVER | m_ZNVER | m_GENERIC)
|
||||
+ | m_BDVER | m_ZNVER | m_TREMONT | m_GENERIC)
|
||||
|
||||
/* X86_TUNE_SSE_SPLIT_REGS: Set for machines where the type and dependencies
|
||||
are resolved on SSE register parts instead of whole registers, so we may
|
||||
@@ -136,7 +136,7 @@ DEF_TUNE (X86_TUNE_FUSE_ALU_AND_BRANCH, "fuse_alu_and_branch",
|
||||
|
||||
DEF_TUNE (X86_TUNE_ACCUMULATE_OUTGOING_ARGS, "accumulate_outgoing_args",
|
||||
m_PPRO | m_P4_NOCONA | m_BONNELL | m_SILVERMONT | m_KNL | m_KNM | m_INTEL
|
||||
- | m_GOLDMONT | m_GOLDMONT_PLUS | m_TREMONT | m_ATHLON_K8)
|
||||
+ | m_GOLDMONT | m_GOLDMONT_PLUS | m_ATHLON_K8)
|
||||
|
||||
/* X86_TUNE_PROLOGUE_USING_MOVE: Do not use push/pop in prologues that are
|
||||
considered on critical path. */
|
||||
@@ -150,14 +150,15 @@ DEF_TUNE (X86_TUNE_EPILOGUE_USING_MOVE, "epilogue_using_move",
|
||||
|
||||
/* X86_TUNE_USE_LEAVE: Use "leave" instruction in epilogues where it fits. */
|
||||
DEF_TUNE (X86_TUNE_USE_LEAVE, "use_leave",
|
||||
- m_386 | m_CORE_ALL | m_K6_GEODE | m_AMD_MULTIPLE | m_GENERIC)
|
||||
+ m_386 | m_CORE_ALL | m_K6_GEODE | m_AMD_MULTIPLE | m_TREMONT
|
||||
+ | m_GENERIC)
|
||||
|
||||
/* X86_TUNE_PUSH_MEMORY: Enable generation of "push mem" instructions.
|
||||
Some chips, like 486 and Pentium works faster with separate load
|
||||
and push instructions. */
|
||||
DEF_TUNE (X86_TUNE_PUSH_MEMORY, "push_memory",
|
||||
m_386 | m_P4_NOCONA | m_CORE_ALL | m_K6_GEODE | m_AMD_MULTIPLE
|
||||
- | m_GENERIC)
|
||||
+ | m_TREMONT | m_GENERIC)
|
||||
|
||||
/* X86_TUNE_SINGLE_PUSH: Enable if single push insn is preferred
|
||||
over esp subtraction. */
|
||||
@@ -198,8 +199,7 @@ DEF_TUNE (X86_TUNE_PAD_RETURNS, "pad_returns",
|
||||
than 4 branch instructions in the 16 byte window. */
|
||||
DEF_TUNE (X86_TUNE_FOUR_JUMP_LIMIT, "four_jump_limit",
|
||||
m_PPRO | m_P4_NOCONA | m_BONNELL | m_SILVERMONT | m_KNL | m_KNM
|
||||
- | m_GOLDMONT | m_GOLDMONT_PLUS | m_TREMONT | m_INTEL | m_ATHLON_K8
|
||||
- | m_AMDFAM10)
|
||||
+ | m_GOLDMONT | m_GOLDMONT_PLUS | m_INTEL | m_ATHLON_K8 | m_AMDFAM10)
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Integer instruction selection tuning */
|
||||
@@ -240,11 +240,11 @@ DEF_TUNE (X86_TUNE_INTEGER_DFMODE_MOVES, "integer_dfmode_moves",
|
||||
/* X86_TUNE_OPT_AGU: Optimize for Address Generation Unit. This flag
|
||||
will impact LEA instruction selection. */
|
||||
DEF_TUNE (X86_TUNE_OPT_AGU, "opt_agu", m_BONNELL | m_SILVERMONT | m_KNL
|
||||
- | m_KNM | m_GOLDMONT | m_GOLDMONT_PLUS | m_TREMONT | m_INTEL)
|
||||
+ | m_KNM | m_GOLDMONT | m_GOLDMONT_PLUS | m_INTEL)
|
||||
|
||||
/* X86_TUNE_AVOID_LEA_FOR_ADDR: Avoid lea for address computation. */
|
||||
DEF_TUNE (X86_TUNE_AVOID_LEA_FOR_ADDR, "avoid_lea_for_addr",
|
||||
- m_BONNELL | m_SILVERMONT | m_GOLDMONT | m_GOLDMONT_PLUS | m_TREMONT
|
||||
+ m_BONNELL | m_SILVERMONT | m_GOLDMONT | m_GOLDMONT_PLUS
|
||||
| m_KNL | m_KNM)
|
||||
|
||||
/* X86_TUNE_SLOW_IMUL_IMM32_MEM: Imul of 32-bit constant and memory is
|
||||
@@ -263,7 +263,7 @@ DEF_TUNE (X86_TUNE_SLOW_IMUL_IMM8, "slow_imul_imm8",
|
||||
a conditional move. */
|
||||
DEF_TUNE (X86_TUNE_AVOID_MEM_OPND_FOR_CMOVE, "avoid_mem_opnd_for_cmove",
|
||||
m_BONNELL | m_SILVERMONT | m_GOLDMONT | m_GOLDMONT_PLUS | m_KNL
|
||||
- | m_KNM | m_TREMONT | m_INTEL)
|
||||
+ | m_KNM | m_INTEL)
|
||||
|
||||
/* X86_TUNE_SINGLE_STRINGOP: Enable use of single string operations, such
|
||||
as MOVS and STOS (without a REP prefix) to move/set sequences of bytes. */
|
||||
@@ -282,7 +282,8 @@ DEF_TUNE (X86_TUNE_PREFER_KNOWN_REP_MOVSB_STOSB,
|
||||
FIXME: This may actualy be a win on more targets than listed here. */
|
||||
DEF_TUNE (X86_TUNE_MISALIGNED_MOVE_STRING_PRO_EPILOGUES,
|
||||
"misaligned_move_string_pro_epilogues",
|
||||
- m_386 | m_486 | m_CORE_ALL | m_AMD_MULTIPLE | m_GENERIC)
|
||||
+ m_386 | m_486 | m_CORE_ALL | m_AMD_MULTIPLE | m_TREMONT
|
||||
+ | m_GENERIC)
|
||||
|
||||
/* X86_TUNE_USE_SAHF: Controls use of SAHF. */
|
||||
DEF_TUNE (X86_TUNE_USE_SAHF, "use_sahf",
|
||||
@@ -294,7 +295,7 @@ DEF_TUNE (X86_TUNE_USE_SAHF, "use_sahf",
|
||||
/* X86_TUNE_USE_CLTD: Controls use of CLTD and CTQO instructions. */
|
||||
DEF_TUNE (X86_TUNE_USE_CLTD, "use_cltd",
|
||||
~(m_PENT | m_LAKEMONT | m_BONNELL | m_SILVERMONT | m_KNL | m_KNM | m_INTEL
|
||||
- | m_K6 | m_GOLDMONT | m_GOLDMONT_PLUS | m_TREMONT))
|
||||
+ | m_K6 | m_GOLDMONT | m_GOLDMONT_PLUS))
|
||||
|
||||
/* X86_TUNE_USE_BT: Enable use of BT (bit test) instructions. */
|
||||
DEF_TUNE (X86_TUNE_USE_BT, "use_bt",
|
||||
@@ -305,7 +306,7 @@ DEF_TUNE (X86_TUNE_USE_BT, "use_bt",
|
||||
/* X86_TUNE_AVOID_FALSE_DEP_FOR_BMI: Avoid false dependency
|
||||
for bit-manipulation instructions. */
|
||||
DEF_TUNE (X86_TUNE_AVOID_FALSE_DEP_FOR_BMI, "avoid_false_dep_for_bmi",
|
||||
- m_SANDYBRIDGE | m_CORE_AVX2 | m_GENERIC)
|
||||
+ m_SANDYBRIDGE | m_CORE_AVX2 | m_TREMONT | m_GENERIC)
|
||||
|
||||
/* X86_TUNE_ADJUST_UNROLL: This enables adjusting the unroll factor based
|
||||
on hardware capabilities. Bdver3 hardware has a loop buffer which makes
|
||||
@@ -321,14 +322,14 @@ DEF_TUNE (X86_TUNE_ONE_IF_CONV_INSN, "one_if_conv_insn",
|
||||
|
||||
/* X86_TUNE_AVOID_MFENCE: Use lock prefixed instructions instead of mfence. */
|
||||
DEF_TUNE (X86_TUNE_AVOID_MFENCE, "avoid_mfence",
|
||||
- m_CORE_ALL | m_BDVER | m_ZNVER | m_GENERIC)
|
||||
+ m_CORE_ALL | m_BDVER | m_ZNVER | m_TREMONT | m_GENERIC)
|
||||
|
||||
/* X86_TUNE_EXPAND_ABS: This enables a new abs pattern by
|
||||
generating instructions for abs (x) = (((signed) x >> (W-1) ^ x) -
|
||||
(signed) x >> (W-1)) instead of cmove or SSE max/abs instructions. */
|
||||
DEF_TUNE (X86_TUNE_EXPAND_ABS, "expand_abs",
|
||||
m_CORE_ALL | m_SILVERMONT | m_KNL | m_KNM | m_GOLDMONT
|
||||
- | m_GOLDMONT_PLUS | m_TREMONT )
|
||||
+ | m_GOLDMONT_PLUS)
|
||||
|
||||
/*****************************************************************************/
|
||||
/* 387 instruction selection tuning */
|
||||
@@ -386,13 +387,13 @@ DEF_TUNE (X86_TUNE_SSE_PACKED_SINGLE_INSN_OPTIMAL, "sse_packed_single_insn_optim
|
||||
|
||||
/* X86_TUNE_SSE_TYPELESS_STORES: Always movaps/movups for 128bit stores. */
|
||||
DEF_TUNE (X86_TUNE_SSE_TYPELESS_STORES, "sse_typeless_stores",
|
||||
- m_AMD_MULTIPLE | m_CORE_ALL | m_GENERIC)
|
||||
+ m_AMD_MULTIPLE | m_CORE_ALL | m_TREMONT | m_GENERIC)
|
||||
|
||||
/* X86_TUNE_SSE_LOAD0_BY_PXOR: Always use pxor to load0 as opposed to
|
||||
xorps/xorpd and other variants. */
|
||||
DEF_TUNE (X86_TUNE_SSE_LOAD0_BY_PXOR, "sse_load0_by_pxor",
|
||||
m_PPRO | m_P4_NOCONA | m_CORE_ALL | m_BDVER | m_BTVER | m_ZNVER
|
||||
- | m_GENERIC)
|
||||
+ | m_TREMONT | m_GENERIC)
|
||||
|
||||
/* X86_TUNE_INTER_UNIT_MOVES_TO_VEC: Enable moves in from integer
|
||||
to SSE registers. If disabled, the moves will be done by storing
|
||||
@@ -419,7 +420,7 @@ DEF_TUNE (X86_TUNE_INTER_UNIT_CONVERSIONS, "inter_unit_conversions",
|
||||
fp converts to destination register. */
|
||||
DEF_TUNE (X86_TUNE_SPLIT_MEM_OPND_FOR_FP_CONVERTS, "split_mem_opnd_for_fp_converts",
|
||||
m_SILVERMONT | m_KNL | m_KNM | m_GOLDMONT | m_GOLDMONT_PLUS
|
||||
- | m_TREMONT | m_INTEL)
|
||||
+ | m_INTEL)
|
||||
|
||||
/* X86_TUNE_USE_VECTOR_FP_CONVERTS: Prefer vector packed SSE conversion
|
||||
from FP to FP. This form of instructions avoids partial write to the
|
||||
@@ -434,7 +435,7 @@ DEF_TUNE (X86_TUNE_USE_VECTOR_CONVERTS, "use_vector_converts", m_AMDFAM10)
|
||||
/* X86_TUNE_SLOW_SHUFB: Indicates tunings with slow pshufb instruction. */
|
||||
DEF_TUNE (X86_TUNE_SLOW_PSHUFB, "slow_pshufb",
|
||||
m_BONNELL | m_SILVERMONT | m_KNL | m_KNM | m_GOLDMONT
|
||||
- | m_GOLDMONT_PLUS | m_TREMONT | m_INTEL)
|
||||
+ | m_GOLDMONT_PLUS | m_INTEL)
|
||||
|
||||
/* X86_TUNE_AVOID_4BYTE_PREFIXES: Avoid instructions requiring 4+ bytes of prefixes. */
|
||||
DEF_TUNE (X86_TUNE_AVOID_4BYTE_PREFIXES, "avoid_4byte_prefixes",
|
||||
--
|
||||
2.18.2
|
||||
|
@ -0,0 +1,196 @@
|
||||
From 80c2ed8228817fb6438120997227811a746272ba Mon Sep 17 00:00:00 2001
|
||||
From: "H.J. Lu" <hjl.tools@gmail.com>
|
||||
Date: Wed, 15 Sep 2021 14:17:08 +0800
|
||||
Subject: [PATCH 2/3] x86: Update memcpy/memset inline strategies for
|
||||
-mtune=tremont
|
||||
|
||||
Simply memcpy and memset inline strategies to avoid branches for
|
||||
-mtune=tremont:
|
||||
|
||||
1. Create Tremont cost model from generic cost model.
|
||||
2. With MOVE_RATIO and CLEAR_RATIO == 17, GCC will use integer/vector
|
||||
load and store for up to 16 * 16 (256) bytes when the data size is
|
||||
fixed and known.
|
||||
3. Inline only if data size is known to be <= 256.
|
||||
a. Use "rep movsb/stosb" with simple code sequence if the data size
|
||||
is a constant.
|
||||
b. Use loop if data size is not a constant.
|
||||
4. Use memcpy/memset libray function if data size is unknown or > 256.
|
||||
|
||||
* config/i386/i386-options.c (processor_cost_table): Use
|
||||
tremont_cost for Tremont.
|
||||
* config/i386/x86-tune-costs.h (tremont_memcpy): New.
|
||||
(tremont_memset): Likewise.
|
||||
(tremont_cost): Likewise.
|
||||
* config/i386/x86-tune.def (X86_TUNE_PREFER_KNOWN_REP_MOVSB_STOSB):
|
||||
Enable for Tremont.
|
||||
---
|
||||
gcc/config/i386/i386-options.c | 2 +-
|
||||
gcc/config/i386/x86-tune-costs.h | 124 +++++++++++++++++++++++++++++++
|
||||
gcc/config/i386/x86-tune.def | 2 +-
|
||||
3 files changed, 126 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/gcc/config/i386/i386-options.c b/gcc/config/i386/i386-options.c
|
||||
index 19632b5fd6b..4b77d62926f 100644
|
||||
--- a/gcc/config/i386/i386-options.c
|
||||
+++ b/gcc/config/i386/i386-options.c
|
||||
@@ -719,7 +719,7 @@ static const struct processor_costs *processor_cost_table[] =
|
||||
&slm_cost,
|
||||
&slm_cost,
|
||||
&slm_cost,
|
||||
- &slm_cost,
|
||||
+ &tremont_cost,
|
||||
&slm_cost,
|
||||
&slm_cost,
|
||||
&skylake_cost,
|
||||
diff --git a/gcc/config/i386/x86-tune-costs.h b/gcc/config/i386/x86-tune-costs.h
|
||||
index ffe810f2bcb..93644be9cb3 100644
|
||||
--- a/gcc/config/i386/x86-tune-costs.h
|
||||
+++ b/gcc/config/i386/x86-tune-costs.h
|
||||
@@ -2734,6 +2734,130 @@ struct processor_costs slm_cost = {
|
||||
"16", /* Func alignment. */
|
||||
};
|
||||
|
||||
+static stringop_algs tremont_memcpy[2] = {
|
||||
+ {libcall,
|
||||
+ {{256, rep_prefix_1_byte, true},
|
||||
+ {256, loop, false},
|
||||
+ {-1, libcall, false}}},
|
||||
+ {libcall,
|
||||
+ {{256, rep_prefix_1_byte, true},
|
||||
+ {256, loop, false},
|
||||
+ {-1, libcall, false}}}};
|
||||
+static stringop_algs tremont_memset[2] = {
|
||||
+ {libcall,
|
||||
+ {{256, rep_prefix_1_byte, true},
|
||||
+ {256, loop, false},
|
||||
+ {-1, libcall, false}}},
|
||||
+ {libcall,
|
||||
+ {{256, rep_prefix_1_byte, true},
|
||||
+ {256, loop, false},
|
||||
+ {-1, libcall, false}}}};
|
||||
+static const
|
||||
+struct processor_costs tremont_cost = {
|
||||
+ {
|
||||
+ /* Start of register allocator costs. integer->integer move cost is 2. */
|
||||
+ 6, /* cost for loading QImode using movzbl */
|
||||
+ {6, 6, 6}, /* cost of loading integer registers
|
||||
+ in QImode, HImode and SImode.
|
||||
+ Relative to reg-reg move (2). */
|
||||
+ {6, 6, 6}, /* cost of storing integer registers */
|
||||
+ 4, /* cost of reg,reg fld/fst */
|
||||
+ {6, 6, 12}, /* cost of loading fp registers
|
||||
+ in SFmode, DFmode and XFmode */
|
||||
+ {6, 6, 12}, /* cost of storing fp registers
|
||||
+ in SFmode, DFmode and XFmode */
|
||||
+ 2, /* cost of moving MMX register */
|
||||
+ {6, 6}, /* cost of loading MMX registers
|
||||
+ in SImode and DImode */
|
||||
+ {6, 6}, /* cost of storing MMX registers
|
||||
+ in SImode and DImode */
|
||||
+ 2, 3, 4, /* cost of moving XMM,YMM,ZMM register */
|
||||
+ {6, 6, 6, 10, 15}, /* cost of loading SSE registers
|
||||
+ in 32,64,128,256 and 512-bit */
|
||||
+ {6, 6, 6, 10, 15}, /* cost of storing SSE registers
|
||||
+ in 32,64,128,256 and 512-bit */
|
||||
+ 6, 6, /* SSE->integer and integer->SSE moves */
|
||||
+ 6, 6, /* mask->integer and integer->mask moves */
|
||||
+ {6, 6, 6}, /* cost of loading mask register
|
||||
+ in QImode, HImode, SImode. */
|
||||
+ {6, 6, 6}, /* cost if storing mask register
|
||||
+ in QImode, HImode, SImode. */
|
||||
+ 2, /* cost of moving mask register. */
|
||||
+ /* End of register allocator costs. */
|
||||
+ },
|
||||
+
|
||||
+ COSTS_N_INSNS (1), /* cost of an add instruction */
|
||||
+ /* Setting cost to 2 makes our current implementation of synth_mult result in
|
||||
+ use of unnecessary temporary registers causing regression on several
|
||||
+ SPECfp benchmarks. */
|
||||
+ COSTS_N_INSNS (1) + 1, /* cost of a lea instruction */
|
||||
+ COSTS_N_INSNS (1), /* variable shift costs */
|
||||
+ COSTS_N_INSNS (1), /* constant shift costs */
|
||||
+ {COSTS_N_INSNS (3), /* cost of starting multiply for QI */
|
||||
+ COSTS_N_INSNS (4), /* HI */
|
||||
+ COSTS_N_INSNS (3), /* SI */
|
||||
+ COSTS_N_INSNS (4), /* DI */
|
||||
+ COSTS_N_INSNS (4)}, /* other */
|
||||
+ 0, /* cost of multiply per each bit set */
|
||||
+ {COSTS_N_INSNS (16), /* cost of a divide/mod for QI */
|
||||
+ COSTS_N_INSNS (22), /* HI */
|
||||
+ COSTS_N_INSNS (30), /* SI */
|
||||
+ COSTS_N_INSNS (74), /* DI */
|
||||
+ COSTS_N_INSNS (74)}, /* other */
|
||||
+ COSTS_N_INSNS (1), /* cost of movsx */
|
||||
+ COSTS_N_INSNS (1), /* cost of movzx */
|
||||
+ 8, /* "large" insn */
|
||||
+ 17, /* MOVE_RATIO */
|
||||
+ 17, /* CLEAR_RATIO */
|
||||
+ {6, 6, 6}, /* cost of loading integer registers
|
||||
+ in QImode, HImode and SImode.
|
||||
+ Relative to reg-reg move (2). */
|
||||
+ {6, 6, 6}, /* cost of storing integer registers */
|
||||
+ {6, 6, 6, 10, 15}, /* cost of loading SSE register
|
||||
+ in 32bit, 64bit, 128bit, 256bit and 512bit */
|
||||
+ {6, 6, 6, 10, 15}, /* cost of storing SSE register
|
||||
+ in 32bit, 64bit, 128bit, 256bit and 512bit */
|
||||
+ {6, 6, 6, 10, 15}, /* cost of unaligned loads. */
|
||||
+ {6, 6, 6, 10, 15}, /* cost of unaligned storess. */
|
||||
+ 2, 3, 4, /* cost of moving XMM,YMM,ZMM register */
|
||||
+ 6, /* cost of moving SSE register to integer. */
|
||||
+ 18, 6, /* Gather load static, per_elt. */
|
||||
+ 18, 6, /* Gather store static, per_elt. */
|
||||
+ 32, /* size of l1 cache. */
|
||||
+ 512, /* size of l2 cache. */
|
||||
+ 64, /* size of prefetch block */
|
||||
+ 6, /* number of parallel prefetches */
|
||||
+ /* Benchmarks shows large regressions on K8 sixtrack benchmark when this
|
||||
+ value is increased to perhaps more appropriate value of 5. */
|
||||
+ 3, /* Branch cost */
|
||||
+ COSTS_N_INSNS (3), /* cost of FADD and FSUB insns. */
|
||||
+ COSTS_N_INSNS (5), /* cost of FMUL instruction. */
|
||||
+ COSTS_N_INSNS (17), /* cost of FDIV instruction. */
|
||||
+ COSTS_N_INSNS (1), /* cost of FABS instruction. */
|
||||
+ COSTS_N_INSNS (1), /* cost of FCHS instruction. */
|
||||
+ COSTS_N_INSNS (14), /* cost of FSQRT instruction. */
|
||||
+
|
||||
+ COSTS_N_INSNS (1), /* cost of cheap SSE instruction. */
|
||||
+ COSTS_N_INSNS (3), /* cost of ADDSS/SD SUBSS/SD insns. */
|
||||
+ COSTS_N_INSNS (4), /* cost of MULSS instruction. */
|
||||
+ COSTS_N_INSNS (5), /* cost of MULSD instruction. */
|
||||
+ COSTS_N_INSNS (5), /* cost of FMA SS instruction. */
|
||||
+ COSTS_N_INSNS (5), /* cost of FMA SD instruction. */
|
||||
+ COSTS_N_INSNS (13), /* cost of DIVSS instruction. */
|
||||
+ COSTS_N_INSNS (17), /* cost of DIVSD instruction. */
|
||||
+ COSTS_N_INSNS (14), /* cost of SQRTSS instruction. */
|
||||
+ COSTS_N_INSNS (18), /* cost of SQRTSD instruction. */
|
||||
+ 1, 4, 3, 3, /* reassoc int, fp, vec_int, vec_fp. */
|
||||
+ tremont_memcpy,
|
||||
+ tremont_memset,
|
||||
+ COSTS_N_INSNS (4), /* cond_taken_branch_cost. */
|
||||
+ COSTS_N_INSNS (2), /* cond_not_taken_branch_cost. */
|
||||
+ "16:11:8", /* Loop alignment. */
|
||||
+ "16:11:8", /* Jump alignment. */
|
||||
+ "0:0:8", /* Label alignment. */
|
||||
+ "16", /* Func alignment. */
|
||||
+};
|
||||
+
|
||||
static stringop_algs intel_memcpy[2] = {
|
||||
{libcall, {{11, loop, false}, {-1, rep_prefix_4_byte, false}}},
|
||||
{libcall, {{32, loop, false}, {64, rep_prefix_4_byte, false},
|
||||
diff --git a/gcc/config/i386/x86-tune.def b/gcc/config/i386/x86-tune.def
|
||||
index 6bd7087a03f..636e0c788bf 100644
|
||||
--- a/gcc/config/i386/x86-tune.def
|
||||
+++ b/gcc/config/i386/x86-tune.def
|
||||
@@ -273,7 +273,7 @@ DEF_TUNE (X86_TUNE_SINGLE_STRINGOP, "single_stringop", m_386 | m_P4_NOCONA)
|
||||
move/set sequences of bytes with known size. */
|
||||
DEF_TUNE (X86_TUNE_PREFER_KNOWN_REP_MOVSB_STOSB,
|
||||
"prefer_known_rep_movsb_stosb",
|
||||
- m_SKYLAKE | m_ALDERLAKE | m_CORE_AVX512)
|
||||
+ m_SKYLAKE | m_ALDERLAKE | m_TREMONT | m_CORE_AVX512)
|
||||
|
||||
/* X86_TUNE_MISALIGNED_MOVE_STRING_PRO_EPILOGUES: Enable generation of
|
||||
compact prologues and epilogues by issuing a misaligned moves. This
|
||||
--
|
||||
2.18.2
|
||||
|
@ -0,0 +1,185 @@
|
||||
From c4c7244349999f91ef2a7cd2108eee0372490be9 Mon Sep 17 00:00:00 2001
|
||||
From: "H.J. Lu" <hjl.tools@gmail.com>
|
||||
Date: Wed, 15 Sep 2021 14:18:21 +0800
|
||||
Subject: [PATCH 3/3] x86: Add TARGET_SSE_PARTIAL_REG_[FP_]CONVERTS_DEPENDENCY
|
||||
|
||||
1. Replace TARGET_SSE_PARTIAL_REG_DEPENDENCY with
|
||||
TARGET_SSE_PARTIAL_REG_FP_CONVERTS_DEPENDENCY in SSE FP to FP splitters.
|
||||
2. Replace TARGET_SSE_PARTIAL_REG_DEPENDENCY with
|
||||
TARGET_SSE_PARTIAL_REG_CONVERTS_DEPENDENCY in SSE INT to FP splitters.
|
||||
|
||||
gcc/
|
||||
|
||||
* config/i386/i386.h (TARGET_SSE_PARTIAL_REG_FP_CONVERTS_DEPENDENCY):
|
||||
New.
|
||||
(TARGET_SSE_PARTIAL_REG_CONVERTS_DEPENDENCY): Likewise.
|
||||
* config/i386/i386.md (SSE FP to FP splitters): Replace
|
||||
TARGET_SSE_PARTIAL_REG_DEPENDENCY with
|
||||
TARGET_SSE_PARTIAL_REG_FP_CONVERTS_DEPENDENCY.
|
||||
(SSE INT to FP splitter): Replace TARGET_SSE_PARTIAL_REG_DEPENDENCY
|
||||
with TARGET_SSE_PARTIAL_REG_CONVERTS_DEPENDENCY.
|
||||
* config/i386/x86-tune.def
|
||||
(X86_TUNE_SSE_PARTIAL_REG_FP_CONVERTS_DEPENDENCY): New.
|
||||
(X86_TUNE_SSE_PARTIAL_REG_CONVERTS_DEPENDENCY): Likewise.
|
||||
|
||||
gcc/testsuite/
|
||||
|
||||
* gcc.target/i386/sse-covert-1.c: Likewise.
|
||||
* gcc.target/i386/sse-fp-covert-1.c: Likewise.
|
||||
* gcc.target/i386/sse-int-covert-1.c: Likewise.
|
||||
---
|
||||
gcc/config/i386/i386.h | 4 ++++
|
||||
gcc/config/i386/i386.md | 9 ++++++---
|
||||
gcc/config/i386/x86-tune.def | 15 +++++++++++++++
|
||||
gcc/testsuite/gcc.target/i386/sse-covert-1.c | 19 +++++++++++++++++++
|
||||
.../gcc.target/i386/sse-fp-covert-1.c | 15 +++++++++++++++
|
||||
.../gcc.target/i386/sse-int-covert-1.c | 14 ++++++++++++++
|
||||
6 files changed, 73 insertions(+), 3 deletions(-)
|
||||
create mode 100644 gcc/testsuite/gcc.target/i386/sse-covert-1.c
|
||||
create mode 100644 gcc/testsuite/gcc.target/i386/sse-fp-covert-1.c
|
||||
create mode 100644 gcc/testsuite/gcc.target/i386/sse-int-covert-1.c
|
||||
|
||||
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
|
||||
index 73e118900f7..5b992195df7 100644
|
||||
--- a/gcc/config/i386/i386.h
|
||||
+++ b/gcc/config/i386/i386.h
|
||||
@@ -553,6 +553,10 @@ extern unsigned char ix86_tune_features[X86_TUNE_LAST];
|
||||
ix86_tune_features[X86_TUNE_PARTIAL_REG_DEPENDENCY]
|
||||
#define TARGET_SSE_PARTIAL_REG_DEPENDENCY \
|
||||
ix86_tune_features[X86_TUNE_SSE_PARTIAL_REG_DEPENDENCY]
|
||||
+#define TARGET_SSE_PARTIAL_REG_FP_CONVERTS_DEPENDENCY \
|
||||
+ ix86_tune_features[X86_TUNE_SSE_PARTIAL_REG_FP_CONVERTS_DEPENDENCY]
|
||||
+#define TARGET_SSE_PARTIAL_REG_CONVERTS_DEPENDENCY \
|
||||
+ ix86_tune_features[X86_TUNE_SSE_PARTIAL_REG_CONVERTS_DEPENDENCY]
|
||||
#define TARGET_SSE_UNALIGNED_LOAD_OPTIMAL \
|
||||
ix86_tune_features[X86_TUNE_SSE_UNALIGNED_LOAD_OPTIMAL]
|
||||
#define TARGET_SSE_UNALIGNED_STORE_OPTIMAL \
|
||||
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
|
||||
index 97325e38676..053bec1c1e1 100644
|
||||
--- a/gcc/config/i386/i386.md
|
||||
+++ b/gcc/config/i386/i386.md
|
||||
@@ -4378,7 +4378,8 @@
|
||||
(float_extend:DF
|
||||
(match_operand:SF 1 "nonimmediate_operand")))]
|
||||
"!TARGET_AVX
|
||||
- && TARGET_SSE_PARTIAL_REG_DEPENDENCY && epilogue_completed
|
||||
+ && TARGET_SSE_PARTIAL_REG_FP_CONVERTS_DEPENDENCY
|
||||
+ && epilogue_completed
|
||||
&& optimize_function_for_speed_p (cfun)
|
||||
&& (!REG_P (operands[1])
|
||||
|| (!TARGET_AVX && REGNO (operands[0]) != REGNO (operands[1])))
|
||||
@@ -4540,7 +4541,8 @@
|
||||
(float_truncate:SF
|
||||
(match_operand:DF 1 "nonimmediate_operand")))]
|
||||
"!TARGET_AVX
|
||||
- && TARGET_SSE_PARTIAL_REG_DEPENDENCY && epilogue_completed
|
||||
+ && TARGET_SSE_PARTIAL_REG_FP_CONVERTS_DEPENDENCY
|
||||
+ && epilogue_completed
|
||||
&& optimize_function_for_speed_p (cfun)
|
||||
&& (!REG_P (operands[1])
|
||||
|| (!TARGET_AVX && REGNO (operands[0]) != REGNO (operands[1])))
|
||||
@@ -5053,7 +5055,8 @@
|
||||
[(set (match_operand:MODEF 0 "sse_reg_operand")
|
||||
(float:MODEF (match_operand:SWI48 1 "nonimmediate_operand")))]
|
||||
"!TARGET_AVX
|
||||
- && TARGET_SSE_PARTIAL_REG_DEPENDENCY && epilogue_completed
|
||||
+ && TARGET_SSE_PARTIAL_REG_CONVERTS_DEPENDENCY
|
||||
+ && epilogue_completed
|
||||
&& optimize_function_for_speed_p (cfun)
|
||||
&& (!EXT_REX_SSE_REG_P (operands[0])
|
||||
|| TARGET_AVX512VL)"
|
||||
diff --git a/gcc/config/i386/x86-tune.def b/gcc/config/i386/x86-tune.def
|
||||
index 636e0c788bf..b5166fb1316 100644
|
||||
--- a/gcc/config/i386/x86-tune.def
|
||||
+++ b/gcc/config/i386/x86-tune.def
|
||||
@@ -64,6 +64,21 @@ DEF_TUNE (X86_TUNE_SSE_PARTIAL_REG_DEPENDENCY, "sse_partial_reg_dependency",
|
||||
m_PPRO | m_P4_NOCONA | m_CORE_ALL | m_BONNELL | m_AMDFAM10
|
||||
| m_BDVER | m_ZNVER | m_TREMONT | m_GENERIC)
|
||||
|
||||
+/* X86_TUNE_SSE_PARTIAL_REG_FP_CONVERTS_DEPENDENCY: This knob avoids
|
||||
+ partial write to the destination in scalar SSE conversion from FP
|
||||
+ to FP. */
|
||||
+DEF_TUNE (X86_TUNE_SSE_PARTIAL_REG_FP_CONVERTS_DEPENDENCY,
|
||||
+ "sse_partial_reg_fp_converts_dependency",
|
||||
+ m_PPRO | m_P4_NOCONA | m_CORE_ALL | m_BONNELL | m_AMDFAM10
|
||||
+ | m_BDVER | m_ZNVER | m_GENERIC)
|
||||
+
|
||||
+/* X86_TUNE_SSE_PARTIAL_REG_CONVERTS_DEPENDENCY: This knob avoids partial
|
||||
+ write to the destination in scalar SSE conversion from integer to FP. */
|
||||
+DEF_TUNE (X86_TUNE_SSE_PARTIAL_REG_CONVERTS_DEPENDENCY,
|
||||
+ "sse_partial_reg_converts_dependency",
|
||||
+ m_PPRO | m_P4_NOCONA | m_CORE_ALL | m_BONNELL | m_AMDFAM10
|
||||
+ | m_BDVER | m_ZNVER | m_GENERIC)
|
||||
+
|
||||
/* X86_TUNE_SSE_SPLIT_REGS: Set for machines where the type and dependencies
|
||||
are resolved on SSE register parts instead of whole registers, so we may
|
||||
maintain just lower part of scalar values in proper format leaving the
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/sse-covert-1.c b/gcc/testsuite/gcc.target/i386/sse-covert-1.c
|
||||
new file mode 100644
|
||||
index 00000000000..c30af694505
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gcc.target/i386/sse-covert-1.c
|
||||
@@ -0,0 +1,19 @@
|
||||
+/* { dg-do compile } */
|
||||
+/* { dg-options "-O2 -march=x86-64 -mfpmath=sse -mtune-ctrl=^sse_partial_reg_fp_converts_dependency,^sse_partial_reg_converts_dependency" } */
|
||||
+
|
||||
+extern float f;
|
||||
+extern double d;
|
||||
+extern int i;
|
||||
+
|
||||
+void
|
||||
+foo (void)
|
||||
+{
|
||||
+ d = f;
|
||||
+ f = i;
|
||||
+}
|
||||
+
|
||||
+/* { dg-final { scan-assembler "cvtss2sd" } } */
|
||||
+/* { dg-final { scan-assembler "cvtsi2ssl" } } */
|
||||
+/* { dg-final { scan-assembler-not "cvtps2pd" } } */
|
||||
+/* { dg-final { scan-assembler-not "cvtdq2ps" } } */
|
||||
+/* { dg-final { scan-assembler-not "pxor" } } */
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/sse-fp-covert-1.c b/gcc/testsuite/gcc.target/i386/sse-fp-covert-1.c
|
||||
new file mode 100644
|
||||
index 00000000000..b6567e60e3e
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gcc.target/i386/sse-fp-covert-1.c
|
||||
@@ -0,0 +1,15 @@
|
||||
+/* { dg-do compile } */
|
||||
+/* { dg-options "-O2 -march=x86-64 -mfpmath=sse -mtune-ctrl=^sse_partial_reg_fp_converts_dependency" } */
|
||||
+
|
||||
+extern float f;
|
||||
+extern double d;
|
||||
+
|
||||
+void
|
||||
+foo (void)
|
||||
+{
|
||||
+ d = f;
|
||||
+}
|
||||
+
|
||||
+/* { dg-final { scan-assembler "cvtss2sd" } } */
|
||||
+/* { dg-final { scan-assembler-not "cvtps2pd" } } */
|
||||
+/* { dg-final { scan-assembler-not "pxor" } } */
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/sse-int-covert-1.c b/gcc/testsuite/gcc.target/i386/sse-int-covert-1.c
|
||||
new file mode 100644
|
||||
index 00000000000..107f7241def
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gcc.target/i386/sse-int-covert-1.c
|
||||
@@ -0,0 +1,14 @@
|
||||
+/* { dg-do compile } */
|
||||
+/* { dg-options "-O2 -march=x86-64 -mfpmath=sse -mtune-ctrl=^sse_partial_reg_converts_dependency" } */
|
||||
+
|
||||
+extern float f;
|
||||
+extern int i;
|
||||
+
|
||||
+void
|
||||
+foo (void)
|
||||
+{
|
||||
+ f = i;
|
||||
+}
|
||||
+
|
||||
+/* { dg-final { scan-assembler "cvtsi2ssl" } } */
|
||||
+/* { dg-final { scan-assembler-not "pxor" } } */
|
||||
--
|
||||
2.18.2
|
||||
|
@ -0,0 +1,188 @@
|
||||
/* Copyright (C) 2019 Free Software Foundation, Inc.
|
||||
Contributed by Jakub Jelinek <jakub@redhat.com>.
|
||||
|
||||
This file is part of the GNU Offloading and Multi Processing Library
|
||||
(libgomp).
|
||||
|
||||
Libgomp is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3, or (at your option)
|
||||
any later version.
|
||||
|
||||
Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
more details.
|
||||
|
||||
Under Section 7 of GPL version 3, you are granted additional
|
||||
permissions described in the GCC Runtime Library Exception, version
|
||||
3.1, as published by the Free Software Foundation.
|
||||
|
||||
You should have received a copy of the GNU General Public License and
|
||||
a copy of the GCC Runtime Library Exception along with this program;
|
||||
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Remapping of nonmonotonic runtime schedule and maybe nonmonotonic runtime
|
||||
schedule loop entrypoints (the used by GCC 9 and later for runtime
|
||||
schedule without monotonic or nonmonotonic modifiers).
|
||||
RHEL 7 libgomp only implements the GOMP*loop*runtime* entrypoints without
|
||||
nonmonotonic in the names, which always implement monotonic scheduling,
|
||||
but the library doesn't implement any other scheduling, even in GCC 9
|
||||
and monotonic scheduling is a valid implementation of non-monotonic
|
||||
scheduling. */
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
typedef unsigned long long ull;
|
||||
extern bool GOMP_loop_runtime_start (long, long, long, long *, long *);
|
||||
extern bool GOMP_loop_runtime_next (long *, long *);
|
||||
extern void GOMP_parallel_loop_runtime (void (*)(void *), void *,
|
||||
unsigned, long, long, long,
|
||||
unsigned);
|
||||
extern bool GOMP_loop_ull_runtime_start (bool, ull, ull, ull, ull *, ull *);
|
||||
extern bool GOMP_loop_ull_runtime_next (ull *, ull *);
|
||||
extern bool GOMP_loop_dynamic_next (long *, long *);
|
||||
extern bool GOMP_loop_dynamic_start (long, long, long, long, long *, long *);
|
||||
extern bool GOMP_loop_guided_next (long *, long *);
|
||||
extern bool GOMP_loop_guided_start (long, long, long, long, long *, long *);
|
||||
extern bool GOMP_loop_ull_dynamic_next (ull *, ull *);
|
||||
extern bool GOMP_loop_ull_dynamic_start (bool, ull, ull, ull, ull, ull *,
|
||||
ull *);
|
||||
extern bool GOMP_loop_ull_guided_next (ull *, ull *);
|
||||
extern bool GOMP_loop_ull_guided_start (bool, ull, ull, ull, ull, ull *,
|
||||
ull *);
|
||||
extern void GOMP_parallel_loop_dynamic (void (*)(void *), void *,
|
||||
unsigned, long, long, long, long,
|
||||
unsigned);
|
||||
extern void GOMP_parallel_loop_guided (void (*)(void *), void *,
|
||||
unsigned, long, long, long, long,
|
||||
unsigned);
|
||||
#define alias(x, y) __typeof (x) y __attribute__((alias (#x)))
|
||||
|
||||
#pragma GCC visibility push(hidden)
|
||||
|
||||
bool
|
||||
GOMP_loop_nonmonotonic_runtime_start (long start, long end, long incr,
|
||||
long *istart, long *iend)
|
||||
{
|
||||
return GOMP_loop_runtime_start (start, end, incr, istart, iend);
|
||||
}
|
||||
alias (GOMP_loop_nonmonotonic_runtime_start,
|
||||
GOMP_loop_maybe_nonmonotonic_runtime_start);
|
||||
|
||||
bool
|
||||
GOMP_loop_nonmonotonic_runtime_next (long *istart, long *iend)
|
||||
{
|
||||
return GOMP_loop_runtime_next (istart, iend);
|
||||
}
|
||||
alias (GOMP_loop_nonmonotonic_runtime_next,
|
||||
GOMP_loop_maybe_nonmonotonic_runtime_next);
|
||||
|
||||
void
|
||||
GOMP_parallel_loop_nonmonotonic_runtime (void (*fn)(void *), void *data,
|
||||
unsigned num_threads, long start,
|
||||
long end, long incr, unsigned flags)
|
||||
{
|
||||
return GOMP_parallel_loop_runtime (fn, data, num_threads, start,
|
||||
end, incr, flags);
|
||||
}
|
||||
alias (GOMP_parallel_loop_nonmonotonic_runtime,
|
||||
GOMP_parallel_loop_maybe_nonmonotonic_runtime);
|
||||
|
||||
bool
|
||||
GOMP_loop_ull_nonmonotonic_runtime_start (bool up, ull start, ull end,
|
||||
ull incr, ull *istart, ull *iend)
|
||||
{
|
||||
return GOMP_loop_ull_runtime_start (up, start, end, incr, istart, iend);
|
||||
}
|
||||
alias (GOMP_loop_ull_nonmonotonic_runtime_start,
|
||||
GOMP_loop_ull_maybe_nonmonotonic_runtime_start);
|
||||
|
||||
bool
|
||||
GOMP_loop_ull_nonmonotonic_runtime_next (ull *istart, ull *iend)
|
||||
{
|
||||
return GOMP_loop_ull_runtime_next (istart, iend);
|
||||
}
|
||||
alias (GOMP_loop_ull_nonmonotonic_runtime_next,
|
||||
GOMP_loop_ull_maybe_nonmonotonic_runtime_next);
|
||||
|
||||
bool
|
||||
GOMP_loop_nonmonotonic_dynamic_next (long *istart, long *iend)
|
||||
{
|
||||
return GOMP_loop_dynamic_next (istart, iend);
|
||||
}
|
||||
|
||||
bool
|
||||
GOMP_loop_nonmonotonic_dynamic_start (long start, long end, long incr,
|
||||
long chunk_size, long *istart,
|
||||
long *iend)
|
||||
{
|
||||
return GOMP_loop_dynamic_start (start, end, incr, chunk_size, istart, iend);
|
||||
}
|
||||
|
||||
bool
|
||||
GOMP_loop_nonmonotonic_guided_next (long *istart, long *iend)
|
||||
{
|
||||
return GOMP_loop_guided_next (istart, iend);
|
||||
}
|
||||
|
||||
bool
|
||||
GOMP_loop_nonmonotonic_guided_start (long start, long end, long incr,
|
||||
long chunk_size, long *istart, long *iend)
|
||||
{
|
||||
return GOMP_loop_guided_start (start, end, incr, chunk_size, istart, iend);
|
||||
}
|
||||
|
||||
bool
|
||||
GOMP_loop_ull_nonmonotonic_dynamic_next (ull *istart, ull *iend)
|
||||
{
|
||||
return GOMP_loop_ull_dynamic_next (istart, iend);
|
||||
}
|
||||
|
||||
bool
|
||||
GOMP_loop_ull_nonmonotonic_dynamic_start (bool up, ull start,
|
||||
ull end, ull incr,
|
||||
ull chunk_size,
|
||||
ull *istart, ull *iend)
|
||||
{
|
||||
return GOMP_loop_ull_dynamic_start (up, start, end, incr, chunk_size, istart,
|
||||
iend);
|
||||
}
|
||||
|
||||
bool
|
||||
GOMP_loop_ull_nonmonotonic_guided_next (ull *istart, ull *iend)
|
||||
{
|
||||
return GOMP_loop_ull_guided_next (istart, iend);
|
||||
}
|
||||
|
||||
bool
|
||||
GOMP_loop_ull_nonmonotonic_guided_start (bool up, ull start, ull end,
|
||||
ull incr, ull chunk_size,
|
||||
ull *istart, ull *iend)
|
||||
{
|
||||
return GOMP_loop_ull_guided_start (up, start, end, incr, chunk_size, istart,
|
||||
iend);
|
||||
}
|
||||
|
||||
void
|
||||
GOMP_parallel_loop_nonmonotonic_dynamic (void (*fn) (void *), void *data,
|
||||
unsigned num_threads, long start,
|
||||
long end, long incr, long chunk_size,
|
||||
unsigned flags)
|
||||
{
|
||||
GOMP_parallel_loop_dynamic (fn, data, num_threads, start, end, incr,
|
||||
chunk_size, flags);
|
||||
}
|
||||
|
||||
void
|
||||
GOMP_parallel_loop_nonmonotonic_guided (void (*fn) (void *), void *data,
|
||||
unsigned num_threads, long start,
|
||||
long end, long incr, long chunk_size,
|
||||
unsigned flags)
|
||||
{
|
||||
GOMP_parallel_loop_guided (fn, data, num_threads, start, end, incr,
|
||||
chunk_size, flags);
|
||||
}
|
||||
|
||||
#pragma GCC visibility pop
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue