- Update 11 minor version to match the upstream
- Rename patches dir to reflect new gcc 11 minor version
- Drop upstream patch
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
(cherry picked from commit 4db8466a14
)
lilik-openwrt-22.03
@ -1,114 +0,0 @@ | |||||
From a6219e8e0719b14f474b0dcaa7bde2f4e57474f9 Mon Sep 17 00:00:00 2001 | |||||
From: Jakub Jelinek <jakub@redhat.com> | |||||
Date: Wed, 17 Nov 2021 13:45:53 +0100 | |||||
Subject: [PATCH] ranger: Fix up fold_using_range::range_of_address [PR103255] | |||||
If on &base->member the offset isn't constant or isn't zero and | |||||
-fdelete-null-pointer-checks and not -fwrapv-pointer and base has a range | |||||
that doesn't include NULL, we return the range of the base. | |||||
Usually it isn't a big deal, because for most pointers we just use | |||||
varying, range_zero and range_nonzero ranges and nothing beyond that, | |||||
but if a pointer is initialized from a constant, we actually track the | |||||
exact range and in that case this causes miscompilation. | |||||
As discussed on IRC, I think doing something like: | |||||
offset_int off2; | |||||
if (off_cst && off.is_constant (&off2)) | |||||
{ | |||||
tree cst = wide_int_to_tree (sizetype, off2 / BITS_PER_UNIT); | |||||
// adjust range r with POINTER_PLUS_EXPR cst | |||||
if (!range_includes_zero_p (&r)) | |||||
return true; | |||||
} | |||||
// Fallback | |||||
r = range_nonzero (TREE_TYPE (gimple_assign_rhs1 (stmt))); | |||||
return true; | |||||
could work, given that most of the pointer ranges are just the simple ones | |||||
perhaps it is too much for little benefit. | |||||
2021-11-17 Jakub Jelinek <jakub@redhat.com> | |||||
PR tree-optimization/103255 | |||||
* gimple-range.cc (fold_using_range::range_of_address): Return | |||||
range_nonzero rather than unadjusted base's range. Formatting fixes. | |||||
* gcc.c-torture/execute/pr103255.c: New test. | |||||
(cherry picked from commit c39cb6bf835ca12e590eaa6f90222e51be207c50) | |||||
--- | |||||
gcc/gimple-range.cc | 16 +++++--- | |||||
.../gcc.c-torture/execute/pr103255.c | 41 +++++++++++++++++++ | |||||
2 files changed, 52 insertions(+), 5 deletions(-) | |||||
create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr103255.c | |||||
--- a/gcc/gimple-range.cc | |||||
+++ b/gcc/gimple-range.cc | |||||
@@ -491,14 +491,20 @@ gimple_ranger::range_of_address (irange | |||||
} | |||||
/* If &X->a is equal to X, the range of X is the result. */ | |||||
if (off_cst && known_eq (off, 0)) | |||||
- return true; | |||||
+ return true; | |||||
else if (flag_delete_null_pointer_checks | |||||
&& !TYPE_OVERFLOW_WRAPS (TREE_TYPE (expr))) | |||||
{ | |||||
- /* For -fdelete-null-pointer-checks -fno-wrapv-pointer we don't | |||||
- allow going from non-NULL pointer to NULL. */ | |||||
- if(!range_includes_zero_p (&r)) | |||||
- return true; | |||||
+ /* For -fdelete-null-pointer-checks -fno-wrapv-pointer we don't | |||||
+ allow going from non-NULL pointer to NULL. */ | |||||
+ if (!range_includes_zero_p (&r)) | |||||
+ { | |||||
+ /* We could here instead adjust r by off >> LOG2_BITS_PER_UNIT | |||||
+ using POINTER_PLUS_EXPR if off_cst and just fall back to | |||||
+ this. */ | |||||
+ r = range_nonzero (TREE_TYPE (gimple_assign_rhs1 (stmt))); | |||||
+ return true; | |||||
+ } | |||||
} | |||||
/* If MEM_REF has a "positive" offset, consider it non-NULL | |||||
always, for -fdelete-null-pointer-checks also "negative" | |||||
--- /dev/null | |||||
+++ b/gcc/testsuite/gcc.c-torture/execute/pr103255.c | |||||
@@ -0,0 +1,41 @@ | |||||
+/* PR tree-optimization/103255 */ | |||||
+ | |||||
+struct H | |||||
+{ | |||||
+ unsigned a; | |||||
+ unsigned b; | |||||
+ unsigned c; | |||||
+}; | |||||
+ | |||||
+#if __SIZEOF_POINTER__ >= 4 | |||||
+#define ADDR 0x400000 | |||||
+#else | |||||
+#define ADDR 0x4000 | |||||
+#endif | |||||
+#define OFF 0x20 | |||||
+ | |||||
+int | |||||
+main () | |||||
+{ | |||||
+ struct H *h = 0; | |||||
+ unsigned long o; | |||||
+ volatile int t = 1; | |||||
+ | |||||
+ for (o = OFF; o <= OFF; o += 0x1000) | |||||
+ { | |||||
+ struct H *u; | |||||
+ u = (struct H *) (ADDR + o); | |||||
+ if (t) | |||||
+ { | |||||
+ h = u; | |||||
+ break; | |||||
+ } | |||||
+ } | |||||
+ | |||||
+ if (h == 0) | |||||
+ return 0; | |||||
+ unsigned *tt = &h->b; | |||||
+ if ((__SIZE_TYPE__) tt != (ADDR + OFF + __builtin_offsetof (struct H, b))) | |||||
+ __builtin_abort (); | |||||
+ return 0; | |||||
+} |
@ -1,73 +0,0 @@ | |||||
From: Jonathan Wakely <jwakely@redhat.com> | |||||
Date: Fri, 7 Jan 2022 15:21:03 +0000 (+0000) | |||||
Subject: libstdc++: Add -nostdinc++ for c++17 sources [PR100017] | |||||
X-Git-Tag: releases/gcc-11.3.0~445 | |||||
X-Git-Url: https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff_plain;h=01a70ccd723eb9a479186fe37c972b0d0f8676cf | |||||
libstdc++: Add -nostdinc++ for c++17 sources [PR100017] | |||||
When building a build!=host compiler, the just-built gcc can't be used | |||||
to build the target libstdc++ (because it is built for the host triplet, | |||||
not the build triplet). The top-level configure.ac sets up the build | |||||
flags for libstdc++ (and other "raw_cxx" libs) like this: | |||||
GCC_TARGET_TOOL(c++ for libstdc++, RAW_CXX_FOR_TARGET, CXX, | |||||
[gcc/xgcc -shared-libgcc -B$$r/$(HOST_SUBDIR)/gcc -nostdinc++ -L$$r/$(TARGET_SUBDIR)/libstdc++-v3/src -L$$r/$(TARGET_SUBDIR)/libstdc++-v3/src/.libs -L$$r/$(TARGET_SUBDIR)/libstdc++-v3/libsupc++/.libs], | |||||
c++) | |||||
The -nostdinc++ flag is only used for the IN-TREE-TOOL, i.e. when using | |||||
the just-built gcc/xgcc compiler. This means that the cross-compiler | |||||
used to build libstdc++ will add its own libstdc++ headers to the | |||||
include path. That results in the #include <cfenv> in | |||||
src/c++17/floating_to_chars.cc and src/c++17/floating_from_chars.cc | |||||
doing #include_next <fenv.h> and finding the libstdc++ fenv.h wrapper | |||||
from the host compiler. Because that has the same include guard as the | |||||
<fenv.h> in the libstdc++ we're trying to build, we never reach the | |||||
underlying <fenv.h> from libc. That results in several errors of the | |||||
form: | |||||
error: 'fenv_t' has not been declared in '::' | |||||
The most correct fix would be to add -nostdinc++ to the | |||||
RAW_CXX_FOR_TARGET variable in configure.ac, or the | |||||
RAW_CXX_TARGET_EXPORTS variable in Makefile.tpl. | |||||
Another solution would be to make the libstdc++ <fenv.h> wrapper use | |||||
_GLIBCXX_INCLUDE_NEXT_C_HEADERS like our <stdlib.h> and other C header | |||||
wrappers. | |||||
For now though, the simplest and safest solution is to just add | |||||
-nostdinc++ to the CXXFLAGS used for src/c++17/*.cc, which is what this | |||||
does. | |||||
libstdc++-v3/ChangeLog: | |||||
PR libstdc++/100017 | |||||
* src/c++17/Makefile.am (AM_CXXFLAGS): Add -nostdinc++. | |||||
* src/c++17/Makefile.in: Regenerate. | |||||
(cherry picked from commit 4fde88e5dd152fe866a97b12e0f8229970d15cb3) | |||||
--- | |||||
--- a/libstdc++-v3/src/c++17/Makefile.am | |||||
+++ b/libstdc++-v3/src/c++17/Makefile.am | |||||
@@ -79,7 +79,7 @@ endif | |||||
# OPTIMIZE_CXXFLAGS on the compile line so that -O2 can be overridden | |||||
# as the occasion calls for it. | |||||
AM_CXXFLAGS = \ | |||||
- -std=gnu++17 \ | |||||
+ -std=gnu++17 -nostdinc++ \ | |||||
$(glibcxx_lt_pic_flag) $(glibcxx_compiler_shared_flag) \ | |||||
$(XTEMPLATE_FLAGS) $(VTV_CXXFLAGS) \ | |||||
$(WARN_CXXFLAGS) $(OPTIMIZE_CXXFLAGS) $(CONFIG_CXXFLAGS) \ | |||||
--- a/libstdc++-v3/src/c++17/Makefile.in | |||||
+++ b/libstdc++-v3/src/c++17/Makefile.in | |||||
@@ -455,7 +455,7 @@ libc__17convenience_la_SOURCES = $(sourc | |||||
# OPTIMIZE_CXXFLAGS on the compile line so that -O2 can be overridden | |||||
# as the occasion calls for it. | |||||
AM_CXXFLAGS = \ | |||||
- -std=gnu++17 \ | |||||
+ -std=gnu++17 -nostdinc++ \ | |||||
$(glibcxx_lt_pic_flag) $(glibcxx_compiler_shared_flag) \ | |||||
$(XTEMPLATE_FLAGS) $(VTV_CXXFLAGS) \ | |||||
$(WARN_CXXFLAGS) $(OPTIMIZE_CXXFLAGS) $(CONFIG_CXXFLAGS) \ |