Thanks Eric!

> On Oct 12, 2016, at 9:18 PM, Eric Fiselier <e...@efcs.ca> wrote:
> 
> Sure, I've reverted the change in r284101.
> 
> I'll try and respond in detail tomorrow.
> 
> /Eric
> 
> On Wed, Oct 12, 2016 at 9:57 PM, Mehdi Amini <mehdi.am...@apple.com 
> <mailto:mehdi.am...@apple.com>> wrote:
> Hi Eric,
> 
> This is not clear to me that this patch is correct as-is. 
> 
> See the last message in the thread: 
> http://lists.llvm.org/pipermail/cfe-dev/2016-July/049985.html 
> <http://lists.llvm.org/pipermail/cfe-dev/2016-July/049985.html>
> 
> I think we should reach a consensus on the right course of actions about this 
> first.
> 
> — 
> Mehdi
> 
> 
> 
> 
>> On Sep 24, 2016, at 8:14 PM, Eric Fiselier via cfe-commits 
>> <cfe-commits@lists.llvm.org <mailto:cfe-commits@lists.llvm.org>> wrote:
>> 
>> Author: ericwf
>> Date: Sat Sep 24 22:14:13 2016
>> New Revision: 282345
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=282345&view=rev 
>> <http://llvm.org/viewvc/llvm-project?rev=282345&view=rev>
>> Log:
>> Use __attribute__((internal_linkage)) when available.
>> 
>> Summary:
>> This patch has been a long time coming (Thanks @eugenis). It changes 
>> `_LIBCPP_INLINE_VISIBILITY` to use `__attribute__((internal_linkage))` 
>> instead of `__attribute__((visibility("hidden"), always_inline))`.
>> 
>> The point of `_LIBCPP_INLINE_VISIBILITY` is to prevent inline functions from 
>> being exported from both the libc++ library and from user libraries. This 
>> helps libc++ better manage it's ABI.
>> Previously this was done by forcing inlining and modifying the symbols 
>> visibility. However inlining isn't guaranteed and symbol visibility only 
>> affects shared libraries making this an imperfect solution.  
>> `internal_linkage` improves this situation by making all symbols local to 
>> the TU they are emitted in, regardless of inlining or visibility. IIRC the 
>> effect of applying `__attribute__((internal_linkage))` to an inline function 
>> is the same as applying `static`.
>> 
>> For more information about the attribute see: 
>> http://lists.llvm.org/pipermail/cfe-dev/2015-October/045580.html 
>> <http://lists.llvm.org/pipermail/cfe-dev/2015-October/045580.html>
>> 
>> Most of the work for this patch was done by @eugenis.
>> 
>> 
>> Reviewers: mclow.lists, eugenis
>> 
>> Subscribers: eugenis, cfe-commits
>> 
>> Differential Revision: https://reviews.llvm.org/D24642 
>> <https://reviews.llvm.org/D24642>
>> 
>> Modified:
>>    libcxx/trunk/include/__config
>>    libcxx/trunk/src/string.cpp
>> 
>> Modified: libcxx/trunk/include/__config
>> URL: 
>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__config?rev=282345&r1=282344&r2=282345&view=diff
>>  
>> <http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__config?rev=282345&r1=282344&r2=282345&view=diff>
>> ==============================================================================
>> --- libcxx/trunk/include/__config (original)
>> +++ libcxx/trunk/include/__config Sat Sep 24 22:14:13 2016
>> @@ -34,6 +34,7 @@
>> #endif
>> 
>> #if defined(_LIBCPP_ABI_UNSTABLE) || _LIBCPP_ABI_VERSION >= 2
>> +#define _LIBCPP_ABI_EXTERN_TEMPLATE_SYMBOLS_VERSION 2
>> // Change short string representation so that string data starts at offset 0,
>> // improving its alignment in some cases.
>> #define _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
>> @@ -49,6 +50,7 @@
>> #define _LIBCPP_ABI_FIX_UNORDERED_CONTAINER_SIZE_TYPE
>> #define _LIBCPP_ABI_VARIADIC_LOCK_GUARD
>> #elif _LIBCPP_ABI_VERSION == 1
>> +#define _LIBCPP_ABI_EXTERN_TEMPLATE_SYMBOLS_VERSION 1
>> // Feature macros for disabling pre ABI v1 features. All of these options
>> // are deprecated.
>> #if defined(__FreeBSD__)
>> @@ -629,11 +631,19 @@ namespace std {
>> #endif
>> 
>> #ifndef _LIBCPP_INLINE_VISIBILITY
>> -#define _LIBCPP_INLINE_VISIBILITY __attribute__ ((__visibility__("hidden"), 
>> __always_inline__))
>> +# if __has_attribute(__internal_linkage__)
>> +#   define _LIBCPP_INLINE_VISIBILITY __attribute__((__internal_linkage__, 
>> __always_inline__))
>> +# else
>> +#   define _LIBCPP_INLINE_VISIBILITY __attribute__ 
>> ((__visibility__("hidden"), __always_inline__))
>> +# endif
>> #endif
>> 
>> #ifndef _LIBCPP_ALWAYS_INLINE
>> -#define _LIBCPP_ALWAYS_INLINE  __attribute__ ((__visibility__("hidden"), 
>> __always_inline__))
>> +# if __has_attribute(__internal_linkage__)
>> +#   define _LIBCPP_ALWAYS_INLINE __attribute__((__internal_linkage__, 
>> __always_inline__))
>> +# else
>> +#   define _LIBCPP_ALWAYS_INLINE  __attribute__ ((__visibility__("hidden"), 
>> __always_inline__))
>> +# endif
>> #endif
>> 
>> #ifndef _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
>> 
>> Modified: libcxx/trunk/src/string.cpp
>> URL: 
>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/string.cpp?rev=282345&r1=282344&r2=282345&view=diff
>>  
>> <http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/string.cpp?rev=282345&r1=282344&r2=282345&view=diff>
>> ==============================================================================
>> --- libcxx/trunk/src/string.cpp (original)
>> +++ libcxx/trunk/src/string.cpp Sat Sep 24 22:14:13 2016
>> @@ -29,6 +29,29 @@ template
>>     string
>>     operator+<char, char_traits<char>, allocator<char> >(char const*, string 
>> const&);
>> 
>> +// These external instantiations are required to maintain dylib 
>> compatibility
>> +// for ABI v1 when using __attribute__((internal_linkage)) as opposed to
>> +// __attribute__((visibility("hidden"), always_inline)).
>> +#if _LIBCPP_ABI_EXTERN_TEMPLATE_SYMBOLS_VERSION == 1
>> +template basic_string<char>::iterator
>> +basic_string<char>::insert(basic_string<char>::const_iterator,
>> +                           char const *, char const *);
>> +
>> +template basic_string<wchar_t>::iterator
>> +basic_string<wchar_t>::insert(basic_string<wchar_t>::const_iterator,
>> +                              wchar_t const *, wchar_t const *);
>> +
>> +template basic_string<char> &
>> +basic_string<char>::replace(basic_string<char>::const_iterator,
>> +                               basic_string<char>::const_iterator,
>> +                               char const *, char const *);
>> +
>> +template basic_string<wchar_t> &
>> +basic_string<wchar_t>::replace(basic_string<wchar_t>::const_iterator,
>> +                               basic_string<wchar_t>::const_iterator,
>> +                               wchar_t const *, wchar_t const *);
>> +#endif // _LIBCPP_ABI_EXTERN_TEMPLATE_SYMBOLS_VERSION
>> +
>> namespace
>> {
>> 
>> 
>> 
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits@lists.llvm.org <mailto:cfe-commits@lists.llvm.org>
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits 
>> <http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits>
> 
> 

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to