aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam James <sam@gentoo.org>2023-04-29 08:05:34 +0100
committerSam James <sam@gentoo.org>2023-04-29 08:05:34 +0100
commit31cd33e8455cdedff3ce9182a67a8330e743a5fb (patch)
tree202bbbf5b324a274ddbef9cc90d522d933f0cef5
parent12.3.0: add (diff)
downloadgcc-patches-31cd33e8455cdedff3ce9182a67a8330e743a5fb.tar.gz
gcc-patches-31cd33e8455cdedff3ce9182a67a8330e743a5fb.tar.bz2
gcc-patches-31cd33e8455cdedff3ce9182a67a8330e743a5fb.zip
12.3.0: add 76_all_all_PR107087_12_Wstringop-overread-libstdc++-cow-empty.patch
Actually backport the patch. I'd got confused because one of our previous patches had been backported and I assumed it was this one. Oops. Signed-off-by: Sam James <sam@gentoo.org>
-rw-r--r--12.3.0/gentoo/76_all_all_PR107087_12_Wstringop-overread-libstdc++-cow-empty.patch63
-rw-r--r--12.3.0/gentoo/README.history3
2 files changed, 66 insertions, 0 deletions
diff --git a/12.3.0/gentoo/76_all_all_PR107087_12_Wstringop-overread-libstdc++-cow-empty.patch b/12.3.0/gentoo/76_all_all_PR107087_12_Wstringop-overread-libstdc++-cow-empty.patch
new file mode 100644
index 0000000..15241fe
--- /dev/null
+++ b/12.3.0/gentoo/76_all_all_PR107087_12_Wstringop-overread-libstdc++-cow-empty.patch
@@ -0,0 +1,63 @@
+https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107087
+https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=4969dcd2b7a94ce6c0d07225b21b5f3c040a4902
+
+From 4969dcd2b7a94ce6c0d07225b21b5f3c040a4902 Mon Sep 17 00:00:00 2001
+From: Jonathan Wakely <jwakely@redhat.com>
+Date: Fri, 31 Mar 2023 13:44:04 +0100
+Subject: [PATCH] libstdc++: Teach optimizer that empty COW strings are empty
+ [PR107087]
+
+The compiler doesn't know about the invariant that the _S_empty_rep()
+object is immutable and so _M_length and _M_refcount are always zero.
+This means that we get warnings about writing possibly-non-zero length
+strings into buffers that can't hold them. If we teach the compiler that
+the empty rep is always zero length, it knows it can be copied into any
+buffer.
+
+For Stage 1 we might want to also consider adding this to capacity():
+
+ if (_S_empty_rep()._M_capacity != 0)
+ __builtin_unreachable();
+
+And this to _Rep::_M_is_leaked() and _Rep::_M_is_shared():
+
+ if (_S_empty_rep()._M_refcount != 0)
+ __builtin_unreachable();
+
+libstdc++-v3/ChangeLog:
+
+ PR tree-optimization/107087
+ * include/bits/cow_string.h (basic_string::size()): Add
+ optimizer hint that _S_empty_rep()._M_length is always zero.
+ (basic_string::length()): Call size().
+--- a/libstdc++-v3/include/bits/cow_string.h
++++ b/libstdc++-v3/include/bits/cow_string.h
+@@ -907,17 +907,24 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
+
+ public:
+ // Capacity:
++
+ /// Returns the number of characters in the string, not including any
+ /// null-termination.
+ size_type
+ size() const _GLIBCXX_NOEXCEPT
+- { return _M_rep()->_M_length; }
++ {
++#if _GLIBCXX_FULLY_DYNAMIC_STRING == 0 && __OPTIMIZE__
++ if (_S_empty_rep()._M_length != 0)
++ __builtin_unreachable();
++#endif
++ return _M_rep()->_M_length;
++ }
+
+ /// Returns the number of characters in the string, not including any
+ /// null-termination.
+ size_type
+ length() const _GLIBCXX_NOEXCEPT
+- { return _M_rep()->_M_length; }
++ { return size(); }
+
+ /// Returns the size() of the largest possible %string.
+ size_type
+--
+2.31.1
diff --git a/12.3.0/gentoo/README.history b/12.3.0/gentoo/README.history
index 156935c..f65edb4 100644
--- a/12.3.0/gentoo/README.history
+++ b/12.3.0/gentoo/README.history
@@ -1,3 +1,6 @@
+2 29 Apr 2023
+ + 76_all_all_PR107087_12_Wstringop-overread-libstdc++-cow-empty.patch
+
1 28 Apr 2023
+ 01_all_default-fortify-source.patch