[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