Toshaan Bharvani
3 years ago
commit
e22974986f
40 changed files with 14263 additions and 0 deletions
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,27 @@
@@ -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,333 @@
@@ -0,0 +1,333 @@
|
||||
From 36362544fb039599c0eb58d839e90ffb5410ad27 Mon Sep 17 00:00:00 2001 |
||||
From: Marek Polacek <polacek@redhat.com> |
||||
Date: Wed, 9 Feb 2022 15:18:43 -0500 |
||||
Subject: [PATCH] configure: Implement --enable-host-bind-now |
||||
|
||||
As promised in the --enable-host-pie patch, this patch adds another |
||||
configure option, --enable-host-bind-now, which adds -z now when linking |
||||
the compiler executables in order to extend hardening. BIND_NOW with RELRO |
||||
allows the GOT to be marked RO; this prevents GOT modification attacks. |
||||
|
||||
This option does not affect linking of target libraries; you can use |
||||
LDFLAGS_FOR_TARGET=-Wl,-z,relro,-z,now to enable RELRO/BIND_NOW. |
||||
|
||||
Bootstrapped/regtested on x86_64-pc-linux-gnu (with the option enabled vs |
||||
not enabled). I suppose this is GCC 13 material, but maybe I'll get some |
||||
comments anyway. |
||||
|
||||
c++tools/ChangeLog: |
||||
|
||||
* configure.ac (--enable-host-bind-now): New check. |
||||
* configure: Regenerate. |
||||
|
||||
gcc/ChangeLog: |
||||
|
||||
* configure.ac (--enable-host-bind-now): New check. Add |
||||
-Wl,-z,now to LD_PICFLAG if --enable-host-bind-now. |
||||
* configure: Regenerate. |
||||
* doc/install.texi: Document --enable-host-bind-now. |
||||
|
||||
lto-plugin/ChangeLog: |
||||
|
||||
* configure.ac (--enable-host-bind-now): New check. Link with |
||||
-z,now. |
||||
* configure: Regenerate. |
||||
--- |
||||
c++tools/configure | 11 +++++++++++ |
||||
c++tools/configure.ac | 7 +++++++ |
||||
gcc/configure | 20 ++++++++++++++++++-- |
||||
gcc/configure.ac | 13 ++++++++++++- |
||||
gcc/doc/install.texi | 6 ++++++ |
||||
lto-plugin/configure | 20 ++++++++++++++++++-- |
||||
lto-plugin/configure.ac | 11 +++++++++++ |
||||
7 files changed, 83 insertions(+), 5 deletions(-) |
||||
|
||||
diff --git a/c++tools/configure b/c++tools/configure |
||||
index c1aceb8404a..25432b5040d 100755 |
||||
--- a/c++tools/configure |
||||
+++ b/c++tools/configure |
||||
@@ -631,6 +631,7 @@ ac_ct_CC |
||||
CFLAGS |
||||
CC |
||||
LD_PICFLAG |
||||
+enable_host_bind_now |
||||
PICFLAG |
||||
MAINTAINER |
||||
CXX_AUX_TOOLS |
||||
@@ -704,6 +705,7 @@ enable_c___tools |
||||
enable_maintainer_mode |
||||
enable_default_pie |
||||
enable_host_pie |
||||
+enable_host_bind_now |
||||
with_gcc_major_version_only |
||||
' |
||||
ac_precious_vars='build_alias |
||||
@@ -1336,6 +1338,7 @@ Optional Features: |
||||
configurey bits |
||||
--enable-default-pie enable Position Independent Executable as default |
||||
--enable-host-pie build host code as PIE |
||||
+ --enable-host-bind-now link host code as BIND_NOW |
||||
|
||||
Optional Packages: |
||||
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes] |
||||
@@ -3009,6 +3012,14 @@ fi |
||||
|
||||
|
||||
|
||||
+# Enable --enable-host-bind-now |
||||
+# Check whether --enable-host-bind-now was given. |
||||
+if test "${enable_host_bind_now+set}" = set; then : |
||||
+ enableval=$enable_host_bind_now; LD_PICFLAG="$LD_PICFLAG -Wl,-z,now" |
||||
+fi |
||||
+ |
||||
+ |
||||
+ |
||||
|
||||
# Check if O_CLOEXEC is defined by fcntl |
||||
ac_ext=c |
||||
diff --git a/c++tools/configure.ac b/c++tools/configure.ac |
||||
index 1e42689f2eb..d3f23f66f00 100644 |
||||
--- a/c++tools/configure.ac |
||||
+++ b/c++tools/configure.ac |
||||
@@ -110,6 +110,13 @@ AC_ARG_ENABLE(host-pie, |
||||
[build host code as PIE])], |
||||
[PICFLAG=-fPIE; LD_PICFLAG=-pie], []) |
||||
AC_SUBST(PICFLAG) |
||||
+ |
||||
+# Enable --enable-host-bind-now |
||||
+AC_ARG_ENABLE(host-bind-now, |
||||
+[AS_HELP_STRING([--enable-host-bind-now], |
||||
+ [link host code as BIND_NOW])], |
||||
+[LD_PICFLAG="$LD_PICFLAG -Wl,-z,now"], []) |
||||
+AC_SUBST(enable_host_bind_now) |
||||
AC_SUBST(LD_PICFLAG) |
||||
|
||||
# Check if O_CLOEXEC is defined by fcntl |
||||
diff --git a/gcc/configure b/gcc/configure |
||||
index 2ded5d4c50b..5671dc7dcf4 100755 |
||||
--- a/gcc/configure |
||||
+++ b/gcc/configure |
||||
@@ -635,6 +635,7 @@ CET_HOST_FLAGS |
||||
LD_PICFLAG |
||||
PICFLAG |
||||
enable_default_pie |
||||
+enable_host_bind_now |
||||
enable_host_pie |
||||
enable_host_shared |
||||
enable_plugin |
||||
@@ -1023,6 +1024,7 @@ enable_version_specific_runtime_libs |
||||
enable_plugin |
||||
enable_host_shared |
||||
enable_host_pie |
||||
+enable_host_bind_now |
||||
enable_libquadmath_support |
||||
with_linker_hash_style |
||||
with_diagnostics_color |
||||
@@ -1786,6 +1788,7 @@ Optional Features: |
||||
--enable-plugin enable plugin support |
||||
--enable-host-shared build host code as shared libraries |
||||
--enable-host-pie build host code as PIE |
||||
+ --enable-host-bind-now link host code as BIND_NOW |
||||
--disable-libquadmath-support |
||||
disable libquadmath support for Fortran |
||||
--enable-default-pie enable Position Independent Executable as default |
||||
@@ -19394,7 +19397,7 @@ else |
||||
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 |
||||
lt_status=$lt_dlunknown |
||||
cat > conftest.$ac_ext <<_LT_EOF |
||||
-#line 19409 "configure" |
||||
+#line 19412 "configure" |
||||
#include "confdefs.h" |
||||
|
||||
#if HAVE_DLFCN_H |
||||
@@ -19500,7 +19503,7 @@ else |
||||
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 |
||||
lt_status=$lt_dlunknown |
||||
cat > conftest.$ac_ext <<_LT_EOF |
||||
-#line 19515 "configure" |
||||
+#line 19518 "configure" |
||||
#include "confdefs.h" |
||||
|
||||
#if HAVE_DLFCN_H |
||||
@@ -32109,6 +32112,14 @@ fi |
||||
|
||||
|
||||
|
||||
+# Enable --enable-host-bind-now |
||||
+# Check whether --enable-host-bind-now was given. |
||||
+if test "${enable_host_bind_now+set}" = set; then : |
||||
+ enableval=$enable_host_bind_now; |
||||
+fi |
||||
+ |
||||
+ |
||||
+ |
||||
# Check whether --enable-libquadmath-support was given. |
||||
if test "${enable_libquadmath_support+set}" = set; then : |
||||
enableval=$enable_libquadmath_support; ENABLE_LIBQUADMATH_SUPPORT=$enableval |
||||
@@ -32295,6 +32306,8 @@ else |
||||
PICFLAG= |
||||
fi |
||||
|
||||
+ |
||||
+ |
||||
if test x$enable_host_pie = xyes; then |
||||
LD_PICFLAG=-pie |
||||
elif test x$gcc_cv_no_pie = xyes; then |
||||
@@ -32303,6 +32316,9 @@ else |
||||
LD_PICFLAG= |
||||
fi |
||||
|
||||
+if test x$enable_host_bind_now = xyes; then |
||||
+ LD_PICFLAG="$LD_PICFLAG -Wl,-z,now" |
||||
+fi |
||||
|
||||
|
||||
|
||||
diff --git a/gcc/configure.ac b/gcc/configure.ac |
||||
index dca995aeec7..6017bcbc8c6 100644 |
||||
--- a/gcc/configure.ac |
||||
+++ b/gcc/configure.ac |
||||
@@ -7497,6 +7497,12 @@ AC_ARG_ENABLE(host-pie, |
||||
[build host code as PIE])]) |
||||
AC_SUBST(enable_host_pie) |
||||
|
||||
+# Enable --enable-host-bind-now |
||||
+AC_ARG_ENABLE(host-bind-now, |
||||
+[AS_HELP_STRING([--enable-host-bind-now], |
||||
+ [link host code as BIND_NOW])]) |
||||
+AC_SUBST(enable_host_bind_now) |
||||
+ |
||||
AC_ARG_ENABLE(libquadmath-support, |
||||
[AS_HELP_STRING([--disable-libquadmath-support], |
||||
[disable libquadmath support for Fortran])], |
||||
@@ -7638,6 +7644,8 @@ else |
||||
PICFLAG= |
||||
fi |
||||
|
||||
+AC_SUBST([PICFLAG]) |
||||
+ |
||||
if test x$enable_host_pie = xyes; then |
||||
LD_PICFLAG=-pie |
||||
elif test x$gcc_cv_no_pie = xyes; then |
||||
@@ -7646,7 +7654,10 @@ else |
||||
LD_PICFLAG= |
||||
fi |
||||
|
||||
-AC_SUBST([PICFLAG]) |
||||
+if test x$enable_host_bind_now = xyes; then |
||||
+ LD_PICFLAG="$LD_PICFLAG -Wl,-z,now" |
||||
+fi |
||||
+ |
||||
AC_SUBST([LD_PICFLAG]) |
||||
|
||||
# Enable Intel CET on Intel CET enabled host if jit is enabled. |
||||
diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi |
||||
index 9747f832a75..b59af198d3e 100644 |
||||
--- a/gcc/doc/install.texi |
||||
+++ b/gcc/doc/install.texi |
||||
@@ -1041,6 +1041,12 @@ protection against Return Oriented Programming (ROP) attacks. |
||||
in which case @option{-fPIC} is used when compiling, and @option{-pie} when |
||||
linking. |
||||
|
||||
+@item --enable-host-bind-now |
||||
+Specify that the @emph{host} executables should be linked with the option |
||||
+@option{-Wl,-z,now}, which means that the dynamic linker will resolve all |
||||
+symbols when the executables are started, and that in turn allows RELRO to |
||||
+mark the GOT read-only, resulting in better security. |
||||
+ |
||||
@item @anchor{with-gnu-as}--with-gnu-as |
||||
Specify that the compiler should assume that the |
||||
assembler it finds is the GNU assembler. However, this does not modify |
||||
diff --git a/lto-plugin/configure b/lto-plugin/configure |
||||
index baa84adbb6c..669ccaede52 100755 |
||||
--- a/lto-plugin/configure |
||||
+++ b/lto-plugin/configure |
||||
@@ -656,6 +656,7 @@ accel_dir_suffix |
||||
gcc_build_dir |
||||
CET_HOST_FLAGS |
||||
ac_lto_plugin_ldflags |
||||
+enable_host_bind_now |
||||
ac_lto_plugin_warn_cflags |
||||
EGREP |
||||
GREP |
||||
@@ -771,6 +772,7 @@ enable_maintainer_mode |
||||
with_libiberty |
||||
enable_dependency_tracking |
||||
enable_largefile |
||||
+enable_host_bind_now |
||||
enable_cet |
||||
with_gcc_major_version_only |
||||
enable_shared |
||||
@@ -1418,6 +1420,7 @@ Optional Features: |
||||
--disable-dependency-tracking |
||||
speeds up one-time build |
||||
--disable-largefile omit support for large files |
||||
+ --enable-host-bind-now link host code as BIND_NOW |
||||
--enable-cet enable Intel CET in host libraries [default=auto] |
||||
--enable-shared[=PKGS] build shared libraries [default=yes] |
||||
--enable-static[=PKGS] build static libraries [default=yes] |
||||
@@ -5662,6 +5665,19 @@ if test "x$have_static_libgcc" = xyes; then |
||||
ac_lto_plugin_ldflags="-Wc,-static-libgcc" |
||||
fi |
||||
|
||||
+# Enable --enable-host-bind-now |
||||
+# Check whether --enable-host-bind-now was given. |
||||
+if test "${enable_host_bind_now+set}" = set; then : |
||||
+ enableval=$enable_host_bind_now; |
||||
+fi |
||||
+ |
||||
+ |
||||
+ |
||||
+if test x$enable_host_bind_now = xyes; then |
||||
+ ac_lto_plugin_ldflags="$ac_lto_plugin_ldflags -Wl,-z,now" |
||||
+fi |
||||
+ |
||||
+ |
||||
|
||||
# Check whether --enable-cet was given. |
||||
if test "${enable_cet+set}" = set; then : |
||||
@@ -11950,7 +11968,7 @@ else |
||||
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 |
||||
lt_status=$lt_dlunknown |
||||
cat > conftest.$ac_ext <<_LT_EOF |
||||
-#line 11963 "configure" |
||||
+#line 11983 "configure" |
||||
#include "confdefs.h" |
||||
|
||||
#if HAVE_DLFCN_H |
||||
@@ -12056,7 +12074,7 @@ else |
||||
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 |
||||
lt_status=$lt_dlunknown |
||||
cat > conftest.$ac_ext <<_LT_EOF |
||||
-#line 12069 "configure" |
||||
+#line 12089 "configure" |
||||
#include "confdefs.h" |
||||
|
||||
#if HAVE_DLFCN_H |
||||
diff --git a/lto-plugin/configure.ac b/lto-plugin/configure.ac |
||||
index 7e6f729e9dc..5d5fea8fe70 100644 |
||||
--- a/lto-plugin/configure.ac |
||||
+++ b/lto-plugin/configure.ac |
||||
@@ -25,6 +25,17 @@ LDFLAGS="$saved_LDFLAGS" |
||||
if test "x$have_static_libgcc" = xyes; then |
||||
ac_lto_plugin_ldflags="-Wc,-static-libgcc" |
||||
fi |
||||
+ |
||||
+# Enable --enable-host-bind-now |
||||
+AC_ARG_ENABLE(host-bind-now, |
||||
+[AS_HELP_STRING([--enable-host-bind-now], |
||||
+ [link host code as BIND_NOW])]) |
||||
+AC_SUBST(enable_host_bind_now) |
||||
+ |
||||
+if test x$enable_host_bind_now = xyes; then |
||||
+ ac_lto_plugin_ldflags="$ac_lto_plugin_ldflags -Wl,-z,now" |
||||
+fi |
||||
+ |
||||
AC_SUBST(ac_lto_plugin_ldflags) |
||||
|
||||
GCC_CET_HOST_FLAGS(CET_HOST_FLAGS) |
||||
|
||||
base-commit: bf799d3409cb9a189114a6c9ff5b7cd123915764 |
||||
-- |
||||
2.34.1 |
||||
|
@ -0,0 +1,20 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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,17 @@
@@ -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 |
||||
|
@ -0,0 +1,54 @@
@@ -0,0 +1,54 @@
|
||||
Backported from LLVM upstream: |
||||
|
||||
commit ef14b78d9a144ba81ba02083fe21eb286a88732b |
||||
Author: Florian Weimer <fweimer@redhat.com> |
||||
Date: Tue Feb 8 12:46:41 2022 -0800 |
||||
|
||||
[sanitizer] Use _thread_db_sizeof_pthread to obtain struct pthread size |
||||
|
||||
This symbol has been exported (as an internal GLIBC_PRIVATE symbol) from libc.so.6 starting with glibc 2.34. glibc uses it internally for its libthread_db implementation to enable thread debugging on GDB, so it is unlikely to go away for now. |
||||
|
||||
Fixes #52989. |
||||
|
||||
Reviewed By: #sanitizers, MaskRay, vitalybuka |
||||
|
||||
Differential Revision: https://reviews.llvm.org/D119007 |
||||
|
||||
--- a/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp |
||||
+++ b/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp |
||||
@@ -265,10 +265,8 @@ void InitTlsSize() { } |
||||
// sizeof(struct pthread) from glibc. |
||||
static atomic_uintptr_t thread_descriptor_size; |
||||
|
||||
-uptr ThreadDescriptorSize() { |
||||
- uptr val = atomic_load_relaxed(&thread_descriptor_size); |
||||
- if (val) |
||||
- return val; |
||||
+static uptr ThreadDescriptorSizeFallback() { |
||||
+ uptr val = 0; |
||||
#if defined(__x86_64__) || defined(__i386__) || defined(__arm__) |
||||
int major; |
||||
int minor; |
||||
@@ -323,8 +321,21 @@ uptr ThreadDescriptorSize() { |
||||
#elif defined(__s390__) |
||||
val = FIRST_32_SECOND_64(1152, 1776); // valid for glibc 2.22 |
||||
#endif |
||||
+ return val; |
||||
+} |
||||
+ |
||||
+uptr ThreadDescriptorSize() { |
||||
+ uptr val = atomic_load_relaxed(&thread_descriptor_size); |
||||
if (val) |
||||
- atomic_store_relaxed(&thread_descriptor_size, val); |
||||
+ return val; |
||||
+ // _thread_db_sizeof_pthread is a GLIBC_PRIVATE symbol that is exported in |
||||
+ // glibc 2.34 and later. |
||||
+ if (unsigned *psizeof = static_cast<unsigned *>( |
||||
+ dlsym(RTLD_DEFAULT, "_thread_db_sizeof_pthread"))) |
||||
+ val = *psizeof; |
||||
+ if (!val) |
||||
+ val = ThreadDescriptorSizeFallback(); |
||||
+ atomic_store_relaxed(&thread_descriptor_size, val); |
||||
return val; |
||||
} |
||||
|
@ -0,0 +1,24 @@
@@ -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 @@
@@ -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,37 @@
@@ -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,886 @@
@@ -0,0 +1,886 @@
|
||||
From 088d8e322811394203220663c3b9c925980d57a2 Mon Sep 17 00:00:00 2001 |
||||
From: Marek Polacek <polacek@redhat.com> |
||||
Date: Tue, 1 Feb 2022 18:27:16 -0500 |
||||
Subject: [PATCH] configure: Implement --enable-host-pie |
||||
|
||||
This patch implements the --enable-host-pie configure option which |
||||
makes the compiler executables PIE. This can be used to enhance |
||||
protection against ROP attacks, and can be viewed as part of a wider |
||||
trend to harden binaries. |
||||
|
||||
It is similar to the option --enable-host-shared, except that --e-h-s |
||||
won't add -shared to the linker flags whereas --e-h-p will add -pie. |
||||
It is different from --enable-default-pie because that option just |
||||
adds an implicit -fPIE/-pie when the compiler is invoked, but the |
||||
compiler itself isn't PIE. |
||||
|
||||
Since r12-5768-gfe7c3ecf, PCH works well with PIE, so there are no PCH |
||||
regressions. |
||||
|
||||
I plan to add an option to link with -Wl,-z,now. |
||||
|
||||
c++tools/ChangeLog: |
||||
|
||||
* Makefile.in: Rename PIEFLAG to PICFLAG. Set LD_PICFLAG. Use it. |
||||
Use pic/libiberty.a if PICFLAG is set. |
||||
* configure.ac (--enable-default-pie): Set PICFLAG instead of PIEFLAG. |
||||
(--enable-host-pie): New check. |
||||
* configure: Regenerate. |
||||
|
||||
gcc/ChangeLog: |
||||
|
||||
* Makefile.in: Set LD_PICFLAG. Use it. Set enable_host_pie. |
||||
Remove NO_PIE_CFLAGS and NO_PIE_FLAG. Pass LD_PICFLAG to |
||||
ALL_LINKERFLAGS. Use the "pic" build of libiberty if --enable-host-pie. |
||||
* configure.ac (--enable-host-shared): Don't set PICFLAG here. |
||||
(--enable-host-pie): New check. Set PICFLAG and LD_PICFLAG after this |
||||
check. |
||||
* configure: Regenerate. |
||||
* doc/install.texi: Document --enable-host-pie. |
||||
|
||||
libcody/ChangeLog: |
||||
|
||||
* Makefile.in: Pass LD_PICFLAG to LDFLAGS. |
||||
* configure.ac (--enable-host-shared): Don't set PICFLAG here. |
||||
(--enable-host-pie): New check. Set PICFLAG and LD_PICFLAG after this |
||||
check. |
||||
* configure: Regenerate. |
||||
|
||||
libcpp/ChangeLog: |
||||
|
||||
* configure.ac (--enable-host-shared): Don't set PICFLAG here. |
||||
(--enable-host-pie): New check. Set PICFLAG after this check. |
||||
* configure: Regenerate. |
||||
|
||||
libdecnumber/ChangeLog: |
||||
|
||||
* configure.ac (--enable-host-shared): Don't set PICFLAG here. |
||||
(--enable-host-pie): New check. Set PICFLAG after this check. |
||||
* configure: Regenerate. |
||||
|
||||
zlib/ChangeLog: |
||||
|
||||
* configure.ac (--enable-host-shared): Don't set PICFLAG here. |
||||
(--enable-host-pie): New check. Set PICFLAG after this check. |
||||
* configure: Regenerate. |
||||
--- |
||||
c++tools/Makefile.in | 11 ++++++--- |
||||
c++tools/configure | 17 +++++++++++--- |
||||
c++tools/configure.ac | 11 +++++++-- |
||||
gcc/Makefile.in | 29 ++++++++++++++---------- |
||||
gcc/configure | 47 +++++++++++++++++++++++++++------------ |
||||
gcc/configure.ac | 36 +++++++++++++++++++++--------- |
||||
gcc/d/Make-lang.in | 2 +- |
||||
gcc/doc/install.texi | 16 +++++++++++-- |
||||
libcody/Makefile.in | 2 +- |
||||
libcody/configure | 30 ++++++++++++++++++++++++- |
||||
libcody/configure.ac | 26 ++++++++++++++++++++-- |
||||
libcpp/configure | 22 +++++++++++++++++- |
||||
libcpp/configure.ac | 19 ++++++++++++++-- |
||||
libdecnumber/configure | 22 +++++++++++++++++- |
||||
libdecnumber/configure.ac | 19 ++++++++++++++-- |
||||
zlib/configure | 30 ++++++++++++++++++++----- |
||||
zlib/configure.ac | 21 ++++++++++++++--- |
||||
17 files changed, 295 insertions(+), 65 deletions(-) |
||||
|
||||
diff --git a/c++tools/Makefile.in b/c++tools/Makefile.in |
||||
index d6a33613732..4d5a5b0522b 100644 |
||||
--- a/c++tools/Makefile.in |
||||
+++ b/c++tools/Makefile.in |
||||
@@ -28,8 +28,9 @@ AUTOCONF := @AUTOCONF@ |
||||
AUTOHEADER := @AUTOHEADER@ |
||||
CXX := @CXX@ |
||||
CXXFLAGS := @CXXFLAGS@ |
||||
-PIEFLAG := @PIEFLAG@ |
||||
-CXXOPTS := $(CXXFLAGS) $(PIEFLAG) -fno-exceptions -fno-rtti |
||||
+PICFLAG := @PICFLAG@ |
||||
+LD_PICFLAG := @LD_PICFLAG@ |
||||
+CXXOPTS := $(CXXFLAGS) $(PICFLAG) -fno-exceptions -fno-rtti |
||||
LDFLAGS := @LDFLAGS@ |
||||
exeext := @EXEEXT@ |
||||
LIBIBERTY := ../libiberty/libiberty.a |
||||
@@ -87,11 +88,15 @@ ifeq (@CXX_AUX_TOOLS@,yes) |
||||
|
||||
all::g++-mapper-server$(exeext) |
||||
|
||||
+ifneq ($(PICFLAG),) |
||||
+override LIBIBERTY := ../libiberty/pic/libiberty.a |
||||
+endif |
||||
+ |
||||
MAPPER.O := server.o resolver.o |
||||
CODYLIB = ../libcody/libcody.a |
||||
CXXINC += -I$(srcdir)/../libcody -I$(srcdir)/../include -I$(srcdir)/../gcc -I. |
||||
g++-mapper-server$(exeext): $(MAPPER.O) $(CODYLIB) |
||||
- +$(CXX) $(LDFLAGS) $(PIEFLAG) -o $@ $^ $(VERSION.O) $(LIBIBERTY) $(NETLIBS) |
||||
+ +$(CXX) $(LDFLAGS) $(PICFLAG) $(LD_PICFLAG) -o $@ $^ $(VERSION.O) $(LIBIBERTY) $(NETLIBS) |
||||
|
||||
# copy to gcc dir so tests there can run |
||||
all::../gcc/g++-mapper-server$(exeext) |
||||
diff --git a/c++tools/configure b/c++tools/configure |
||||
index 742816e4253..88087009383 100755 |
||||
--- a/c++tools/configure |
||||
+++ b/c++tools/configure |
||||
@@ -630,7 +630,8 @@ CPP |
||||
ac_ct_CC |
||||
CFLAGS |
||||
CC |
||||
-PIEFLAG |
||||
+LD_PICFLAG |
||||
+PICFLAG |
||||
MAINTAINER |
||||
CXX_AUX_TOOLS |
||||
AUTOHEADER |
||||
@@ -702,6 +703,7 @@ enable_option_checking |
||||
enable_c___tools |
||||
enable_maintainer_mode |
||||
enable_default_pie |
||||
+enable_host_pie |
||||
with_gcc_major_version_only |
||||
' |
||||
ac_precious_vars='build_alias |
||||
@@ -1333,6 +1335,7 @@ Optional Features: |
||||
enable maintainer mode. Add rules to rebuild |
||||
configurey bits |
||||
--enable-default-pie enable Position Independent Executable as default |
||||
+ --enable-host-pie build host code as PIE |
||||
|
||||
Optional Packages: |
||||
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes] |
||||
@@ -2992,12 +2995,20 @@ test "$maintainer_mode" = yes && MAINTAI |
||||
# Check whether --enable-default-pie was given. |
||||
# Check whether --enable-default-pie was given. |
||||
if test "${enable_default_pie+set}" = set; then : |
||||
- enableval=$enable_default_pie; PIEFLAG=-fPIE |
||||
+ enableval=$enable_default_pie; PICFLAG=-fPIE |
||||
else |
||||
- PIEFLAG= |
||||
+ PICFLAG= |
||||
fi |
||||
|
||||
|
||||
+# Enable --enable-host-pie |
||||
+# Check whether --enable-host-pie was given. |
||||
+if test "${enable_host_pie+set}" = set; then : |
||||
+ enableval=$enable_host_pie; PICFLAG=-fPIE; LD_PICFLAG=-pie |
||||
+fi |
||||
+ |
||||
+ |
||||
+ |
||||
|
||||
# Check if O_CLOEXEC is defined by fcntl |
||||
ac_ext=c |
||||
diff --git a/c++tools/configure.ac b/c++tools/configure.ac |
||||
index 6662b5ad7c9..1e42689f2eb 100644 |
||||
--- a/c++tools/configure.ac |
||||
+++ b/c++tools/configure.ac |
||||
@@ -102,8 +102,15 @@ fi |
||||
AC_ARG_ENABLE(default-pie, |
||||
[AS_HELP_STRING([--enable-default-pie], |
||||
[enable Position Independent Executable as default])], |
||||
-[PIEFLAG=-fPIE], [PIEFLAG=]) |
||||
-AC_SUBST([PIEFLAG]) |
||||
+[PICFLAG=-fPIE], [PICFLAG=]) |
||||
+ |
||||
+# Enable --enable-host-pie |
||||
+AC_ARG_ENABLE(host-pie, |
||||
+[AS_HELP_STRING([--enable-host-pie], |
||||
+ [build host code as PIE])], |
||||
+[PICFLAG=-fPIE; LD_PICFLAG=-pie], []) |
||||
+AC_SUBST(PICFLAG) |
||||
+AC_SUBST(LD_PICFLAG) |
||||
|
||||
# Check if O_CLOEXEC is defined by fcntl |
||||
AC_CACHE_CHECK(for O_CLOEXEC, ac_cv_o_cloexec, [ |
||||
diff --git a/gcc/Makefile.in b/gcc/Makefile.in |
||||
index 31ff95500c9..151dbfa54ec 100644 |
||||
--- a/gcc/Makefile.in |
||||
+++ b/gcc/Makefile.in |
||||
@@ -155,6 +155,9 @@ LDFLAGS = @LDFLAGS@ |
||||
# Should we build position-independent host code? |
||||
PICFLAG = @PICFLAG@ |
||||
|
||||
+# The linker flag for the above. |
||||
+LD_PICFLAG = @LD_PICFLAG@ |
||||
+ |
||||
# Flags to determine code coverage. When coverage is disabled, this will |
||||
# contain the optimization flags, as you normally want code coverage |
||||
# without optimization. |
||||
@@ -263,18 +266,17 @@ LINKER = $(CC) |
||||
LINKER_FLAGS = $(CFLAGS) |
||||
endif |
||||
|
||||
+enable_host_pie = @enable_host_pie@ |
||||
+ |
||||
# Enable Intel CET on Intel CET enabled host if needed. |
||||
CET_HOST_FLAGS = @CET_HOST_FLAGS@ |
||||
COMPILER += $(CET_HOST_FLAGS) |
||||
|
||||
-NO_PIE_CFLAGS = @NO_PIE_CFLAGS@ |
||||
-NO_PIE_FLAG = @NO_PIE_FLAG@ |
||||
- |
||||
-# We don't want to compile the compilers with -fPIE, it make PCH fail. |
||||
-COMPILER += $(NO_PIE_CFLAGS) |
||||
+# Maybe compile the compilers with -fPIE or -fPIC. |
||||
+COMPILER += $(PICFLAG) |
||||
|
||||
-# Link with -no-pie since we compile the compiler with -fno-PIE. |
||||
-LINKER += $(NO_PIE_FLAG) |
||||
+# Link with -pie, or -no-pie, depending on the above. |
||||
+LINKER += $(LD_PICFLAG) |
||||
|
||||
# Like LINKER, but use a mutex for serializing front end links. |
||||
ifeq (@DO_LINK_MUTEX@,true) |
||||
@@ -1057,18 +1059,21 @@ ALL_CPPFLAGS = $(INCLUDES) $(CPPFLAGS) |
||||
ALL_COMPILERFLAGS = $(ALL_CXXFLAGS) |
||||
|
||||
# This is the variable to use when using $(LINKER). |
||||
-ALL_LINKERFLAGS = $(ALL_CXXFLAGS) |
||||
+ALL_LINKERFLAGS = $(ALL_CXXFLAGS) $(LD_PICFLAG) |
||||
|
||||
# Build and host support libraries. |
||||
|
||||
-# Use the "pic" build of libiberty if --enable-host-shared, unless we are |
||||
-# building for mingw. |
||||
+# Use the "pic" build of libiberty if --enable-host-shared or --enable-host-pie, |
||||
+# unless we are building for mingw. |
||||
LIBIBERTY_PICDIR=$(if $(findstring mingw,$(target)),,pic) |
||||
-ifeq ($(enable_host_shared),yes) |
||||
+ifneq ($(enable_host_shared)$(enable_host_pie),) |
||||
LIBIBERTY = ../libiberty/$(LIBIBERTY_PICDIR)/libiberty.a |
||||
-BUILD_LIBIBERTY = $(build_libobjdir)/libiberty/$(LIBIBERTY_PICDIR)/libiberty.a |
||||
else |
||||
LIBIBERTY = ../libiberty/libiberty.a |
||||
+endif |
||||
+ifeq ($(enable_host_shared),yes) |
||||
+BUILD_LIBIBERTY = $(build_libobjdir)/libiberty/$(LIBIBERTY_PICDIR)/libiberty.a |
||||
+else |
||||
BUILD_LIBIBERTY = $(build_libobjdir)/libiberty/libiberty.a |
||||
endif |
||||
|
||||
diff --git a/gcc/configure b/gcc/configure |
||||
index 258b17a226e..bd4fe1fd6ca 100755 |
||||
--- a/gcc/configure |
||||
+++ b/gcc/configure |
||||
@@ -632,10 +632,10 @@ ac_includes_default="\ |
||||
ac_subst_vars='LTLIBOBJS |
||||
LIBOBJS |
||||
CET_HOST_FLAGS |
||||
-NO_PIE_FLAG |
||||
-NO_PIE_CFLAGS |
||||
-enable_default_pie |
||||
+LD_PICFLAG |
||||
PICFLAG |
||||
+enable_default_pie |
||||
+enable_host_pie |
||||
enable_host_shared |
||||
enable_plugin |
||||
pluginlibs |
||||
@@ -1025,6 +1025,7 @@ enable_link_serialization |
||||
enable_version_specific_runtime_libs |
||||
enable_plugin |
||||
enable_host_shared |
||||
+enable_host_pie |
||||
enable_libquadmath_support |
||||
with_linker_hash_style |
||||
with_diagnostics_color |
||||
@@ -1787,6 +1788,7 @@ Optional Features: |
||||
in a compiler-specific directory |
||||
--enable-plugin enable plugin support |
||||
--enable-host-shared build host code as shared libraries |
||||
+ --enable-host-pie build host code as PIE |
||||
--disable-libquadmath-support |
||||
disable libquadmath support for Fortran |
||||
--enable-default-pie enable Position Independent Executable as default |
||||
@@ -19659,7 +19661,7 @@ else |
||||
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 |
||||
lt_status=$lt_dlunknown |
||||
cat > conftest.$ac_ext <<_LT_EOF |
||||
-#line 19395 "configure" |
||||
+#line 19409 "configure" |
||||
#include "confdefs.h" |
||||
|
||||
#if HAVE_DLFCN_H |
||||
@@ -19765,7 +19767,7 @@ else |
||||
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 |
||||
lt_status=$lt_dlunknown |
||||
cat > conftest.$ac_ext <<_LT_EOF |
||||
-#line 19501 "configure" |
||||
+#line 19515 "configure" |
||||
#include "confdefs.h" |
||||
|
||||
#if HAVE_DLFCN_H |
||||
@@ -32221,13 +32223,17 @@ fi |
||||
# Enable --enable-host-shared |
||||
# Check whether --enable-host-shared was given. |
||||
if test "${enable_host_shared+set}" = set; then : |
||||
- enableval=$enable_host_shared; PICFLAG=-fPIC |
||||
-else |
||||
- PICFLAG= |
||||
+ enableval=$enable_host_shared; |
||||
fi |
||||
|
||||
|
||||
|
||||
+# Enable --enable-host-pie |
||||
+# Check whether --enable-host-pie was given. |
||||
+if test "${enable_host_pie+set}" = set; then : |
||||
+ enableval=$enable_host_pie; |
||||
+fi |
||||
+ |
||||
|
||||
|
||||
# Check whether --enable-libquadmath-support was given. |
||||
@@ -32381,10 +32387,6 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext |
||||
fi |
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_c_no_fpie" >&5 |
||||
$as_echo "$gcc_cv_c_no_fpie" >&6; } |
||||
-if test "$gcc_cv_c_no_fpie" = "yes"; then |
||||
- NO_PIE_CFLAGS="-fno-PIE" |
||||
-fi |
||||
- |
||||
|
||||
# Check if -no-pie works. |
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -no-pie option" >&5 |
||||
@@ -32409,11 +32411,28 @@ rm -f core conftest.err conftest.$ac_objext \ |
||||
fi |
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_no_pie" >&5 |
||||
$as_echo "$gcc_cv_no_pie" >&6; } |
||||
-if test "$gcc_cv_no_pie" = "yes"; then |
||||
- NO_PIE_FLAG="-no-pie" |
||||
+ |
||||
+if test x$enable_host_shared = xyes; then |
||||
+ PICFLAG=-fPIC |
||||
+elif test x$enable_host_pie = xyes; then |
||||
+ PICFLAG=-fPIE |
||||
+elif test x$gcc_cv_c_no_fpie = xyes; then |
||||
+ PICFLAG=-fno-PIE |
||||
+else |
||||
+ PICFLAG= |
||||
+fi |
||||
+ |
||||
+if test x$enable_host_pie = xyes; then |
||||
+ LD_PICFLAG=-pie |
||||
+elif test x$gcc_cv_no_pie = xyes; then |
||||
+ LD_PICFLAG=-no-pie |
||||
+else |
||||
+ LD_PICFLAG= |
||||
fi |
||||
|
||||
|
||||
+ |
||||
+ |
||||
# Enable Intel CET on Intel CET enabled host if jit is enabled. |
||||
# Check whether --enable-cet was given. |
||||
if test "${enable_cet+set}" = set; then : |
||||
diff --git a/gcc/configure.ac b/gcc/configure.ac |
||||
index 06750cee977..dca995aeec7 100644 |
||||
--- a/gcc/configure.ac |
||||
+++ b/gcc/configure.ac |
||||
@@ -7488,11 +7488,14 @@ fi |
||||
# Enable --enable-host-shared |
||||
AC_ARG_ENABLE(host-shared, |
||||
[AS_HELP_STRING([--enable-host-shared], |
||||
- [build host code as shared libraries])], |
||||
-[PICFLAG=-fPIC], [PICFLAG=]) |
||||
+ [build host code as shared libraries])]) |
||||
AC_SUBST(enable_host_shared) |
||||
-AC_SUBST(PICFLAG) |
||||
|
||||
+# Enable --enable-host-pie |
||||
+AC_ARG_ENABLE(host-pie, |
||||
+[AS_HELP_STRING([--enable-host-pie], |
||||
+ [build host code as PIE])]) |
||||
+AC_SUBST(enable_host_pie) |
||||
|
||||
AC_ARG_ENABLE(libquadmath-support, |
||||
[AS_HELP_STRING([--disable-libquadmath-support], |
||||
@@ -7614,10 +7617,6 @@ AC_CACHE_CHECK([for -fno-PIE option], |
||||
[gcc_cv_c_no_fpie=yes], |
||||
[gcc_cv_c_no_fpie=no]) |
||||
CXXFLAGS="$saved_CXXFLAGS"]) |
||||
-if test "$gcc_cv_c_no_fpie" = "yes"; then |
||||
- NO_PIE_CFLAGS="-fno-PIE" |
||||
-fi |
||||
-AC_SUBST([NO_PIE_CFLAGS]) |
||||
|
||||
# Check if -no-pie works. |
||||
AC_CACHE_CHECK([for -no-pie option], |
||||
@@ -7628,10 +7627,27 @@ AC_CACHE_CHECK([for -no-pie option], |
||||
[gcc_cv_no_pie=yes], |
||||
[gcc_cv_no_pie=no]) |
||||
LDFLAGS="$saved_LDFLAGS"]) |
||||
-if test "$gcc_cv_no_pie" = "yes"; then |
||||
- NO_PIE_FLAG="-no-pie" |
||||
+ |
||||
+if test x$enable_host_shared = xyes; then |
||||
+ PICFLAG=-fPIC |
||||
+elif test x$enable_host_pie = xyes; then |
||||
+ PICFLAG=-fPIE |
||||
+elif test x$gcc_cv_c_no_fpie = xyes; then |
||||
+ PICFLAG=-fno-PIE |
||||
+else |
||||
+ PICFLAG= |
||||
fi |
||||
-AC_SUBST([NO_PIE_FLAG]) |
||||
+ |
||||
+if test x$enable_host_pie = xyes; then |
||||
+ LD_PICFLAG=-pie |
||||
+elif test x$gcc_cv_no_pie = xyes; then |
||||
+ LD_PICFLAG=-no-pie |
||||
+else |
||||
+ LD_PICFLAG= |
||||
+fi |
||||
+ |
||||
+AC_SUBST([PICFLAG]) |
||||
+AC_SUBST([LD_PICFLAG]) |
||||
|
||||
# Enable Intel CET on Intel CET enabled host if jit is enabled. |
||||
GCC_CET_HOST_FLAGS(CET_HOST_FLAGS) |
||||
diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi |
||||
index 93eae1f2582..be6985646b2 100644 |
||||
--- a/gcc/doc/install.texi |
||||
+++ b/gcc/doc/install.texi |
||||
@@ -1021,14 +1021,26 @@ code. |
||||
|
||||
@item --enable-host-shared |
||||
Specify that the @emph{host} code should be built into position-independent |
||||
-machine code (with -fPIC), allowing it to be used within shared libraries, |
||||
-but yielding a slightly slower compiler. |
||||
+machine code (with @option{-fPIC}), allowing it to be used within shared |
||||
+libraries, but yielding a slightly slower compiler. |
||||
|
||||
This option is required when building the libgccjit.so library. |
||||
|
||||
Contrast with @option{--enable-shared}, which affects @emph{target} |
||||
libraries. |
||||
|
||||
+@item --enable-host-pie |
||||
+Specify that the @emph{host} executables should be built into |
||||
+position-independent executables (with @option{-fPIE} and @option{-pie}), |
||||
+yielding a slightly slower compiler (but faster than |
||||
+@option{--enable-host-shared}). Position-independent executables are loaded |
||||
+at random addresses each time they are executed, therefore provide additional |
||||
+protection against Return Oriented Programming (ROP) attacks. |
||||
+ |
||||
+@option{--enable-host-pie}) may be used with @option{--enable-host-shared}), |
||||
+in which case @option{-fPIC} is used when compiling, and @option{-pie} when |
||||
+linking. |
||||
+ |
||||
@item @anchor{with-gnu-as}--with-gnu-as |
||||
Specify that the compiler should assume that the |
||||
assembler it finds is the GNU assembler. However, this does not modify |
||||
diff --git a/libcody/Makefile.in b/libcody/Makefile.in |
||||
index 7eaf8ace8ce..0ff1625a39f 100644 |
||||
--- a/libcody/Makefile.in |
||||
+++ b/libcody/Makefile.in |
||||
@@ -31,7 +31,7 @@ endif |
||||
CXXOPTS += $(filter-out -DHAVE_CONFIG_H,@DEFS@) -include config.h |
||||
|
||||
# Linker options |
||||
-LDFLAGS := @LDFLAGS@ |
||||
+LDFLAGS := @LDFLAGS@ @LD_PICFLAG@ |
||||
LIBS := @LIBS@ |
||||
|
||||
# Per-source & per-directory compile flags (warning: recursive) |
||||
diff --git a/libcody/configure b/libcody/configure |
||||
index da52a5cfca5..0e536c0ccb0 100755 |
||||
--- a/libcody/configure |
||||
+++ b/libcody/configure |
||||
@@ -591,7 +591,10 @@ configure_args |
||||
AR |
||||
RANLIB |
||||
EXCEPTIONS |
||||
+LD_PICFLAG |
||||
PICFLAG |
||||
+enable_host_pie |
||||
+enable_host_shared |
||||
OBJEXT |
||||
EXEEXT |
||||
ac_ct_CXX |
||||
@@ -653,6 +656,7 @@ enable_maintainer_mode |
||||
with_compiler |
||||
enable_checking |
||||
enable_host_shared |
||||
+enable_host_pie |
||||
enable_exceptions |
||||
' |
||||
ac_precious_vars='build_alias |
||||
@@ -1286,6 +1290,7 @@ Optional Features: |
||||
yes,no,all,none,release. Flags are: misc,valgrind or |
||||
other strings |
||||
--enable-host-shared build host code as shared libraries |
||||
+ --enable-host-pie build host code as PIE |
||||
--enable-exceptions enable exceptions & rtti |
||||
|
||||
Optional Packages: |
||||
@@ -2635,11 +2640,34 @@ fi |
||||
# Enable --enable-host-shared. |
||||
# Check whether --enable-host-shared was given. |
||||
if test "${enable_host_shared+set}" = set; then : |
||||
- enableval=$enable_host_shared; PICFLAG=-fPIC |
||||
+ enableval=$enable_host_shared; |
||||
+fi |
||||
+ |
||||
+ |
||||
+ |
||||
+# Enable --enable-host-pie. |
||||
+# Check whether --enable-host-pie was given. |
||||
+if test "${enable_host_pie+set}" = set; then : |
||||
+ enableval=$enable_host_pie; |
||||
+fi |
||||
+ |
||||
+ |
||||
+ |
||||
+if test x$enable_host_shared = xyes; then |
||||
+ PICFLAG=-fPIC |
||||
+elif test x$enable_host_pie = xyes; then |
||||
+ PICFLAG=-fPIE |
||||
else |
||||
PICFLAG= |
||||
fi |
||||
|
||||
+if test x$enable_host_pie = xyes; then |
||||
+ LD_PICFLAG=-pie |
||||
+else |
||||
+ LD_PICFLAG= |
||||
+fi |
||||
+ |
||||
+ |
||||
|
||||
|
||||
# Check whether --enable-exceptions was given. |
||||
diff --git a/libcody/configure.ac b/libcody/configure.ac |
||||
index 960191ecb72..14e8dd4a226 100644 |
||||
--- a/libcody/configure.ac |
||||
+++ b/libcody/configure.ac |
||||
@@ -63,9 +63,31 @@ fi |
||||
# Enable --enable-host-shared. |
||||
AC_ARG_ENABLE(host-shared, |
||||
[AS_HELP_STRING([--enable-host-shared], |
||||
- [build host code as shared libraries])], |
||||
-[PICFLAG=-fPIC], [PICFLAG=]) |
||||
+ [build host code as shared libraries])]) |
||||
+AC_SUBST(enable_host_shared) |
||||
+ |
||||
+# Enable --enable-host-pie. |
||||
+AC_ARG_ENABLE(host-pie, |
||||
+[AS_HELP_STRING([--enable-host-pie], |
||||
+ [build host code as PIE])]) |
||||
+AC_SUBST(enable_host_pie) |
||||
+ |
||||
+if test x$enable_host_shared = xyes; then |
||||
+ PICFLAG=-fPIC |
||||
+elif test x$enable_host_pie = xyes; then |
||||
+ PICFLAG=-fPIE |
||||
+else |
||||
+ PICFLAG= |
||||
+fi |
||||
+ |
||||
+if test x$enable_host_pie = xyes; then |
||||
+ LD_PICFLAG=-pie |
||||
+else |
||||
+ LD_PICFLAG= |
||||
+fi |
||||
+ |
||||
AC_SUBST(PICFLAG) |
||||
+AC_SUBST(LD_PICFLAG) |
||||
|
||||
NMS_ENABLE_EXCEPTIONS |
||||
|
||||
diff --git a/libcpp/configure b/libcpp/configure |
||||
index 75145390215..85168273cd1 100755 |
||||
--- a/libcpp/configure |
||||
+++ b/libcpp/configure |
||||
@@ -625,6 +625,8 @@ ac_includes_default="\ |
||||
ac_subst_vars='LTLIBOBJS |
||||
CET_HOST_FLAGS |
||||
PICFLAG |
||||
+enable_host_pie |
||||
+enable_host_shared |
||||
MAINT |
||||
USED_CATALOGS |
||||
PACKAGE |
||||
@@ -738,6 +740,7 @@ enable_maintainer_mode |
||||
enable_checking |
||||
enable_canonical_system_headers |
||||
enable_host_shared |
||||
+enable_host_pie |
||||
enable_cet |
||||
enable_valgrind_annotations |
||||
' |
||||
@@ -1379,6 +1382,7 @@ Optional Features: |
||||
--enable-canonical-system-headers |
||||
enable or disable system headers canonicalization |
||||
--enable-host-shared build host code as shared libraries |
||||
+ --enable-host-pie build host code as PIE |
||||
--enable-cet enable Intel CET in host libraries [default=auto] |
||||
--enable-valgrind-annotations |
||||
enable valgrind runtime interaction |
||||
@@ -7605,7 +7609,23 @@ esac |
||||
# Enable --enable-host-shared. |
||||
# Check whether --enable-host-shared was given. |
||||
if test "${enable_host_shared+set}" = set; then : |
||||
- enableval=$enable_host_shared; PICFLAG=-fPIC |
||||
+ enableval=$enable_host_shared; |
||||
+fi |
||||
+ |
||||
+ |
||||
+ |
||||
+# Enable --enable-host-pie. |
||||
+# Check whether --enable-host-pie was given. |
||||
+if test "${enable_host_pie+set}" = set; then : |
||||
+ enableval=$enable_host_pie; |
||||
+fi |
||||
+ |
||||
+ |
||||
+ |
||||
+if test x$enable_host_shared = xyes; then |
||||
+ PICFLAG=-fPIC |
||||
+elif test x$enable_host_pie = xyes; then |
||||
+ PICFLAG=-fPIE |
||||
else |
||||
PICFLAG= |
||||
fi |
||||
diff --git a/libcpp/configure.ac b/libcpp/configure.ac |
||||
index 9b6042518e5..d25bf5f414f 100644 |
||||
--- a/libcpp/configure.ac |
||||
+++ b/libcpp/configure.ac |
||||
@@ -211,8 +211,23 @@ esac |
||||
# Enable --enable-host-shared. |
||||
AC_ARG_ENABLE(host-shared, |
||||
[AS_HELP_STRING([--enable-host-shared], |
||||
- [build host code as shared libraries])], |
||||
-[PICFLAG=-fPIC], [PICFLAG=]) |
||||
+ [build host code as shared libraries])]) |
||||
+AC_SUBST(enable_host_shared) |
||||
+ |
||||
+# Enable --enable-host-pie. |
||||
+AC_ARG_ENABLE(host-pie, |
||||
+[AS_HELP_STRING([--enable-host-pie], |
||||
+ [build host code as PIE])]) |
||||
+AC_SUBST(enable_host_pie) |
||||
+ |
||||
+if test x$enable_host_shared = xyes; then |
||||
+ PICFLAG=-fPIC |
||||
+elif test x$enable_host_pie = xyes; then |
||||
+ PICFLAG=-fPIE |
||||
+else |
||||
+ PICFLAG= |
||||
+fi |
||||
+ |
||||
AC_SUBST(PICFLAG) |
||||
|
||||
# Enable Intel CET on Intel CET enabled host if jit is enabled. |
||||
diff --git a/libdecnumber/configure b/libdecnumber/configure |
||||
index da5302f9315..d805fdeab5a 100755 |
||||
--- a/libdecnumber/configure |
||||
+++ b/libdecnumber/configure |
||||
@@ -626,6 +626,8 @@ ac_subst_vars='LTLIBOBJS |
||||
LIBOBJS |
||||
CET_HOST_FLAGS |
||||
PICFLAG |
||||
+enable_host_pie |
||||
+enable_host_shared |
||||
ADDITIONAL_OBJS |
||||
enable_decimal_float |
||||
target_os |
||||
@@ -706,6 +708,7 @@ enable_werror_always |
||||
enable_maintainer_mode |
||||
enable_decimal_float |
||||
enable_host_shared |
||||
+enable_host_pie |
||||
enable_cet |
||||
' |
||||
ac_precious_vars='build_alias |
||||
@@ -1338,6 +1341,7 @@ Optional Features: |
||||
or 'dpd' choses which decimal floating point format |
||||
to use |
||||
--enable-host-shared build host code as shared libraries |
||||
+ --enable-host-pie build host code as PIE |
||||
--enable-cet enable Intel CET in host libraries [default=auto] |
||||
|
||||
Some influential environment variables: |
||||
@@ -5185,7 +5189,23 @@ $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h |
||||
# Enable --enable-host-shared. |
||||
# Check whether --enable-host-shared was given. |
||||
if test "${enable_host_shared+set}" = set; then : |
||||
- enableval=$enable_host_shared; PICFLAG=-fPIC |
||||
+ enableval=$enable_host_shared; |
||||
+fi |
||||
+ |
||||
+ |
||||
+ |
||||
+# Enable --enable-host-pie. |
||||
+# Check whether --enable-host-pie was given. |
||||
+if test "${enable_host_pie+set}" = set; then : |
||||
+ enableval=$enable_host_pie; |
||||
+fi |
||||
+ |
||||
+ |
||||
+ |
||||
+if test x$enable_host_shared = xyes; then |
||||
+ PICFLAG=-fPIC |
||||
+elif test x$enable_host_pie = xyes; then |
||||
+ PICFLAG=-fPIE |
||||
else |
||||
PICFLAG= |
||||
fi |
||||
diff --git a/libdecnumber/configure.ac b/libdecnumber/configure.ac |
||||
index 0794031ec83..14f67f926d1 100644 |
||||
--- a/libdecnumber/configure.ac |
||||
+++ b/libdecnumber/configure.ac |
||||
@@ -100,8 +100,23 @@ AC_C_BIGENDIAN |
||||
# Enable --enable-host-shared. |
||||
AC_ARG_ENABLE(host-shared, |
||||
[AS_HELP_STRING([--enable-host-shared], |
||||
- [build host code as shared libraries])], |
||||
-[PICFLAG=-fPIC], [PICFLAG=]) |
||||
+ [build host code as shared libraries])]) |
||||
+AC_SUBST(enable_host_shared) |
||||
+ |
||||
+# Enable --enable-host-pie. |
||||
+AC_ARG_ENABLE(host-pie, |
||||
+[AS_HELP_STRING([--enable-host-pie], |
||||
+ [build host code as PIE])]) |
||||
+AC_SUBST(enable_host_pie) |
||||
+ |
||||
+if test x$enable_host_shared = xyes; then |
||||
+ PICFLAG=-fPIC |
||||
+elif test x$enable_host_pie = xyes; then |
||||
+ PICFLAG=-fPIE |
||||
+else |
||||
+ PICFLAG= |
||||
+fi |
||||
+ |
||||
AC_SUBST(PICFLAG) |
||||
|
||||
# Enable Intel CET on Intel CET enabled host if jit is enabled. |
||||
diff --git a/zlib/configure b/zlib/configure |
||||
index f489f31bc70..0dfc1982844 100755 |
||||
--- a/zlib/configure |
||||
+++ b/zlib/configure |
||||
@@ -635,6 +635,8 @@ am__EXEEXT_TRUE |
||||
LTLIBOBJS |
||||
LIBOBJS |
||||
PICFLAG |
||||
+enable_host_pie |
||||
+enable_host_shared |
||||
TARGET_LIBRARY_FALSE |
||||
TARGET_LIBRARY_TRUE |
||||
toolexeclibdir |
||||
@@ -778,6 +780,7 @@ with_gnu_ld |
||||
enable_libtool_lock |
||||
with_toolexeclibdir |
||||
enable_host_shared |
||||
+enable_host_pie |
||||
' |
||||
ac_precious_vars='build_alias |
||||
host_alias |
||||
@@ -1420,6 +1423,7 @@ Optional Features: |
||||
optimize for fast installation [default=yes] |
||||
--disable-libtool-lock avoid locking (might break parallel builds) |
||||
--enable-host-shared build host code as shared libraries |
||||
+ --enable-host-pie build host code as PIE |
||||
|
||||
Optional Packages: |
||||
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes] |
||||
@@ -4169,7 +4173,7 @@ case "$host" in |
||||
case "$enable_cet" in |
||||
auto) |
||||
# Check if target supports multi-byte NOPs |
||||
- # and if assembler supports CET insn. |
||||
+ # and if compiler and assembler support CET insn. |
||||
cet_save_CFLAGS="$CFLAGS" |
||||
CFLAGS="$CFLAGS -fcf-protection" |
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext |
||||
@@ -10735,7 +10739,7 @@ else |
||||
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 |
||||
lt_status=$lt_dlunknown |
||||
cat > conftest.$ac_ext <<_LT_EOF |
||||
-#line 10748 "configure" |
||||
+#line 10754 "configure" |
||||
#include "confdefs.h" |
||||
|
||||
#if HAVE_DLFCN_H |
||||
@@ -10841,7 +10845,7 @@ else |
||||
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 |
||||
lt_status=$lt_dlunknown |
||||
cat > conftest.$ac_ext <<_LT_EOF |
||||
-#line 10854 "configure" |
||||
+#line 10860 "configure" |
||||
#include "confdefs.h" |
||||
|
||||
#if HAVE_DLFCN_H |
||||
@@ -11524,15 +11528,31 @@ else |
||||
multilib_arg= |
||||
fi |
||||
|
||||
+# Enable --enable-host-shared. |
||||
# Check whether --enable-host-shared was given. |
||||
if test "${enable_host_shared+set}" = set; then : |
||||
- enableval=$enable_host_shared; PICFLAG=-fPIC |
||||
+ enableval=$enable_host_shared; |
||||
+fi |
||||
+ |
||||
+ |
||||
+ |
||||
+# Enable --enable-host-pie. |
||||
+# Check whether --enable-host-pie was given. |
||||
+if test "${enable_host_pie+set}" = set; then : |
||||
+ enableval=$enable_host_pie; |
||||
+fi |
||||
+ |
||||
+ |
||||
+ |
||||
+if test x$enable_host_shared = xyes; then |
||||
+ PICFLAG=-fPIC |
||||
+elif test x$enable_host_pie = xyes; then |
||||
+ PICFLAG=-fPIE |
||||
else |
||||
PICFLAG= |
||||
fi |
||||
|
||||
|
||||
- |
||||
ac_config_files="$ac_config_files Makefile" |
||||
|
||||
cat >confcache <<\_ACEOF |
||||
diff --git a/zlib/configure.ac b/zlib/configure.ac |
||||
index be1cfe29651..adf7aad4e51 100644 |
||||
--- a/zlib/configure.ac |
||||
+++ b/zlib/configure.ac |
||||
@@ -122,11 +122,26 @@ else |
||||
multilib_arg= |
||||
fi |
||||
|
||||
+# Enable --enable-host-shared. |
||||
AC_ARG_ENABLE(host-shared, |
||||
[AS_HELP_STRING([--enable-host-shared], |
||||
- [build host code as shared libraries])], |
||||
-[PICFLAG=-fPIC], [PICFLAG=]) |
||||
-AC_SUBST(PICFLAG) |
||||
+ [build host code as shared libraries])]) |
||||
+AC_SUBST(enable_host_shared) |
||||
+ |
||||
+# Enable --enable-host-pie. |
||||
+AC_ARG_ENABLE(host-pie, |
||||
+[AS_HELP_STRING([--enable-host-pie], |
||||
+ [build host code as PIE])]) |
||||
+AC_SUBST(enable_host_pie) |
||||
+ |
||||
+if test x$enable_host_shared = xyes; then |
||||
+ PICFLAG=-fPIC |
||||
+elif test x$enable_host_pie = xyes; then |
||||
+ PICFLAG=-fPIE |
||||
+else |
||||
+ PICFLAG= |
||||
+fi |
||||
|
||||
+AC_SUBST(PICFLAG) |
||||
AC_CONFIG_FILES([Makefile]) |
||||
AC_OUTPUT |
||||
|
||||
base-commit: ee50b4383a0dca88172c3a821418344bd7391956 |
||||
-- |
||||
2.34.1 |
||||
|
@ -0,0 +1,66 @@
@@ -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,47 @@
@@ -0,0 +1,47 @@
|
||||
2021-10-11 Jakub Jelinek <jakub@redhat.com> |
||||
|
||||
PR c++/102642 |
||||
* name-lookup.c (push_local_extern_decl_alias): Don't call |
||||
set_decl_tls_model on error_mark_node. |
||||
* parser.c (cp_parser_omp_declare_target): Likewise. |
||||
|
||||
* g++.dg/tls/pr102642.C: New test. |
||||
|
||||
--- gcc/cp/name-lookup.c.jj 2021-10-01 10:30:07.674588541 +0200 |
||||
+++ gcc/cp/name-lookup.c 2021-10-11 12:43:39.261051228 +0200 |
||||
@@ -3474,7 +3474,9 @@ push_local_extern_decl_alias (tree decl) |
||||
push_nested_namespace (ns); |
||||
alias = do_pushdecl (alias, /* hiding= */true); |
||||
pop_nested_namespace (ns); |
||||
- if (VAR_P (decl) && CP_DECL_THREAD_LOCAL_P (decl)) |
||||
+ if (VAR_P (decl) |
||||
+ && CP_DECL_THREAD_LOCAL_P (decl) |
||||
+ && alias != error_mark_node) |
||||
set_decl_tls_model (alias, DECL_TLS_MODEL (decl)); |
||||
} |
||||
} |
||||
--- gcc/cp/parser.c.jj 2021-10-09 10:14:24.043098112 +0200 |
||||
+++ gcc/cp/parser.c 2021-10-11 12:47:21.220874667 +0200 |
||||
@@ -45665,7 +45666,8 @@ cp_parser_omp_declare_target (cp_parser |
||||
if (VAR_OR_FUNCTION_DECL_P (t) |
||||
&& DECL_LOCAL_DECL_P (t) |
||||
&& DECL_LANG_SPECIFIC (t) |
||||
- && DECL_LOCAL_DECL_ALIAS (t)) |
||||
+ && DECL_LOCAL_DECL_ALIAS (t) |
||||
+ && DECL_LOCAL_DECL_ALIAS (t) != error_mark_node) |
||||
handle_omp_declare_target_clause (c, DECL_LOCAL_DECL_ALIAS (t), |
||||
device_type); |
||||
} |
||||
--- gcc/testsuite/g++.dg/tls/pr102642.C.jj 2021-10-11 13:00:35.889503002 +0200 |
||||
+++ gcc/testsuite/g++.dg/tls/pr102642.C 2021-10-11 13:00:20.388724721 +0200 |
||||
@@ -0,0 +1,10 @@ |
||||
+// PR c++/102642 |
||||
+// { dg-do compile { target c++11 } } |
||||
+ |
||||
+thread_local int *z; // { dg-message "previous declaration" } |
||||
+ |
||||
+void |
||||
+foo () |
||||
+{ |
||||
+ extern thread_local int z; // { dg-error "conflicting declaration" } |
||||
+} |
@ -0,0 +1,828 @@
@@ -0,0 +1,828 @@
|
||||
This patch backports support for PCH with PIE from upstream trunk. |
||||
|
||||
It squashes two commits: |
||||
|
||||
commit e4641191287ca613529d78a906afe4f029c1c3cd |
||||
Author: Iain Sandoe <iain@sandoe.co.uk> |
||||
Date: Sat Nov 13 12:26:16 2021 +0000 |
||||
|
||||
PCH: Make the save and restore diagnostics more robust. |
||||
|
||||
When saving, if we cannot obtain a suitable memory segment there |
||||
is no point in continuing, so exit with an error. |
||||
|
||||
When reading in the PCH, we have a situation that the read-in |
||||
data will replace the line tables used by the diagnostics output. |
||||
However, the state of the read-oin line tables is indeterminate |
||||
at some points where diagnostics might be needed. |
||||
|
||||
To make this more robust, we save the existing line tables at |
||||
the start and, once we have read in the pointer to the new one, |
||||
put that to one side and restore the original table. This |
||||
avoids compiler hangs if the read or memory acquisition code |
||||
issues an assert, fatal_error, segv etc. |
||||
|
||||
Once the read is complete, we swap in the new line table that |
||||
came from the PCH. |
||||
|
||||
If the read-in PCH is corrupted then we still have a broken |
||||
compilation w.r.t any future diagnostics - but there is little |
||||
that can be done about that without more careful validation of |
||||
the file. |
||||
|
||||
and |
||||
|
||||
commit fe7c3ecff1f9c0520090a77fa824d8c5d9dbec12 |
||||
Author: Jakub Jelinek <jakub@redhat.com> |
||||
Date: Fri Dec 3 11:03:30 2021 +0100 |
||||
|
||||
pch: Add support for PCH for relocatable executables [PR71934] |
||||
|
||||
So, if we want to make PCH work for PIEs, I'd say we can: |
||||
1) add a new GTY option, say callback, which would act like |
||||
skip for non-PCH and for PCH would make us skip it but |
||||
remember for address bias translation |
||||
2) drop the skip for tree_translation_unit_decl::language |
||||
3) change get_unnamed_section to have const char * as |
||||
last argument instead of const void *, change |
||||
unnamed_section::data also to const char * and update |
||||
everything related to that |
||||
4) maybe add a host hook whether it is ok to support binaries |
||||
changing addresses (the only thing I'm worried is if |
||||
some host that uses function descriptors allocates them |
||||
dynamically instead of having them somewhere in the |
||||
executable) |
||||
5) maybe add a gengtype warning if it sees in GTY tracked |
||||
structure a function pointer without that new callback |
||||
option |
||||
|
||||
Here is 1), 2), 3) implemented. |
||||
|
||||
Note, on stdc++.h.gch/O2g.gch there are just those 10 relocations without |
||||
the second patch, with it a few more, but nothing huge. And for non-PIEs |
||||
there isn't really any extra work on the load side except freading two scalar |
||||
values and fseek. |
||||
|
||||
diff --git a/gcc/c-family/c-pch.c b/gcc/c-family/c-pch.c |
||||
index fd94c3799ac..eebfa1df0bc 100644 |
||||
--- a/gcc/c-family/c-pch.c |
||||
+++ b/gcc/c-family/c-pch.c |
||||
@@ -54,7 +54,6 @@ struct c_pch_validity |
||||
{ |
||||
unsigned char debug_info_type; |
||||
signed char match[MATCH_SIZE]; |
||||
- void (*pch_init) (void); |
||||
size_t target_data_length; |
||||
}; |
||||
|
||||
@@ -117,7 +116,6 @@ pch_init (void) |
||||
gcc_assert (v.match[i] == *pch_matching[i].flag_var); |
||||
} |
||||
} |
||||
- v.pch_init = &pch_init; |
||||
target_validity = targetm.get_pch_validity (&v.target_data_length); |
||||
|
||||
if (fwrite (partial_pch, IDENT_LENGTH, 1, f) != 1 |
||||
@@ -275,19 +273,6 @@ c_common_valid_pch (cpp_reader *pfile, const char *name, int fd) |
||||
} |
||||
} |
||||
|
||||
- /* If the text segment was not loaded at the same address as it was |
||||
- when the PCH file was created, function pointers loaded from the |
||||
- PCH will not be valid. We could in theory remap all the function |
||||
- pointers, but no support for that exists at present. |
||||
- Since we have the same executable, it should only be necessary to |
||||
- check one function. */ |
||||
- if (v.pch_init != &pch_init) |
||||
- { |
||||
- cpp_warning (pfile, CPP_W_INVALID_PCH, |
||||
- "%s: had text segment at different address", name); |
||||
- return 2; |
||||
- } |
||||
- |
||||
/* Check the target-specific validity data. */ |
||||
{ |
||||
void *this_file_data = xmalloc (v.target_data_length); |
||||
diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c |
||||
index 3a250dfb960..4d29e80dcc9 100644 |
||||
--- a/gcc/config/avr/avr.c |
||||
+++ b/gcc/config/avr/avr.c |
||||
@@ -10221,10 +10221,9 @@ avr_output_bss_section_asm_op (const void *data) |
||||
/* Unnamed section callback for progmem*.data sections. */ |
||||
|
||||
static void |
||||
-avr_output_progmem_section_asm_op (const void *data) |
||||
+avr_output_progmem_section_asm_op (const char *data) |
||||
{ |
||||
- fprintf (asm_out_file, "\t.section\t%s,\"a\",@progbits\n", |
||||
- (const char*) data); |
||||
+ fprintf (asm_out_file, "\t.section\t%s,\"a\",@progbits\n", data); |
||||
} |
||||
|
||||
|
||||
diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c |
||||
index 5d173919ee0..0c8aea148dc 100644 |
||||
--- a/gcc/config/darwin.c |
||||
+++ b/gcc/config/darwin.c |
||||
@@ -128,7 +128,7 @@ int emit_aligned_common = false; |
||||
DIRECTIVE is as for output_section_asm_op. */ |
||||
|
||||
static void |
||||
-output_objc_section_asm_op (const void *directive) |
||||
+output_objc_section_asm_op (const char *directive) |
||||
{ |
||||
static bool been_here = false; |
||||
|
||||
diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c |
||||
index 341c5f0d765..8ac9c4b3a44 100644 |
||||
--- a/gcc/config/pa/pa.c |
||||
+++ b/gcc/config/pa/pa.c |
||||
@@ -10011,7 +10011,7 @@ pa_arg_partial_bytes (cumulative_args_t cum_v, const function_arg_info &arg) |
||||
to the default text subspace. */ |
||||
|
||||
static void |
||||
-som_output_text_section_asm_op (const void *data ATTRIBUTE_UNUSED) |
||||
+som_output_text_section_asm_op (const char *data ATTRIBUTE_UNUSED) |
||||
{ |
||||
gcc_assert (TARGET_SOM); |
||||
if (TARGET_GAS) |
||||
@@ -10055,7 +10055,7 @@ som_output_text_section_asm_op (const void *data ATTRIBUTE_UNUSED) |
||||
sections. This function is only used with SOM. */ |
||||
|
||||
static void |
||||
-som_output_comdat_data_section_asm_op (const void *data) |
||||
+som_output_comdat_data_section_asm_op (const char *data) |
||||
{ |
||||
in_section = NULL; |
||||
output_section_asm_op (data); |
||||
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c |
||||
index 9b1c3a8b5ea..fa245a8714c 100644 |
||||
--- a/gcc/config/rs6000/rs6000.c |
||||
+++ b/gcc/config/rs6000/rs6000.c |
||||
@@ -20232,7 +20232,7 @@ rs6000_ms_bitfield_layout_p (const_tree record_type) |
||||
/* A get_unnamed_section callback, used for switching to toc_section. */ |
||||
|
||||
static void |
||||
-rs6000_elf_output_toc_section_asm_op (const void *data ATTRIBUTE_UNUSED) |
||||
+rs6000_elf_output_toc_section_asm_op (const char *data ATTRIBUTE_UNUSED) |
||||
{ |
||||
if ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2) |
||||
&& TARGET_MINIMAL_TOC) |
||||
@@ -20936,35 +20936,39 @@ rs6000_xcoff_asm_globalize_label (FILE *stream, const char *name) |
||||
points to the section string variable. */ |
||||
|
||||
static void |
||||
-rs6000_xcoff_output_readonly_section_asm_op (const void *directive) |
||||
+rs6000_xcoff_output_readonly_section_asm_op (const char *directive) |
||||
{ |
||||
fprintf (asm_out_file, "\t.csect %s[RO],%s\n", |
||||
- *(const char *const *) directive, |
||||
+ directive |
||||
+ ? xcoff_private_rodata_section_name |
||||
+ : xcoff_read_only_section_name, |
||||
XCOFF_CSECT_DEFAULT_ALIGNMENT_STR); |
||||
} |
||||
|
||||
/* Likewise for read-write sections. */ |
||||
|
||||
static void |
||||
-rs6000_xcoff_output_readwrite_section_asm_op (const void *directive) |
||||
+rs6000_xcoff_output_readwrite_section_asm_op (const char *) |
||||
{ |
||||
fprintf (asm_out_file, "\t.csect %s[RW],%s\n", |
||||
- *(const char *const *) directive, |
||||
+ xcoff_private_data_section_name, |
||||
XCOFF_CSECT_DEFAULT_ALIGNMENT_STR); |
||||
} |
||||
|
||||
static void |
||||
-rs6000_xcoff_output_tls_section_asm_op (const void *directive) |
||||
+rs6000_xcoff_output_tls_section_asm_op (const char *directive) |
||||
{ |
||||
fprintf (asm_out_file, "\t.csect %s[TL],%s\n", |
||||
- *(const char *const *) directive, |
||||
+ directive |
||||
+ ? xcoff_private_data_section_name |
||||
+ : xcoff_tls_data_section_name, |
||||
XCOFF_CSECT_DEFAULT_ALIGNMENT_STR); |
||||
} |
||||
|
||||
/* A get_unnamed_section callback, used for switching to toc_section. */ |
||||
|
||||
static void |
||||
-rs6000_xcoff_output_toc_section_asm_op (const void *data ATTRIBUTE_UNUSED) |
||||
+rs6000_xcoff_output_toc_section_asm_op (const char *data ATTRIBUTE_UNUSED) |
||||
{ |
||||
if (TARGET_MINIMAL_TOC) |
||||
{ |
||||
@@ -20991,26 +20995,26 @@ rs6000_xcoff_asm_init_sections (void) |
||||
{ |
||||
read_only_data_section |
||||
= get_unnamed_section (0, rs6000_xcoff_output_readonly_section_asm_op, |
||||
- &xcoff_read_only_section_name); |
||||
+ NULL); |
||||
|
||||
private_data_section |
||||
= get_unnamed_section (SECTION_WRITE, |
||||
rs6000_xcoff_output_readwrite_section_asm_op, |
||||
- &xcoff_private_data_section_name); |
||||
+ NULL); |
||||
|
||||
read_only_private_data_section |
||||
= get_unnamed_section (0, rs6000_xcoff_output_readonly_section_asm_op, |
||||
- &xcoff_private_rodata_section_name); |
||||
+ ""); |
||||
|
||||
tls_data_section |
||||
= get_unnamed_section (SECTION_TLS, |
||||
rs6000_xcoff_output_tls_section_asm_op, |
||||
- &xcoff_tls_data_section_name); |
||||
+ NULL); |
||||
|
||||
tls_private_data_section |
||||
= get_unnamed_section (SECTION_TLS, |
||||
rs6000_xcoff_output_tls_section_asm_op, |
||||
- &xcoff_private_data_section_name); |
||||
+ ""); |
||||
|
||||
toc_section |
||||
= get_unnamed_section (0, rs6000_xcoff_output_toc_section_asm_op, NULL); |
||||
diff --git a/gcc/doc/gty.texi b/gcc/doc/gty.texi |
||||
index aaf97ae9ad5..0154bd86fe9 100644 |
||||
--- a/gcc/doc/gty.texi |
||||
+++ b/gcc/doc/gty.texi |
||||
@@ -197,6 +197,15 @@ If @code{skip} is applied to a field, the type machinery will ignore it. |
||||
This is somewhat dangerous; the only safe use is in a union when one |
||||
field really isn't ever used. |
||||
|
||||
+@findex callback |
||||
+@item callback |
||||
+ |
||||
+@code{callback} should be applied to fields with pointer to function type |
||||
+and causes the field to be ignored similarly to @code{skip}, except when |
||||
+writing PCH and the field is non-NULL it will remember the field's address |
||||
+for relocation purposes if the process writing PCH has different load base |
||||
+from a process reading PCH. |
||||
+ |
||||
@findex for_user |
||||
@item for_user |
||||
|
||||
diff --git a/gcc/gengtype-state.c b/gcc/gengtype-state.c |
||||
index 891f2e18a61..fb99729bc0e 100644 |
||||
--- a/gcc/gengtype-state.c |
||||
+++ b/gcc/gengtype-state.c |
||||
@@ -57,6 +57,7 @@ type_lineloc (const_type_p ty) |
||||
case TYPE_STRING: |
||||
case TYPE_POINTER: |
||||
case TYPE_ARRAY: |
||||
+ case TYPE_CALLBACK: |
||||
return NULL; |
||||
default: |
||||
gcc_unreachable (); |
||||
@@ -171,6 +172,7 @@ private: |
||||
void write_state_version (const char *version); |
||||
void write_state_scalar_type (type_p current); |
||||
void write_state_string_type (type_p current); |
||||
+ void write_state_callback_type (type_p current); |
||||
void write_state_undefined_type (type_p current); |
||||
void write_state_struct_union_type (type_p current, const char *kindstr); |
||||
void write_state_struct_type (type_p current); |
||||
@@ -898,6 +900,20 @@ state_writer::write_state_string_type (type_p current) |
||||
fatal ("Unexpected type in write_state_string_type"); |
||||
} |
||||
|
||||
+/* Write the callback type. There is only one such thing! */ |
||||
+void |
||||
+state_writer::write_state_callback_type (type_p current) |
||||
+{ |
||||
+ if (current == &callback_type) |
||||
+ { |
||||
+ write_any_indent (0); |
||||
+ fprintf (state_file, "callback "); |
||||
+ write_state_common_type_content (current); |
||||
+ } |
||||
+ else |
||||
+ fatal ("Unexpected type in write_state_callback_type"); |
||||
+} |
||||
+ |
||||
/* Write an undefined type. */ |
||||
void |
||||
state_writer::write_state_undefined_type (type_p current) |
||||
@@ -1143,6 +1159,9 @@ state_writer::write_state_type (type_p current) |
||||
case TYPE_STRING: |
||||
write_state_string_type (current); |
||||
break; |
||||
+ case TYPE_CALLBACK: |
||||
+ write_state_callback_type (current); |
||||
+ break; |
||||
} |
||||
} |
||||
|
||||
@@ -1477,6 +1496,14 @@ read_state_string_type (type_p *type) |
||||
read_state_common_type_content (*type); |
||||
} |
||||
|
||||
+/* Read the callback_type. */ |
||||
+static void |
||||
+read_state_callback_type (type_p *type) |
||||
+{ |
||||
+ *type = &callback_type; |
||||
+ read_state_common_type_content (*type); |
||||
+} |
||||
+ |
||||
|
||||
/* Read a lang_bitmap representing a set of GCC front-end languages. */ |
||||
static void |
||||
@@ -1834,6 +1861,11 @@ read_state_type (type_p *current) |
||||
next_state_tokens (1); |
||||
read_state_string_type (current); |
||||
} |
||||
+ else if (state_token_is_name (t0, "callback")) |
||||
+ { |
||||
+ next_state_tokens (1); |
||||
+ read_state_callback_type (current); |
||||
+ } |
||||
else if (state_token_is_name (t0, "undefined")) |
||||
{ |
||||
*current = XCNEW (struct type); |
||||
diff --git a/gcc/gengtype.c b/gcc/gengtype.c |
||||
index 98d4626f87e..91eacc26932 100644 |
||||
--- a/gcc/gengtype.c |
||||
+++ b/gcc/gengtype.c |
||||
@@ -167,6 +167,7 @@ dbgprint_count_type_at (const char *fil, int lin, const char *msg, type_p t) |
||||
int nb_struct = 0, nb_union = 0, nb_array = 0, nb_pointer = 0; |
||||
int nb_lang_struct = 0; |
||||
int nb_user_struct = 0, nb_undefined = 0; |
||||
+ int nb_callback = 0; |
||||
type_p p = NULL; |
||||
for (p = t; p; p = p->next) |
||||
{ |
||||
@@ -197,6 +198,9 @@ dbgprint_count_type_at (const char *fil, int lin, const char *msg, type_p t) |
||||
case TYPE_ARRAY: |
||||
nb_array++; |
||||
break; |
||||
+ case TYPE_CALLBACK: |
||||
+ nb_callback++; |
||||
+ break; |
||||
case TYPE_LANG_STRUCT: |
||||
nb_lang_struct++; |
||||
break; |
||||
@@ -212,6 +216,8 @@ dbgprint_count_type_at (const char *fil, int lin, const char *msg, type_p t) |
||||
fprintf (stderr, "@@%%@@ %d structs, %d unions\n", nb_struct, nb_union); |
||||
if (nb_pointer > 0 || nb_array > 0) |
||||
fprintf (stderr, "@@%%@@ %d pointers, %d arrays\n", nb_pointer, nb_array); |
||||
+ if (nb_callback > 0) |
||||
+ fprintf (stderr, "@@%%@@ %d callbacks\n", nb_callback); |
||||
if (nb_lang_struct > 0) |
||||
fprintf (stderr, "@@%%@@ %d lang_structs\n", nb_lang_struct); |
||||
if (nb_user_struct > 0) |
||||
@@ -490,6 +496,10 @@ struct type scalar_char = { |
||||
TYPE_SCALAR, 0, 0, 0, GC_USED, {0} |
||||
}; |
||||
|
||||
+struct type callback_type = { |
||||
+ TYPE_CALLBACK, 0, 0, 0, GC_USED, {0} |
||||
+}; |
||||
+ |
||||
/* Lists of various things. */ |
||||
|
||||
pair_p typedefs = NULL; |
||||
@@ -1459,7 +1469,7 @@ static void set_gc_used (pair_p); |
||||
|
||||
static void |
||||
process_gc_options (options_p opt, enum gc_used_enum level, int *maybe_undef, |
||||
- int *length, int *skip, type_p *nested_ptr) |
||||
+ int *length, int *skip, int *callback, type_p *nested_ptr) |
||||
{ |
||||
options_p o; |
||||
for (o = opt; o; o = o->next) |
||||
@@ -1473,6 +1483,8 @@ process_gc_options (options_p opt, enum gc_used_enum level, int *maybe_undef, |
||||
*length = 1; |
||||
else if (strcmp (o->name, "skip") == 0) |
||||
*skip = 1; |
||||
+ else if (strcmp (o->name, "callback") == 0) |
||||
+ *callback = 1; |
||||
else if (strcmp (o->name, "nested_ptr") == 0 |
||||
&& o->kind == OPTION_NESTED) |
||||
*nested_ptr = ((const struct nested_ptr_data *) o->info.nested)->type; |
||||
@@ -1521,7 +1533,7 @@ set_gc_used_type (type_p t, enum gc_used_enum level, |
||||
type_p dummy2; |
||||
bool allow_undefined_field_types = (t->kind == TYPE_USER_STRUCT); |
||||
|
||||
- process_gc_options (t->u.s.opt, level, &dummy, &dummy, &dummy, |
||||
+ process_gc_options (t->u.s.opt, level, &dummy, &dummy, &dummy, &dummy, |
||||
&dummy2); |
||||
|
||||
if (t->u.s.base_class) |
||||
@@ -1537,9 +1549,10 @@ set_gc_used_type (type_p t, enum gc_used_enum level, |
||||
int maybe_undef = 0; |
||||
int length = 0; |
||||
int skip = 0; |
||||
+ int callback = 0; |
||||
type_p nested_ptr = NULL; |
||||
process_gc_options (f->opt, level, &maybe_undef, &length, &skip, |
||||
- &nested_ptr); |
||||
+ &callback, &nested_ptr); |
||||
|
||||
if (nested_ptr && f->type->kind == TYPE_POINTER) |
||||
set_gc_used_type (nested_ptr, GC_POINTED_TO); |
||||
@@ -1549,6 +1562,8 @@ set_gc_used_type (type_p t, enum gc_used_enum level, |
||||
set_gc_used_type (f->type->u.p, GC_MAYBE_POINTED_TO); |
||||
else if (skip) |
||||
; /* target type is not used through this field */ |
||||
+ else if (callback) |
||||
+ f->type = &callback_type; |
||||
else |
||||
set_gc_used_type (f->type, GC_USED, allow_undefined_field_types); |
||||
} |
||||
@@ -2512,6 +2527,7 @@ output_mangled_typename (outf_p of, const_type_p t) |
||||
{ |
||||
case TYPE_NONE: |
||||
case TYPE_UNDEFINED: |
||||
+ case TYPE_CALLBACK: |
||||
gcc_unreachable (); |
||||
break; |
||||
case TYPE_POINTER: |
||||
@@ -2712,6 +2728,8 @@ walk_type (type_p t, struct walk_type_data *d) |
||||
; |
||||
else if (strcmp (oo->name, "for_user") == 0) |
||||
; |
||||
+ else if (strcmp (oo->name, "callback") == 0) |
||||
+ ; |
||||
else |
||||
error_at_line (d->line, "unknown option `%s'\n", oo->name); |
||||
|
||||
@@ -2737,6 +2755,7 @@ walk_type (type_p t, struct walk_type_data *d) |
||||
{ |
||||
case TYPE_SCALAR: |
||||
case TYPE_STRING: |
||||
+ case TYPE_CALLBACK: |
||||
d->process_field (t, d); |
||||
break; |
||||
|
||||
@@ -3268,6 +3287,7 @@ write_types_process_field (type_p f, const struct walk_type_data *d) |
||||
break; |
||||
|
||||
case TYPE_SCALAR: |
||||
+ case TYPE_CALLBACK: |
||||
break; |
||||
|
||||
case TYPE_ARRAY: |
||||
@@ -3813,6 +3833,7 @@ write_types_local_user_process_field (type_p f, const struct walk_type_data *d) |
||||
break; |
||||
|
||||
case TYPE_SCALAR: |
||||
+ case TYPE_CALLBACK: |
||||
break; |
||||
|
||||
case TYPE_ARRAY: |
||||
@@ -3899,6 +3920,13 @@ write_types_local_process_field (type_p f, const struct walk_type_data *d) |
||||
case TYPE_SCALAR: |
||||
break; |
||||
|
||||
+ case TYPE_CALLBACK: |
||||
+ oprintf (d->of, "%*sif ((void *)(%s) == this_obj)\n", d->indent, "", |
||||
+ d->prev_val[3]); |
||||
+ oprintf (d->of, "%*s gt_pch_note_callback (&(%s), this_obj);\n", |
||||
+ d->indent, "", d->val); |
||||
+ break; |
||||
+ |
||||
case TYPE_ARRAY: |
||||
case TYPE_NONE: |
||||
case TYPE_UNDEFINED: |
||||
@@ -4427,6 +4455,7 @@ write_root (outf_p f, pair_p v, type_p type, const char *name, int has_length, |
||||
case TYPE_UNDEFINED: |
||||
case TYPE_UNION: |
||||
case TYPE_LANG_STRUCT: |
||||
+ case TYPE_CALLBACK: |
||||
error_at_line (line, "global `%s' is unimplemented type", name); |
||||
} |
||||
} |
||||
@@ -4721,6 +4750,9 @@ dump_typekind (int indent, enum typekind kind) |
||||
case TYPE_ARRAY: |
||||
printf ("TYPE_ARRAY"); |
||||
break; |
||||
+ case TYPE_CALLBACK: |
||||
+ printf ("TYPE_CALLBACK"); |
||||
+ break; |
||||
case TYPE_LANG_STRUCT: |
||||
printf ("TYPE_LANG_STRUCT"); |
||||
break; |
||||
@@ -4887,6 +4919,7 @@ dump_type (int indent, type_p t) |
||||
t->u.scalar_is_char ? "true" : "false"); |
||||
break; |
||||
case TYPE_STRING: |
||||
+ case TYPE_CALLBACK: |
||||
break; |
||||
case TYPE_STRUCT: |
||||
case TYPE_UNION: |
||||
diff --git a/gcc/gengtype.h b/gcc/gengtype.h |
||||
index 4fe8f0f7232..c32faba2995 100644 |
||||
--- a/gcc/gengtype.h |
||||
+++ b/gcc/gengtype.h |
||||
@@ -149,6 +149,9 @@ enum typekind { |
||||
TYPE_UNION, /* Type for GTY-ed discriminated unions. */ |
||||
TYPE_POINTER, /* Pointer type to GTY-ed type. */ |
||||
TYPE_ARRAY, /* Array of GTY-ed types. */ |
||||
+ TYPE_CALLBACK, /* A function pointer that needs relocation if |
||||
+ the executable has been loaded at a different |
||||
+ address. */ |
||||
TYPE_LANG_STRUCT, /* GCC front-end language specific structs. |
||||
Various languages may have homonymous but |
||||
different structs. */ |
||||
@@ -326,6 +329,9 @@ extern struct type string_type; |
||||
extern struct type scalar_nonchar; |
||||
extern struct type scalar_char; |
||||
|
||||
+/* The one and only TYPE_CALLBACK. */ |
||||
+extern struct type callback_type; |
||||
+ |
||||
/* Test if a type is a union, either a plain one or a language |
||||
specific one. */ |
||||
#define UNION_P(x) \ |
||||
diff --git a/gcc/ggc-common.c b/gcc/ggc-common.c |
||||
index 357bda13f97..88e1af4ba4a 100644 |
||||
--- a/gcc/ggc-common.c |
||||
+++ b/gcc/ggc-common.c |
||||
@@ -249,6 +249,7 @@ saving_hasher::equal (const ptr_data *p1, const void *p2) |
||||
} |
||||
|
||||
static hash_table<saving_hasher> *saving_htab; |
||||
+static vec<void *> callback_vec; |
||||
|
||||
/* Register an object in the hash table. */ |
||||
|
||||
@@ -281,6 +282,23 @@ gt_pch_note_object (void *obj, void *note_ptr_cookie, |
||||
return 1; |
||||
} |
||||
|
||||
+/* Register address of a callback pointer. */ |
||||
+void |
||||
+gt_pch_note_callback (void *obj, void *base) |
||||
+{ |
||||
+ void *ptr; |
||||
+ memcpy (&ptr, obj, sizeof (void *)); |
||||
+ if (ptr != NULL) |
||||
+ { |
||||
+ struct ptr_data *data |
||||
+ = (struct ptr_data *) |
||||
+ saving_htab->find_with_hash (base, POINTER_HASH (base)); |
||||
+ gcc_assert (data); |
||||
+ callback_vec.safe_push ((char *) data->new_addr |
||||
+ + ((char *) obj - (char *) base)); |
||||
+ } |
||||
+} |
||||
+ |
||||
/* Register an object in the hash table. */ |
||||
|
||||
void |
||||
@@ -443,6 +461,10 @@ gt_pch_save (FILE *f) |
||||
(The extra work goes in HOST_HOOKS_GT_PCH_GET_ADDRESS and |
||||
HOST_HOOKS_GT_PCH_USE_ADDRESS.) */ |
||||
mmi.preferred_base = host_hooks.gt_pch_get_address (mmi.size, fileno (f)); |
||||
+ /* If the host cannot supply any suitable address for this, we are stuck. */ |
||||
+ if (mmi.preferred_base == NULL) |
||||
+ fatal_error (input_location, |
||||
+ "cannot write PCH file: required memory segment unavailable"); |
||||
|
||||
ggc_pch_this_base (state.d, mmi.preferred_base); |
||||
|
||||
@@ -575,10 +597,20 @@ gt_pch_save (FILE *f) |
||||
ggc_pch_finish (state.d, state.f); |
||||
gt_pch_fixup_stringpool (); |
||||
|
||||
+ unsigned num_callbacks = callback_vec.length (); |
||||
+ void (*pch_save) (FILE *) = >_pch_save; |
||||
+ if (fwrite (&pch_save, sizeof (pch_save), 1, f) != 1 |
||||
+ || fwrite (&num_callbacks, sizeof (num_callbacks), 1, f) != 1 |
||||
+ || (num_callbacks |
||||
+ && fwrite (callback_vec.address (), sizeof (void *), num_callbacks, |
||||
+ f) != num_callbacks)) |
||||
+ fatal_error (input_location, "cannot write PCH file: %m"); |
||||
+ |
||||
XDELETE (state.ptrs); |
||||
XDELETE (this_object); |
||||
delete saving_htab; |
||||
saving_htab = NULL; |
||||
+ callback_vec.release (); |
||||
} |
||||
|
||||
/* Read the state of the compiler back in from F. */ |
||||
@@ -592,6 +624,13 @@ gt_pch_restore (FILE *f) |
||||
struct mmap_info mmi; |
||||
int result; |
||||
|
||||
+ /* We are about to reload the line maps along with the rest of the PCH |
||||
+ data, which means that the (loaded) ones cannot be guaranteed to be |
||||
+ in any valid state for reporting diagnostics that happen during the |
||||
+ load. Save the current table (and use it during the loading process |
||||
+ below). */ |
||||
+ class line_maps *save_line_table = line_table; |
||||
+ |
||||
/* Delete any deletable objects. This makes ggc_pch_read much |
||||
faster, as it can be sure that no GCable objects remain other |
||||
than the ones just read in. */ |
||||
@@ -606,20 +645,40 @@ gt_pch_restore (FILE *f) |
||||
fatal_error (input_location, "cannot read PCH file: %m"); |
||||
|
||||
/* Read in all the global pointers, in 6 easy loops. */ |
||||
+ bool error_reading_pointers = false; |
||||
for (rt = gt_ggc_rtab; *rt; rt++) |
||||
for (rti = *rt; rti->base != NULL; rti++) |
||||
for (i = 0; i < rti->nelt; i++) |
||||
if (fread ((char *)rti->base + rti->stride * i, |
||||
sizeof (void *), 1, f) != 1) |
||||
- fatal_error (input_location, "cannot read PCH file: %m"); |
||||
+ error_reading_pointers = true; |
||||
+ |
||||
+ /* Stash the newly read-in line table pointer - it does not point to |
||||
+ anything meaningful yet, so swap the old one back in. */ |
||||
+ class line_maps *new_line_table = line_table; |
||||
+ line_table = save_line_table; |
||||
+ if (error_reading_pointers) |
||||
+ fatal_error (input_location, "cannot read PCH file: %m"); |
||||
|
||||
if (fread (&mmi, sizeof (mmi), 1, f) != 1) |
||||
fatal_error (input_location, "cannot read PCH file: %m"); |
||||
|
||||
result = host_hooks.gt_pch_use_address (mmi.preferred_base, mmi.size, |
||||
fileno (f), mmi.offset); |
||||
+ |
||||
+ /* We could not mmap or otherwise allocate the required memory at the |
||||
+ address needed. */ |
||||
if (result < 0) |
||||
- fatal_error (input_location, "had to relocate PCH"); |
||||
+ { |
||||
+ sorry_at (input_location, "PCH relocation is not yet supported"); |
||||
+ /* There is no point in continuing from here, we will only end up |
||||
+ with a crashed (most likely hanging) compiler. */ |
||||
+ exit (-1); |
||||
+ } |
||||
+ |
||||
+ /* (0) We allocated memory, but did not mmap the file, so we need to read |
||||
+ the data in manually. (>0) Otherwise the mmap succeed for the address |
||||
+ we wanted. */ |
||||
if (result == 0) |
||||
{ |
||||
if (fseek (f, mmi.offset, SEEK_SET) != 0 |
||||
@@ -632,6 +691,34 @@ gt_pch_restore (FILE *f) |
||||
ggc_pch_read (f, mmi.preferred_base); |
||||
|
||||
gt_pch_restore_stringpool (); |
||||
+ |
||||
+ void (*pch_save) (FILE *); |
||||
+ unsigned num_callbacks; |
||||
+ if (fread (&pch_save, sizeof (pch_save), 1, f) != 1 |
||||
+ || fread (&num_callbacks, sizeof (num_callbacks), 1, f) != 1) |
||||
+ fatal_error (input_location, "cannot read PCH file: %m"); |
||||
+ if (pch_save != >_pch_save) |
||||
+ { |
||||
+ uintptr_t bias = (uintptr_t) >_pch_save - (uintptr_t) pch_save; |
||||
+ void **ptrs = XNEWVEC (void *, num_callbacks); |
||||
+ unsigned i; |
||||
+ |
||||
+ if (fread (ptrs, sizeof (void *), num_callbacks, f) != num_callbacks) |
||||
+ fatal_error (input_location, "cannot read PCH file: %m"); |
||||
+ for (i = 0; i < num_callbacks; ++i) |
||||
+ { |
||||
+ memcpy (&pch_save, ptrs[i], sizeof (pch_save)); |
||||
+ pch_save = (void (*) (FILE *)) ((uintptr_t) pch_save + bias); |
||||
+ memcpy (ptrs[i], &pch_save, sizeof (pch_save)); |
||||
+ } |
||||
+ XDELETE (ptrs); |
||||
+ } |
||||
+ else if (fseek (f, num_callbacks * sizeof (void *), SEEK_CUR) != 0) |
||||
+ fatal_error (input_location, "cannot read PCH file: %m"); |
||||
+ |
||||
+ /* Barring corruption of the PCH file, the restored line table should be |
||||
+ complete and usable. */ |
||||
+ line_table = new_line_table; |
||||
} |
||||
|
||||
/* Default version of HOST_HOOKS_GT_PCH_GET_ADDRESS when mmap is not present. |
||||
diff --git a/gcc/ggc.h b/gcc/ggc.h |
||||
index 65f6cb4d19d..3339394b547 100644 |
||||
--- a/gcc/ggc.h |
||||
+++ b/gcc/ggc.h |
||||
@@ -46,6 +46,10 @@ typedef void (*gt_handle_reorder) (void *, void *, gt_pointer_operator, |
||||
/* Used by the gt_pch_n_* routines. Register an object in the hash table. */ |
||||
extern int gt_pch_note_object (void *, void *, gt_note_pointers); |
||||
|
||||
+/* Used by the gt_pch_p_* routines. Register address of a callback |
||||
+ pointer. */ |
||||
+extern void gt_pch_note_callback (void *, void *); |
||||
+ |
||||
/* Used by the gt_pch_n_* routines. Register that an object has a reorder |
||||
function. */ |
||||
extern void gt_pch_note_reorder (void *, void *, gt_handle_reorder); |
||||
diff --git a/gcc/output.h b/gcc/output.h |
||||
index 2bfeed93c56..7412407c2c0 100644 |
||||
--- a/gcc/output.h |
||||
+++ b/gcc/output.h |
||||
@@ -458,7 +458,7 @@ struct GTY(()) named_section { |
||||
|
||||
/* A callback that writes the assembly code for switching to an unnamed |
||||
section. The argument provides callback-specific data. */ |
||||
-typedef void (*unnamed_section_callback) (const void *); |
||||
+typedef void (*unnamed_section_callback) (const char *); |
||||
|
||||
/* Information about a SECTION_UNNAMED section. */ |
||||
struct GTY(()) unnamed_section { |
||||
@@ -466,8 +466,8 @@ struct GTY(()) unnamed_section { |
||||
|
||||
/* The callback used to switch to the section, and the data that |
||||
should be passed to the callback. */ |
||||
- unnamed_section_callback GTY ((skip)) callback; |
||||
- const void *GTY ((skip)) data; |
||||
+ unnamed_section_callback GTY ((callback)) callback; |
||||
+ const char *data; |
||||
|
||||
/* The next entry in the chain of unnamed sections. */ |
||||
section *next; |
||||
@@ -491,7 +491,7 @@ struct GTY(()) noswitch_section { |
||||
struct section_common common; |
||||
|
||||
/* The callback used to assemble decls in this section. */ |
||||
- noswitch_section_callback GTY ((skip)) callback; |
||||
+ noswitch_section_callback GTY ((callback)) callback; |
||||
}; |
||||
|
||||
/* Information about a section, which may be named or unnamed. */ |
||||
@@ -526,8 +526,8 @@ extern GTY(()) section *bss_noswitch_section; |
||||
extern GTY(()) section *in_section; |
||||
extern GTY(()) bool in_cold_section_p; |
||||
|
||||
-extern section *get_unnamed_section (unsigned int, void (*) (const void *), |
||||
- const void *); |
||||
+extern section *get_unnamed_section (unsigned int, void (*) (const char *), |
||||
+ const char *); |
||||
extern section *get_section (const char *, unsigned int, tree, |
||||
bool not_existing = false); |
||||
extern section *get_named_section (tree, const char *, int); |
||||
@@ -549,7 +549,7 @@ extern section *get_cdtor_priority_section (int, bool); |
||||
|
||||
extern bool unlikely_text_section_p (section *); |
||||
extern void switch_to_section (section *, tree = nullptr); |
||||
-extern void output_section_asm_op (const void *); |
||||
+extern void output_section_asm_op (const char *); |
||||
|
||||
extern void record_tm_clone_pair (tree, tree); |
||||
extern void finish_tm_clone_pairs (void); |
||||
diff --git a/gcc/tree-core.h b/gcc/tree-core.h |
||||
index c31b8ebf249..e2fd2e67440 100644 |
||||
--- a/gcc/tree-core.h |
||||
+++ b/gcc/tree-core.h |
||||
@@ -1927,7 +1927,7 @@ struct GTY(()) tree_function_decl { |
||||
struct GTY(()) tree_translation_unit_decl { |
||||
struct tree_decl_common common; |
||||
/* Source language of this translation unit. Used for DWARF output. */ |
||||
- const char * GTY((skip(""))) language; |
||||
+ const char *language; |
||||
/* TODO: Non-optimization used to build this translation unit. */ |
||||
/* TODO: Root of a partial DWARF tree for global types and decls. */ |
||||
}; |
||||
diff --git a/gcc/varasm.c b/gcc/varasm.c |
||||
index a7ef9b8d9fe..baf9f1ba0e4 100644 |
||||
--- a/gcc/varasm.c |
||||
+++ b/gcc/varasm.c |
||||
@@ -250,8 +250,8 @@ object_block_hasher::hash (object_block *old) |
||||
/* Return a new unnamed section with the given fields. */ |
||||
|
||||
section * |
||||
-get_unnamed_section (unsigned int flags, void (*callback) (const void *), |
||||
- const void *data) |
||||
+get_unnamed_section (unsigned int flags, void (*callback) (const char *), |
||||
+ const char *data) |
||||
{ |
||||
section *sect; |
||||
|
||||
@@ -7753,9 +7753,9 @@ file_end_indicate_split_stack (void) |
||||
a get_unnamed_section callback. */ |
||||
|
||||
void |
||||
-output_section_asm_op (const void *directive) |
||||
+output_section_asm_op (const char *directive) |
||||
{ |
||||
- fprintf (asm_out_file, "%s\n", (const char *) directive); |
||||
+ fprintf (asm_out_file, "%s\n", directive); |
||||
} |
||||
|
||||
/* Emit assembly code to switch to section NEW_SECTION. Do nothing if |
||||
diff --git a/libcpp/include/line-map.h b/libcpp/include/line-map.h |
||||
index 7d964172469..1073542681d 100644 |
||||
--- a/libcpp/include/line-map.h |
||||
+++ b/libcpp/include/line-map.h |
||||
@@ -803,11 +803,11 @@ public: |
||||
unsigned int max_column_hint; |
||||
|
||||
/* The allocator to use when resizing 'maps', defaults to xrealloc. */ |
||||
- line_map_realloc reallocator; |
||||
+ line_map_realloc GTY((callback)) reallocator; |
||||
|
||||
/* The allocators' function used to know the actual size it |
||||
allocated, for a certain allocation size requested. */ |
||||
- line_map_round_alloc_size_func round_alloc_size; |
||||
+ line_map_round_alloc_size_func GTY((callback)) round_alloc_size; |
||||
|
||||
struct location_adhoc_data_map location_adhoc_data_map; |
||||
|
@ -0,0 +1,30 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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" } */ |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in new issue