[libcxx-commits] [PATCH] D115656: [libc++] Fix wrongly non-inline basic_string::shrink_to_fit
Louis Dionne via Phabricator via libcxx-commits
libcxx-commits at lists.llvm.org
Tue Dec 14 09:10:34 PST 2021
ldionne added inline comments.
================
Comment at: libcxx/include/string:3322
template <class _CharT, class _Traits, class _Allocator>
void
basic_string<_CharT, _Traits, _Allocator>::reserve(size_type __requested_capacity)
----------------
Mordante wrote:
> ldionne wrote:
> > Mordante wrote:
> > > Just curious but there are more similar functions not marked as `inline`. Are they also an issue and should they be fixed?
> > > It would be odd if all these functions are "broken".
> > >
> > > I wonder whether this is really the proper fix. Looking at `include/__string` it contains
> > > `_Func(_LIBCPP_FUNC_VIS void basic_string<_CharType>::reserve(size_type)) \`
> > > But no entry for `shrink_to_fit`.
> > > Does adding `shrink_to_fit` to that list solve the issue.
> > >
> > > (I didn't look for more omissions in `include/__string`.)
> > > Just curious but there are more similar functions not marked as inline. Are they also an issue and should they be fixed?
> >
> > These other non-`inline` functions are not marked with `_LIBCPP_HIDE_FROM_ABI` or `_LIBCPP_INLINE_VISIBILITY` AFAICT. Did you see some that were not inline but had `_LIBCPP_HIDE_FROM_ABI`?
> >
> > > I wonder whether this is really the proper fix. Looking at `include/__string` it contains
> > > ```_Func(_LIBCPP_FUNC_VIS void basic_string<_CharType>::reserve(size_type)) \
> > > ```
> > > But no entry for `shrink_to_fit`.
> >
> > `reserve` is different, it is not marked with `_LIBCPP_HIDE_FROM_ABI`, so it doesn't get internal linkage. If we made it `_LIBCPP_HIDE_FROM_ABI`, we'd have the same issue.
> >
> > > Does adding `shrink_to_fit` to that list solve the issue?
> >
> > No it doesn't, since we'd be explicitly instantiating a function with internal linkage, so it wouldn't be available from outside the `string.cpp.o` TU. And these lists are used only for the `char` and `wchar_t` explicit instantiations anyways, so that wouldn't solve Chromium's issue, which is with their own custom `char16` type.
> >
> I see.
> The current requirements for when using `inline` and when not feel quite error-prone.
> I wonder whether we need to add a better way to tag these functions. WDYT?
Indeed -- it's completely crazy.
IMO, we want all functions to be inline except when they are explicitly defined in and exported from the shared library. We've been moving towards that by defining functions in their class declarations more and more, and we should slowly keep moving towards that.
Instead of using `internal_linkage`, we could also look into using an inline namespace that gets bumped with every version of the library. That would reduce code bloat (due to `internal_linkage` functions being duplicated in each TU) and remove the need for using `_LIBCPP_HIDE_FROM_ABI` everywhere.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D115656/new/
https://reviews.llvm.org/D115656
More information about the libcxx-commits
mailing list