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