[libcxx] r307966 - [libc++] Mark string operator+ _LIBCPP_FUNC_VIS
Akira Hatanaka via cfe-commits
cfe-commits at lists.llvm.org
Tue Aug 22 18:21:34 PDT 2017
This change makes it impossible to change the visibility of operator+ with -fvisibility=hidden, which is not desirable on Darwin.
For example:
$ cat test.cpp
#include <string>
using namespace std;
string foo1(string s) {
return "abc" + s;
}
$ clang++ test.cpp -fvisibility=hidden -c; nm -m -a test.o | grep __ZNSt3__1plIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12basic_stringIT_T0_T1_EEPKS6_RKS9_
0000000000000030 (__TEXT,__text) weak external __ZNSt3__1plIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12basic_stringIT_T0_T1_EEPKS6_RKS9_
The symbol used to be “weak private external”, but it is “weak external” now.
> On Jul 13, 2017, at 2:35 PM, Shoaib Meenai via cfe-commits <cfe-commits at lists.llvm.org> wrote:
>
> Author: smeenai
> Date: Thu Jul 13 14:35:52 2017
> New Revision: 307966
>
> URL: http://llvm.org/viewvc/llvm-project?rev=307966&view=rev
> Log:
> [libc++] Mark string operator+ _LIBCPP_FUNC_VIS
>
> It has an extern template instantiation declaration in the headers and a
> corresponding instantiation definition in the library, so we must mark
> it with _LIBCPP_FUNC_VIS to make it available outside the library.
>
> This doesn't cause any ABI changes as-is since we don't build libc++
> with hidden visibility (so the function is exported anyway). It's needed
> for building libc++ with hidden visibility, however.
>
> Clarify the Windows behavior for extern function templates while I'm
> here, since this exercises that behavior.
>
> Modified:
> libcxx/trunk/docs/DesignDocs/VisibilityMacros.rst
> libcxx/trunk/include/string
>
> Modified: libcxx/trunk/docs/DesignDocs/VisibilityMacros.rst
> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/docs/DesignDocs/VisibilityMacros.rst?rev=307966&r1=307965&r2=307966&view=diff
> ==============================================================================
> --- libcxx/trunk/docs/DesignDocs/VisibilityMacros.rst (original)
> +++ libcxx/trunk/docs/DesignDocs/VisibilityMacros.rst Thu Jul 13 14:35:52 2017
> @@ -98,7 +98,8 @@ Visibility Macros
> explicit instantiations themselves are marked as exported. Note that this
> applies *only* to extern *class* templates. Extern *function* templates obey
> regular import/export semantics, and applying `dllexport` directly to the
> - extern template declaration is the correct thing to do for them.
> + extern template declaration (i.e. using `_LIBCPP_FUNC_VIS`) is the correct
> + thing to do for them.
>
> **_LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS**
> Mark the member functions, typeinfo, and vtable of an explicit instantiation
>
> Modified: libcxx/trunk/include/string
> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/string?rev=307966&r1=307965&r2=307966&view=diff
> ==============================================================================
> --- libcxx/trunk/include/string (original)
> +++ libcxx/trunk/include/string Thu Jul 13 14:35:52 2017
> @@ -4006,7 +4006,7 @@ basic_string<_CharT, _Traits, _Allocator
>
> _LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_string<char>)
> _LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_string<wchar_t>)
> -_LIBCPP_EXTERN_TEMPLATE(string operator+<char, char_traits<char>, allocator<char> >(char const*, string const&))
> +_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS string operator+<char, char_traits<char>, allocator<char> >(char const*, string const&))
>
> #if _LIBCPP_STD_VER > 11
> // Literal suffixes for basic_string [basic.string.literals]
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170822/edd3fa9d/attachment-0001.html>
More information about the cfe-commits
mailing list