[libcxx-commits] [libcxx] [libc++] Remove string external instantiations that just call _Traits::length (PR #160673)
Nikolas Klauser via libcxx-commits
libcxx-commits at lists.llvm.org
Thu Sep 25 02:34:07 PDT 2025
https://github.com/philnik777 created https://github.com/llvm/llvm-project/pull/160673
There are quite a few functions instantiated externally that simply call `traits_type::length` and then forward to another function. These functions should be inlined pretty much always, since these functions are likely to be called with string literals where the compiler can simply fold away the call to `traits_type::length`.
>From 0ec57b5e3ab4e9744ed978065d8773bef18e53b9 Mon Sep 17 00:00:00 2001
From: Nikolas Klauser <nikolasklauser at berlin.de>
Date: Thu, 25 Sep 2025 11:31:53 +0200
Subject: [PATCH] [libc++] Remove string external instantiations that just call
_Traits::length
---
libcxx/include/__string/extern_template_lists.h | 7 -------
libcxx/src/string.cpp | 10 +++++++++-
2 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/libcxx/include/__string/extern_template_lists.h b/libcxx/include/__string/extern_template_lists.h
index 18f0ff9f11bd5..805ee4b7e5fdc 100644
--- a/libcxx/include/__string/extern_template_lists.h
+++ b/libcxx/include/__string/extern_template_lists.h
@@ -37,16 +37,13 @@
Func(basic_string<CharT>& basic_string<CharT>::assign(size_type, value_type)) \
Func(basic_string<CharT>& basic_string<CharT>::assign(const basic_string&, size_type, size_type)) \
Func(basic_string<CharT>& basic_string<CharT>::append(size_type, value_type)) \
- Func(basic_string<CharT>& basic_string<CharT>::append(const value_type*)) \
Func(basic_string<CharT>& basic_string<CharT>::append(const value_type*, size_type)) \
Func(basic_string<CharT>& basic_string<CharT>::append(const basic_string&, size_type, size_type)) \
Func(void basic_string<CharT>::push_back(value_type)) \
- Func(basic_string<CharT>& basic_string<CharT>::insert(size_type, const value_type*)) \
Func(basic_string<CharT>& basic_string<CharT>::insert(size_type, size_type, value_type)) \
Func(basic_string<CharT>& basic_string<CharT>::insert(size_type, const value_type*, size_type)) \
Func(basic_string<CharT>& basic_string<CharT>::insert(size_type, const basic_string&, size_type, size_type)) \
Func(basic_string<CharT>::iterator basic_string<CharT>::insert(basic_string::const_iterator, value_type)) \
- Func(basic_string<CharT>& basic_string<CharT>::replace(size_type, size_type, const value_type*)) \
Func(basic_string<CharT>& basic_string<CharT>::replace(size_type, size_type, size_type, value_type)) \
Func(basic_string<CharT>& basic_string<CharT>::replace(size_type, size_type, const value_type*, size_type)) \
Func(basic_string<CharT>& basic_string<CharT>::replace(size_type, size_type, const basic_string&, size_type, size_type)) \
@@ -64,8 +61,6 @@
Func(basic_string<CharT>::size_type basic_string<CharT>::find_last_not_of(const value_type*, size_type, size_type) const) \
Func(CharT& basic_string<CharT>::at(size_type)) \
Func(const CharT& basic_string<CharT>::at(size_type) const) \
- Func(int basic_string<CharT>::compare(const value_type*) const) \
- Func(int basic_string<CharT>::compare(size_type, size_type, const value_type*) const) \
Func(int basic_string<CharT>::compare(size_type, size_type, const value_type*, size_type) const) \
Func(int basic_string<CharT>::compare(size_type, size_type, const basic_string&, size_type, size_type) const) \
Func(const basic_string<CharT>::size_type basic_string<CharT>::npos) \
@@ -74,7 +69,6 @@
_LIBCPP_STRING_COMMON_EXTERN_TEMPLATE_LIST(Func, CharT) \
Func(basic_string<CharT>::basic_string(const basic_string&)) \
Func(basic_string<CharT>::basic_string(const basic_string&, const allocator<CharT>&)) \
- Func(basic_string<CharT>& basic_string<CharT>::assign(const value_type*)) \
Func(basic_string<CharT>& basic_string<CharT>::assign(const value_type*, size_type)) \
Func(basic_string<CharT>& basic_string<CharT>::operator=(basic_string const&)) \
Func(void basic_string<CharT>::__grow_by(size_type, size_type, size_type, size_type, size_type, size_type)) \
@@ -84,7 +78,6 @@
_LIBCPP_STRING_COMMON_EXTERN_TEMPLATE_LIST(Func, CharT) \
Func(void basic_string<CharT>::__init_copy_ctor_external(const value_type*, size_type)) \
Func(basic_string<CharT>& basic_string<CharT>::__assign_external(const value_type*, size_type)) \
- Func(basic_string<CharT>& basic_string<CharT>::__assign_external(const value_type*)) \
Func(basic_string<CharT>& basic_string<CharT>::__assign_no_alias<false>(const value_type*, size_type)) \
Func(basic_string<CharT>& basic_string<CharT>::__assign_no_alias<true>(const value_type*, size_type)) \
Func(void basic_string<CharT>::__erase_external_with_move(size_type, size_type))
diff --git a/libcxx/src/string.cpp b/libcxx/src/string.cpp
index 5028fc88fe46d..31096013ba4d8 100644
--- a/libcxx/src/string.cpp
+++ b/libcxx/src/string.cpp
@@ -54,7 +54,15 @@ void basic_string<_CharT, _Traits, _Allocator>::__init(const value_type* __s, si
}
# define STRING_LEGACY_API(CharT) \
- template _LIBCPP_EXPORTED_FROM_ABI void basic_string<CharT>::__init(const value_type*, size_type, size_type)
+ template _LIBCPP_EXPORTED_FROM_ABI void basic_string<CharT>::__init(const value_type*, size_type, size_type); \
+ template _LIBCPP_EXPORTED_FROM_ABI basic_string<CharT>& basic_string<CharT>::append(const value_type*); \
+ template _LIBCPP_EXPORTED_FROM_ABI basic_string<CharT>& basic_string<CharT>::insert(size_type, const value_type*); \
+ template _LIBCPP_EXPORTED_FROM_ABI basic_string<CharT>& basic_string<CharT>::replace( \
+ size_type, size_type, const value_type*); \
+ template _LIBCPP_EXPORTED_FROM_ABI int basic_string<CharT>::compare(const value_type*) const; \
+ template _LIBCPP_EXPORTED_FROM_ABI int basic_string<CharT>::compare(size_type, size_type, const value_type*) \
+ const; \
+ template _LIBCPP_EXPORTED_FROM_ABI basic_string<CharT>& basic_string<CharT>::assign(const value_type*)
STRING_LEGACY_API(char);
# if _LIBCPP_HAS_WIDE_CHARACTERS
More information about the libcxx-commits
mailing list