Date: Sat, 25 Apr 2026 14:20:14 +0000 From: Dimitry Andric <dim@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Cc: Dimitry Andric <dimitry@andric.com> Subject: git: 17f1a5e638f8 - main - libcxx-compat: fix llvmorg-21-init-12415-g3a86e0bd29f3: Message-ID: <69eccd9e.38a86.1f918c70@gitrepo.freebsd.org>
index | next in thread | raw e-mail
The branch main has been updated by dim: URL: https://cgit.FreeBSD.org/src/commit/?id=17f1a5e638f845e171ab4e3db2a07bf8c6ac3388 commit 17f1a5e638f845e171ab4e3db2a07bf8c6ac3388 Author: Dimitry Andric <dimitry@andric.com> AuthorDate: 2026-01-05 21:07:58 +0000 Commit: Dimitry Andric <dim@FreeBSD.org> CommitDate: 2026-04-25 14:14:21 +0000 libcxx-compat: fix llvmorg-21-init-12415-g3a86e0bd29f3: [libc++] Optimize std::getline (#121346) ``` ----------------------------------------------- Benchmark old new ----------------------------------------------- BM_getline_string 318 ns 32.4 ns ``` Move the __bump_stream() lamda in <istream> to a separate function, so this will compile with clang 18 and lower, in C++03 mode and earlier. PR: 292067 MFC after: 1 month --- contrib/llvm-project/libcxx/include/istream | 28 ++++++++++++++------------- contrib/llvm-project/libcxx/include/streambuf | 4 ++++ 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/contrib/llvm-project/libcxx/include/istream b/contrib/llvm-project/libcxx/include/istream index 93def61a8b47..61abf3f1c254 100644 --- a/contrib/llvm-project/libcxx/include/istream +++ b/contrib/llvm-project/libcxx/include/istream @@ -1259,6 +1259,18 @@ operator>>(basic_istream<_CharT, _Traits>& __is, basic_string<_CharT, _Traits, _ return __is; } +template <class _CharT, class _Traits> +inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 void __bump_stream( + const _CharT* __first, _CharT& __1buf, std::basic_streambuf<_CharT, _Traits>& __buffer, ptrdiff_t __diff) { + if (__first == std::addressof(__1buf)) { + _LIBCPP_ASSERT_INTERNAL(__diff == 0 || __diff == 1, "trying to bump stream further than buffer size"); + if (__diff != 0) + __buffer.sbumpc(); + } else { + __buffer.__gbump_ptrdiff(__diff); + } +} + template <class _CharT, class _Traits, class _Allocator> _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& getline(basic_istream<_CharT, _Traits>& __is, basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm) { @@ -1285,31 +1297,21 @@ getline(basic_istream<_CharT, _Traits>& __is, basic_string<_CharT, _Traits, _All __last = std::addressof(__1buf) + 1; } - auto __bump_stream = [&](ptrdiff_t __diff) { - if (__first == std::addressof(__1buf)) { - _LIBCPP_ASSERT_INTERNAL(__diff == 0 || __diff == 1, "trying to bump stream further than buffer size"); - if (__diff != 0) - __buffer.sbumpc(); - } else { - __buffer.__gbump_ptrdiff(__diff); - } - }; - const auto* const __match = _Traits::find(__first, __last - __first, __dlm); if (__match) __last = __match; if (auto __cap = __str.max_size() - __str.size(); __cap > static_cast<size_t>(__last - __first)) { __str.append(__first, __last); - __bump_stream(__last - __first); + __bump_stream(__first, __1buf, __buffer, __last - __first); if (__match) { - __bump_stream(1); // Remove the matched character + __bump_stream(__first, __1buf, __buffer, 1); // Remove the matched character break; } } else { __str.append(__first, __cap); - __bump_stream(__cap); + __bump_stream(__first, __1buf, __buffer, __cap); __state |= ios_base::failbit; break; } diff --git a/contrib/llvm-project/libcxx/include/streambuf b/contrib/llvm-project/libcxx/include/streambuf index 585ae7af65aa..bc34ac19131d 100644 --- a/contrib/llvm-project/libcxx/include/streambuf +++ b/contrib/llvm-project/libcxx/include/streambuf @@ -379,6 +379,10 @@ private: char_type* __nout_ = nullptr; char_type* __eout_ = nullptr; + template <class _CharT2, class _Traits2> + _LIBCPP_HIDE_FROM_ABI_AFTER_V1 friend void __bump_stream( + const _CharT2* __first, _CharT2& __1buf, std::basic_streambuf<_CharT2, _Traits2>& __buffer, ptrdiff_t __diff); + template <class _CharT2, class _Traits2, class _Allocator> _LIBCPP_HIDE_FROM_ABI friend basic_istream<_CharT2, _Traits2>& getline(basic_istream<_CharT2, _Traits2>&, basic_string<_CharT2, _Traits2, _Allocator>&, _CharT2);home | help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69eccd9e.38a86.1f918c70>
