commit:     31cd33e8455cdedff3ce9182a67a8330e743a5fb
Author:     Sam James <sam <AT> gentoo <DOT> org>
AuthorDate: Sat Apr 29 07:05:34 2023 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Sat Apr 29 07:05:34 2023 +0000
URL:        https://gitweb.gentoo.org/proj/gcc-patches.git/commit/?id=31cd33e8

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 <AT> gentoo.org>

 ...12_Wstringop-overread-libstdc++-cow-empty.patch | 63 ++++++++++++++++++++++
 12.3.0/gentoo/README.history                       |  3 ++
 2 files changed, 66 insertions(+)

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 <jwak...@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

Reply via email to