diff --git a/.gcc.metadata b/.gcc.metadata index 68a6e2e..4f649ba 100644 --- a/.gcc.metadata +++ b/.gcc.metadata @@ -1,4 +1,4 @@ -c4e8551566b16e8189657d1cb7739b477ee7af6a SOURCES/gcc-11.2.1-20211019.tar.xz +54f8e112180f2cad6cf9459aab4681c7f157aca9 SOURCES/gcc-11.2.1-20220127.tar.xz bbffc5a2b05e4f0c97e882f96c448504491dc4ed SOURCES/isl-0.18.tar.bz2 6ec33952e824e837fef0e829c93d39d6a507082f SOURCES/newlib-cygwin-50e2a63b04bdd018484605fbb954fd1bd5147fa0.tar.xz 0e0c6f8d68ab0878f02287ac082c1077c831cd81 SOURCES/nvptx-tools-5f6f343a302d620b0868edab376c00b15741e39e.tar.xz diff --git a/.gitignore b/.gitignore index 88a989a..316ddb7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -SOURCES/gcc-11.2.1-20211019.tar.xz +SOURCES/gcc-11.2.1-20220127.tar.xz SOURCES/isl-0.18.tar.bz2 SOURCES/newlib-cygwin-50e2a63b04bdd018484605fbb954fd1bd5147fa0.tar.xz SOURCES/nvptx-tools-5f6f343a302d620b0868edab376c00b15741e39e.tar.xz diff --git a/SOURCES/gcc11-bind-now.patch b/SOURCES/gcc11-bind-now.patch new file mode 100644 index 0000000..8710490 --- /dev/null +++ b/SOURCES/gcc11-bind-now.patch @@ -0,0 +1,333 @@ +From 36362544fb039599c0eb58d839e90ffb5410ad27 Mon Sep 17 00:00:00 2001 +From: Marek Polacek +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 + diff --git a/SOURCES/gcc11-dejagnu-multiline.patch b/SOURCES/gcc11-dejagnu-multiline.patch new file mode 100644 index 0000000..12a702b --- /dev/null +++ b/SOURCES/gcc11-dejagnu-multiline.patch @@ -0,0 +1,32 @@ +commit 14c7757e9b751781360737f53b71f851fc356d3d +Author: Jeff Law +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" diff --git a/SOURCES/gcc11-dg-ice-fixes.patch b/SOURCES/gcc11-dg-ice-fixes.patch new file mode 100644 index 0000000..33d0bc4 --- /dev/null +++ b/SOURCES/gcc11-dg-ice-fixes.patch @@ -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 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 struct A { +diff --git a/gcc/testsuite/g++.dg/cpp1y/auto-fn61.C b/gcc/testsuite/g++.dg/cpp1y/auto-fn61.C +index bed5ea0cfc0..cb235bf891a 100644 +--- a/gcc/testsuite/g++.dg/cpp1y/auto-fn61.C ++++ b/gcc/testsuite/g++.dg/cpp1y/auto-fn61.C +@@ -1,6 +1,6 @@ + // PR c++/88003 + // { dg-do compile { target c++14 } } +-// { dg-additional-options "-fchecking" } ++// { dg-additional-options "-fchecking -fno-report-bug" } + // { dg-ice "poplevel_class" } + + auto test() { +diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda26.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda26.C +index 0cdb400d21c..8f17cca31dd 100644 +--- a/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda26.C ++++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda26.C +@@ -1,6 +1,6 @@ + // PR c++/87765 + // { dg-do compile { target c++17 } } +-// { dg-additional-options "-fchecking" } ++// { dg-additional-options "-fchecking -fno-report-bug" } + // { dg-ice "cxx_eval_constant_expression" } + + template +diff --git a/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" } diff --git a/SOURCES/gcc11-libsanitizer-pthread.patch b/SOURCES/gcc11-libsanitizer-pthread.patch new file mode 100644 index 0000000..fc88d9e --- /dev/null +++ b/SOURCES/gcc11-libsanitizer-pthread.patch @@ -0,0 +1,54 @@ +Backported from LLVM upstream: + +commit ef14b78d9a144ba81ba02083fe21eb286a88732b +Author: Florian Weimer +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( ++ dlsym(RTLD_DEFAULT, "_thread_db_sizeof_pthread"))) ++ val = *psizeof; ++ if (!val) ++ val = ThreadDescriptorSizeFallback(); ++ atomic_store_relaxed(&thread_descriptor_size, val); + return val; + } + diff --git a/SOURCES/gcc11-pie.patch b/SOURCES/gcc11-pie.patch new file mode 100644 index 0000000..36ae11b --- /dev/null +++ b/SOURCES/gcc11-pie.patch @@ -0,0 +1,886 @@ +From 088d8e322811394203220663c3b9c925980d57a2 Mon Sep 17 00:00:00 2001 +From: Marek Polacek +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 + diff --git a/SOURCES/gcc11-pr102642.patch b/SOURCES/gcc11-pr102642.patch deleted file mode 100644 index 598794b..0000000 --- a/SOURCES/gcc11-pr102642.patch +++ /dev/null @@ -1,47 +0,0 @@ -2021-10-11 Jakub Jelinek - - 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" } -+} diff --git a/SOURCES/gcc11-relocatable-pch.patch b/SOURCES/gcc11-relocatable-pch.patch new file mode 100644 index 0000000..16fb965 --- /dev/null +++ b/SOURCES/gcc11-relocatable-pch.patch @@ -0,0 +1,828 @@ +This patch backports support for PCH with PIE from upstream trunk. + +It squashes two commits: + +commit e4641191287ca613529d78a906afe4f029c1c3cd +Author: Iain Sandoe +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 +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_htab; ++static vec 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; + diff --git a/SOURCES/gcc11-stringify-__VA_OPT__-2.patch b/SOURCES/gcc11-stringify-__VA_OPT__-2.patch new file mode 100644 index 0000000..5874bc1 --- /dev/null +++ b/SOURCES/gcc11-stringify-__VA_OPT__-2.patch @@ -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 + + 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 diff --git a/SOURCES/gcc11-stringify-__VA_OPT__.patch b/SOURCES/gcc11-stringify-__VA_OPT__.patch index 3a2a71f..101b026 100644 --- a/SOURCES/gcc11-stringify-__VA_OPT__.patch +++ b/SOURCES/gcc11-stringify-__VA_OPT__.patch @@ -66,7 +66,7 @@ gcc/testsuite/ /* The state variable: 0 means not parsing -@@ -284,7 +294,8 @@ static _cpp_buff *collect_args (cpp_reader *, const cpp_hashnode *, +@@ -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); @@ -76,7 +76,7 @@ gcc/testsuite/ static void paste_all_tokens (cpp_reader *, const cpp_token *); static bool paste_tokens (cpp_reader *, location_t, const cpp_token **, const cpp_token *); -@@ -818,10 +829,11 @@ cpp_quote_string (uchar *dest, const uchar *src, unsigned int len) +@@ -812,10 +823,11 @@ cpp_quote_string (uchar *dest, const uch return dest; } @@ -91,7 +91,7 @@ gcc/testsuite/ { unsigned char *dest; unsigned int i, escape_it, backslash_count = 0; -@@ -834,9 +846,27 @@ stringify_arg (cpp_reader *pfile, macro_arg *arg) +@@ -828,9 +840,27 @@ stringify_arg (cpp_reader *pfile, macro_ *dest++ = '"'; /* Loop, reading in the argument's tokens. */ @@ -121,7 +121,7 @@ gcc/testsuite/ if (token->type == CPP_PADDING) { -@@ -923,7 +953,7 @@ paste_tokens (cpp_reader *pfile, location_t location, +@@ -917,7 +947,7 @@ paste_tokens (cpp_reader *pfile, locatio cpp_token *lhs; unsigned int len; @@ -130,7 +130,7 @@ gcc/testsuite/ buf = (unsigned char *) alloca (len); end = lhsend = cpp_spell_token (pfile, *plhs, buf, true); -@@ -949,8 +979,10 @@ paste_tokens (cpp_reader *pfile, location_t location, +@@ -943,8 +973,10 @@ paste_tokens (cpp_reader *pfile, locatio location_t saved_loc = lhs->src_loc; _cpp_pop_buffer (pfile); @@ -143,7 +143,7 @@ gcc/testsuite/ /* We have to remove the PASTE_LEFT flag from the old lhs, but we want to keep the new location. */ -@@ -962,8 +994,10 @@ paste_tokens (cpp_reader *pfile, location_t 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, @@ -156,7 +156,7 @@ gcc/testsuite/ return false; } -@@ -1039,7 +1073,10 @@ paste_all_tokens (cpp_reader *pfile, const cpp_token *lhs) +@@ -1033,7 +1067,10 @@ paste_all_tokens (cpp_reader *pfile, con abort (); } if (!paste_tokens (pfile, virt_loc, &lhs, rhs)) @@ -168,7 +168,7 @@ gcc/testsuite/ } while (rhs->flags & PASTE_LEFT); -@@ -1906,7 +1943,8 @@ replace_args (cpp_reader *pfile, cpp_hashnode *node, cpp_macro *macro, +@@ -1900,7 +1937,8 @@ replace_args (cpp_reader *pfile, cpp_has if (src->flags & STRINGIFY_ARG) { if (!arg->stringified) @@ -178,11 +178,10 @@ gcc/testsuite/ } else if ((src->flags & PASTE_LEFT) || (src != macro->exp.tokens && (src[-1].flags & PASTE_LEFT))) -@@ -2029,7 +2067,24 @@ replace_args (cpp_reader *pfile, cpp_hashnode *node, cpp_macro *macro, +@@ -2023,6 +2061,24 @@ replace_args (cpp_reader *pfile, cpp_has paste_flag = tokens_buff_last_token_ptr (buff); } -- if (src->flags & PASTE_LEFT) + if (vaopt_tracker.stringify ()) + { + unsigned int count @@ -199,12 +198,12 @@ gcc/testsuite/ + tokens_buff_add_token (buff, virt_locs, + t, t->src_loc, t->src_loc, + NULL, 0); ++ continue; + } -+ else if (src->flags & PASTE_LEFT) - { - /* With a non-empty __VA_OPT__ on the LHS of ##, the last - token should be flagged PASTE_LEFT. */ -@@ -3585,7 +3640,10 @@ create_iso_definition (cpp_reader *pfile) + 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) { diff --git a/SPECS/gcc.spec b/SPECS/gcc.spec index 151b2af..d0683a7 100644 --- a/SPECS/gcc.spec +++ b/SPECS/gcc.spec @@ -1,15 +1,13 @@ -%global DATE 20211019 -%global gitrev 0990a48aaf68b56a3737fdb290328df1da9095cc +%global DATE 20220127 +%global gitrev 2fa6e5c54e782377faa4c9c1f0e0b16db27f266c %global gcc_version 11.2.1 %global gcc_major 11 # Note, gcc_release must be integer, if you want to add suffixes to # %%{release}, append them after %%{gcc_release} on Release: line. -%global gcc_release 6 +%global gcc_release 9 %global nvptx_tools_gitrev 5f6f343a302d620b0868edab376c00b15741e39e %global newlib_cygwin_gitrev 50e2a63b04bdd018484605fbb954fd1bd5147fa0 %global _unpackaged_files_terminate_build 0 -# Hardening slows the compiler way too much. -%undefine _hardened_build %if 0%{?fedora} > 27 || 0%{?rhel} > 7 # Until annobin is fixed (#1519165). %undefine _annotated_build @@ -118,7 +116,7 @@ Summary: Various compilers (C, C++, Objective-C, ...) Name: gcc Version: %{gcc_version} -Release: %{gcc_release}.1%{?dist}.alma +Release: %{gcc_release}.4%{?dist}.alma # libgcc, libgfortran, libgomp, libstdc++ and crtstuff have # GCC Runtime Exception. License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ with exceptions and LGPLv2+ and BSD @@ -268,8 +266,14 @@ Patch12: gcc11-d-shared-libphobos.patch Patch14: gcc11-libgcc-link.patch Patch15: gcc11-pr101786.patch Patch16: gcc11-stringify-__VA_OPT__.patch -Patch17: gcc11-pr102642.patch +Patch17: gcc11-stringify-__VA_OPT__-2.patch Patch18: gcc11-Wbidi-chars.patch +Patch19: gcc11-dg-ice-fixes.patch +Patch20: gcc11-relocatable-pch.patch +Patch21: gcc11-dejagnu-multiline.patch +Patch22: gcc11-libsanitizer-pthread.patch +Patch23: gcc11-pie.patch +Patch24: gcc11-bind-now.patch Patch100: gcc11-fortran-fdec-duplicates.patch Patch101: gcc11-fortran-flogical-as-integer.patch @@ -772,6 +776,25 @@ NVidia PTX. OpenMP and OpenACC programs linked with -fopenmp will by default add PTX code into the binaries, which can be offloaded to NVidia PTX capable devices if available. +%package plugin-annobin +Summary: The annobin plugin for gcc, built by the installed version of gcc +Requires: gcc = %{version}-%{release} +# Starting with release 10.01 annobin fixed a bug in its configure scripts +# which prevented them from working with a built but not installed compiler +BuildRequires: annobin >= 10.01 +# Starting with release 9.93 annobin-plugin-gcc puts a copy of the sources +# in /usr/src/annobin +# FIXME: Currently the annobin-plugin-gcc subpackage only exists in Fedora. +# For RHEL-9 the annobin package does everything. +# BuildRequires: annobin-plugin-gcc +# Needed in order to be able to decompress the annobin source tarball. +BuildRequires: xz + +%description plugin-annobin +This package adds a version of the annobin plugin for gcc. This version +of the plugin is explicitly built by the same version of gcc that is installed +so that there cannot be any synchronization problems. + %prep %setup -q -n gcc-%{version}-%{DATE} -a 1 -a 2 -a 3 %patch0 -p0 -b .hack~ @@ -795,8 +818,14 @@ to NVidia PTX capable devices if available. %patch14 -p0 -b .libgcc-link~ %patch15 -p0 -b .pr101786~ %patch16 -p0 -b .stringify-__VA_OPT__~ -%patch17 -p0 -b .pr102642~ +%patch17 -p0 -b .stringify-__VA_OPT__-2~ %patch18 -p1 -b .bidi~ +%patch19 -p1 -b .ice~ +%patch20 -p1 -b .pch~ +%patch21 -p1 -b .dejagnu-multiline~ +%patch22 -p1 -b .libsanitizer-pthread~ +%patch23 -p1 -b .pie~ +%patch24 -p1 -b .now~ %if 0%{?rhel} >= 9 %patch100 -p1 -b .fortran-fdec-duplicates~ @@ -845,6 +874,11 @@ fi # This test causes fork failures, because it spawns way too many threads rm -f gcc/testsuite/go.test/test/chan/goroutines.go +# This test fails randomly. +%ifarch ppc64le +rm -f libstdc++-v3/testsuite/30_threads/future/members/poll.cc +%endif + %build # Undo the broken autoconf change in recent Fedora versions @@ -879,7 +913,7 @@ cd nvptx-tools-%{nvptx_tools_gitrev} rm -rf obj-%{gcc_target_platform} mkdir obj-%{gcc_target_platform} cd obj-%{gcc_target_platform} -CC="$CC" CXX="$CXX" CFLAGS="%{optflags}" CXXFLAGS="%{optflags}" \ +CC="$CC" CXX="$CXX" CFLAGS="%{optflags} -fPIE" CXXFLAGS="%{optflags} -fPIE" LDFLAGS="-pie -Wl,-z,now" \ ../configure --prefix=%{_prefix} make %{?_smp_mflags} make install prefix=${IROOT}%{_prefix} @@ -901,7 +935,7 @@ CC="$CC" CXX="$CXX" CFLAGS="$OPT_FLAGS" \ --prefix=%{_prefix} --mandir=%{_mandir} --infodir=%{_infodir} \ --with-bugurl=http://bugs.almalinux.org/ \ --enable-checking=release --with-system-zlib \ - --with-gcc-major-version-only --without-isl + --with-gcc-major-version-only --without-isl --enable-host-pie --enable-host-bind-now make %{?_smp_mflags} cd .. rm -f newlib @@ -1098,7 +1132,7 @@ CC="$CC" CXX="$CXX" CFLAGS="$OPT_FLAGS" \ CXXFLAGS="`echo " $OPT_FLAGS " | sed 's/ -Wall / /g;s/ -fexceptions / /g' \ | sed 's/ -Wformat-security / -Wformat -Wformat-security /'`" \ XCFLAGS="$OPT_FLAGS" TCFLAGS="$OPT_FLAGS" \ - ../configure --enable-bootstrap \ + ../configure --enable-bootstrap --enable-host-pie --enable-host-bind-now \ --enable-languages=c,c++,fortran${enablelobjc}${enablelada}${enablelgo}${enableld},lto \ $CONFIGURE_OPTS @@ -1119,7 +1153,7 @@ CC="$CC" CXX="$CXX" CFLAGS="$OPT_FLAGS" \ CXXFLAGS="`echo " $OPT_FLAGS " | sed 's/ -Wall / /g;s/ -fexceptions / /g' \ | sed 's/ -Wformat-security / -Wformat -Wformat-security /'`" \ XCFLAGS="$OPT_FLAGS" TCFLAGS="$OPT_FLAGS" \ - ../../configure --disable-bootstrap --enable-host-shared \ + ../../configure --disable-bootstrap --enable-host-shared --enable-host-bind-now \ --enable-languages=jit $CONFIGURE_OPTS make %{?_smp_mflags} BOOT_CFLAGS="$OPT_FLAGS" all-gcc cp -a gcc/libgccjit.so* ../gcc/ @@ -1205,6 +1239,79 @@ done) rm -f rpm.doc/changelogs/gcc/ChangeLog.[1-9] find rpm.doc -name \*ChangeLog\* | xargs bzip2 -9 +# Get the annobin sources. Note these are not added to the rpm as SOURCE4 +# because if they were the build phase would try to include them as part of +# gcc itself, and this causes problems. Instead we locate the sources in +# the buildroot. They should have been put there when annobin was installed. + +pushd %{_builddir} + +%global annobin_source_dir %{_usrsrc}/annobin + +if [ -d %{annobin_source_dir} ] +then + # Unpack the sources. + echo "Unpacking annobin sources" + rm -fr annobin-* + tar xvf %{annobin_source_dir}/latest-annobin.tar.xz + + # Setting this as a local symbol because using %%global does not appear to work. + annobin_dir=$(find . -maxdepth 1 -type d -name "annobin*") + + # Now build the annobin plugin using the just built compiler. + echo "annobin directory = ${annobin_dir}" + cd ${annobin_dir} + + # Work out where this version of gcc stores its plugins. +%global ANNOBIN_GCC_PLUGIN_DIR %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_major}/plugin + + CONFIG_ARGS="--quiet" + CONFIG_ARGS="$CONFIG_ARGS --with-gcc-plugin-dir=%{ANNOBIN_GCC_PLUGIN_DIR}" + CONFIG_ARGS="$CONFIG_ARGS --without-annocheck" + CONFIG_ARGS="$CONFIG_ARGS --without-tests" + CONFIG_ARGS="$CONFIG_ARGS --disable-rpath" + + comp_dir="%{_builddir}/gcc-%{version}-%{DATE}/obj-%{gcc_target_platform}/gcc/" + ccompiler="%{_builddir}/gcc-%{version}-%{DATE}/obj-%{gcc_target_platform}/gcc/xgcc -B $comp_dir" + cxxcompiler="%{_builddir}/gcc-%{version}-%{DATE}/obj-%{gcc_target_platform}/gcc/xg++ -B $comp_dir" + + comp_flags="%build_cflags" + comp_flags="$comp_flags -I %{_builddir}/gcc-%{version}-%{DATE}/gcc" + comp_flags="$comp_flags -I %{_builddir}/gcc-%{version}-%{DATE}/obj-%{gcc_target_platform}/gcc/" + comp_flags="$comp_flags -I %{_builddir}/gcc-%{version}-%{DATE}/obj-%{gcc_target_platform}/%{gcc_target_platform}/libstdc++-v3/include" + comp_flags="$comp_flags -I %{_builddir}/gcc-%{version}-%{DATE}/obj-%{gcc_target_platform}/%{gcc_target_platform}/libstdc++-v3/include/%{gcc_target_platform}" + comp_flags="$comp_flags -I %{_builddir}/gcc-%{version}-%{DATE}/libstdc++-v3/libsupc++" + comp_flags="$comp_flags -I %{_builddir}/gcc-%{version}-%{DATE}/include" + comp_flags="$comp_flags -I %{_builddir}/gcc-%{version}-%{DATE}/libcpp/include" + + ld_flags="%build_ldflags" + ld_flags="$ld_flags -L%{_builddir}/gcc-%{version}-%{DATE}/obj-%{gcc_target_platform}/libstdc++-v3/.libs" + ld_flags="$ld_flags -L%{_builddir}/gcc-%{version}-%{DATE}/obj-%{gcc_target_platform}/%{gcc_target_platform}/libstdc++-v3/.libs" + ld_flags="$ld_flags -L%{_builddir}/gcc-%{version}-%{DATE}/obj-%{gcc_target_platform}/%{gcc_target_platform}/libstdc++-v3/src/.libs" + ld_flags="$ld_flags -L%{_builddir}/gcc-%{version}-%{DATE}/obj-%{gcc_target_platform}/libstdc++-v3/libsupc++/.libs" + ld_flags="$ld_flags -L%{_builddir}/gcc-%{version}-%{DATE}/obj-%{gcc_target_platform}/%{gcc_target_platform}/libstdc++-v3/libsupc++/.libs" + ld_flags="$ld_flags -L%{_builddir}/gcc-%{version}-%{DATE}/obj-%{gcc_target_platform}/%{gcc_target_platform}/libgcc/.libs" + + # libtool works with CFLAGS but ignores LDFLAGS, so we have to combine them. + comp_flags="$comp_flags $ld_flags" + + echo "Configuring the annobin plugin" + CC="${ccompiler}" CFLAGS="${comp_flags}" \ + CXX="${cxxcompiler}" CXXFLAGS="${comp_flags}" \ + LDFLAGS="${ld_flags}" \ + ./configure ${CONFIG_ARGS} || cat config.log + + echo "Building the annobin plugin" + make + + echo "Annobin plugin build complete" +else + echo "Unable to locate annobin sources (expected to find: %{annobin_source_dir}/latest-annobin.tar.xz)" + echo "These should be provided by installing the annobin package" + exit 1 +fi +popd + %install rm -rf %{buildroot} mkdir -p %{buildroot} @@ -2001,6 +2108,20 @@ echo gcc-%{version}-%{release}.%{_arch} > $FULLPATH/rpmver ln -s ../../libexec/gcc/%{gcc_target_platform}/%{gcc_major}/liblto_plugin.so \ %{buildroot}%{_libdir}/bfd-plugins/ +# Rename the annobin plugin to gcc-annobin. +mkdir -p %{buildroot}%{ANNOBIN_GCC_PLUGIN_DIR} +pushd %{buildroot}%{ANNOBIN_GCC_PLUGIN_DIR} + +annobin_dir=$(find %{_builddir} -maxdepth 1 -type d -name "annobin*") +echo "annobin directory = ${annobin_dir}" + +cp ${annobin_dir}/gcc-plugin/.libs/annobin.so.0.0.0 gcc-annobin.so.0.0.0 + +rm -f gcc-annobin.so.0 gcc-annobin.so +ln -s gcc-annobin.so.0.0.0 gcc-annobin.so.0 +ln -s gcc-annobin.so.0.0.0 gcc-annobin.so +popd + %check cd obj-%{gcc_target_platform} @@ -3144,10 +3265,108 @@ end %{_prefix}/%{_lib}/libgomp-plugin-nvptx.so.* %endif +%files plugin-annobin +%{ANNOBIN_GCC_PLUGIN_DIR}/gcc-annobin.so +%{ANNOBIN_GCC_PLUGIN_DIR}/gcc-annobin.so.0 +%{ANNOBIN_GCC_PLUGIN_DIR}/gcc-annobin.so.0.0.0 + %changelog -* Mon Jan 17 2022 Eduard Abdullin 11.2.1-6.1.alma +* Fri Apr 08 2022 Eduard Abdullin 11.2.1-9.4.alma - Debrand for AlmaLinux +* Thu Feb 10 2022 Marek Polacek 11.2.1-9.4 +- add --enable-host-bind-now, use it (#2044917) + +* Tue Feb 8 2022 Marek Polacek 11.2.1-9.3 +- use _thread_db_sizeof_pthread to obtain struct pthread size (#2034494) +- add --enable-host-pie, build the compilers as PIE (#2044917) + +* Mon Feb 7 2022 Marek Polacek 11.2.1-9.2 +- add support for relocation of the PCH data (pch/71934, #2044917) +- remove 30_threads/future/members/poll.cc (#2050090) +- avoid overly-greedy match in dejagnu regexp (#2050089) + +* Mon Jan 31 2022 Marek Polacek 11.2.1-9.1 +- don't set -Wl,-rpath when building annobin (#2047356) + +* Fri Jan 28 2022 Marek Polacek 11.2.1-9 +- update from releases/gcc-11-branch (#2047296) + - PRs fortran/104127, fortran/104212, fortran/104227, target/101529 +- fix up va-opt-6.c testcase + +* Fri Jan 28 2022 Marek Polacek 11.2.1-8 +- update from releases/gcc-11-branch (#2047296) + - PRs ada/103538, analyzer/101962, bootstrap/103688, c++/85846, c++/95009, + c++/98394, c++/99911, c++/100493, c++/101715, c++/102229, c++/102933, + c++/103012, c++/103198, c++/103480, c++/103703, c++/103714, + c++/103758, c++/103783, c++/103831, c++/103912, c++/104055, c/97548, + c/101289, c/101537, c/103587, c/103881, d/103604, debug/103838, + debug/103874, fortran/67804, fortran/83079, fortran/101329, + fortran/101762, fortran/102332, fortran/102717, fortran/102787, + fortran/103411, fortran/103412, fortran/103418, fortran/103473, + fortran/103505, fortran/103588, fortran/103591, fortran/103606, + fortran/103607, fortran/103609, fortran/103610, fortran/103692, + fortran/103717, fortran/103718, fortran/103719, fortran/103776, + fortran/103777, fortran/103778, fortran/103782, fortran/103789, + ipa/101354, jit/103562, libfortran/103634, libstdc++/100017, + libstdc++/102994, libstdc++/103453, libstdc++/103501, + libstdc++/103549, libstdc++/103877, libstdc++/103919, + middle-end/101751, middle-end/102860, middle-end/103813, objc/103639, + preprocessor/89971, preprocessor/102432, rtl-optimization/102478, + rtl-optimization/103837, rtl-optimization/103860, + rtl-optimization/103908, sanitizer/102911, target/102347, + target/103465, target/103661, target/104172, target/104188, + tree-optimization/101615, tree-optimization/103523, + tree-optimization/103603, tree-optimization/103995 + +* Tue Jan 25 2022 Marek Polacek 11.2.1-7.7 +- do not undefine _hardened_build (#2044917) + +* Mon Jan 24 2022 Marek Polacek 11.2.1-7.6 +- update annobin plugin patch (#2030667) + +* Thu Jan 13 2022 Marek Polacek 11.2.1-7.5 +- update annobin plugin patch (#2030667) + +* Fri Jan 7 2022 Marek Polacek 11.2.1-7.4 +- update annobin plugin patch (#2030667) + +* Tue Jan 4 2022 Marek Polacek 11.2.1-7.3 +- fix dg-ice tests (#1996047) + +* Tue Jan 4 2022 Marek Polacek 11.2.1-7.2 +- update annobin plugin patch (#2030667) + +* Thu Dec 16 2021 Marek Polacek 11.2.1-7.1 +- build annobin plugin (patch by Nick Clifton) (#2030667) + +* Tue Dec 7 2021 Marek Polacek 11.2.1-7 +- update from releases/gcc-11-branch (#1996858) + - PRs ada/100486, c++/70796, c++/92746, c++/93286, c++/94490, c++/102642, + c++/102786, debug/101378, debug/103046, debug/103315, fortran/87711, + fortran/87851, fortran/97896, fortran/99061, fortran/99348, + fortran/102521, fortran/102685, fortran/102715, fortran/102745, + fortran/102816, fortran/102817, fortran/102917, fortran/103137, + fortran/103138, fortran/103392, gcov-profile/100520, ipa/102714, + ipa/102762, ipa/103052, ipa/103246, ipa/103267, libstdc++/96416, + libstdc++/98421, libstdc++/100117, libstdc++/100153, libstdc++/100748, + libstdc++/101571, libstdc++/101608, libstdc++/102894, + libstdc++/103022, libstdc++/103086, libstdc++/103133, + libstdc++/103240, libstdc++/103381, middle-end/64888, + middle-end/101480, middle-end/102431, middle-end/102518, + middle-end/103059, middle-end/103181, middle-end/103248, + middle-end/103384, preprocessor/103130, rtl-optimization/102356, + rtl-optimization/102842, target/101985, target/102976, target/102991, + target/103205, target/103274, target/103275, testsuite/102690, + tree-optimization/100393, tree-optimization/102139, + tree-optimization/102505, tree-optimization/102572, + tree-optimization/102788, tree-optimization/102789, + tree-optimization/102798, tree-optimization/102970, + tree-optimization/103192, tree-optimization/103204, + tree-optimization/103237, tree-optimization/103255, + tree-optimization/103435 +- fix up #__VA_OPT__ handling (PR preprocessor/103415) + * Mon Nov 29 2021 Marek Polacek 11.2.1-6.1 - add -Wbidi-chars patch (#2008393)