[libcxx] r189610 - Turn off extern templates for most uses. It is causing more problems than it is worth. The extern templates will still be built into the dylib, mainly for ABI stability purposes. And the client can still turn these back on with a #define if desire. This fixes http://llvm.org/bugs/show_bug.cgi?id=17027. However there's no associated test for the test suite because http://llvm.org/bugs/show_bug.cgi?id=17027 needs mismatched dylib and headers to fire.

David Blaikie dblaikie at gmail.com
Thu Aug 29 14:20:21 PDT 2013


On Thu, Aug 29, 2013 at 2:14 PM, Howard Hinnant <hhinnant at apple.com> wrote:
>
> On Aug 29, 2013, at 5:07 PM, David Blaikie <dblaikie at gmail.com> wrote:
>
>> On Thu, Aug 29, 2013 at 1:56 PM, Howard Hinnant <hhinnant at apple.com> wrote:
>>> Author: hhinnant
>>> Date: Thu Aug 29 15:56:53 2013
>>> New Revision: 189610
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=189610&view=rev
>>> Log:
>>> Turn off extern templates for most uses.  It is causing more problems than it is worth.  The extern templates will still be built into the dylib, mainly for ABI stability purposes.  And the client can still turn these back on with a #define if desire.  This fixes http://llvm.org/bugs/show_bug.cgi?id=17027.  However there's no associated test for the test suite because http://llvm.org/bugs/show_bug.cgi?id=17027 needs mismatched dylib and headers to fire.
>>
>> For what it's worth, extern templates can, in some cases, drastically
>> reduce the size of debug info (and thus reduce link times, etc) in
>> client code. This only, currently, applies to types with vtables (such
>> as iostreams) but can cause GCC and (recently) Clang to omit the
>> definition of these types in TUs that don't emit the vtable, relying
>> on the type debug info to be emitted in the TU with the vtable.
>>
>> The most awesome/horrifying example of this was in the simple TU:
>>
>> #include <fstream>
>>
>> int main() {
>>  std::ifstream x;
>>  return x.bad(); // make sure we've used member functions, etc
>> }
>>
>> The debug info that Clang & GCC emit for this TU is now /tiny/, the
>> ifstream typedef, a declaration of the basic_ifstream template &
>> nothing more. Without the extern template you get /lots/ of debug info
>> here.
>
> Thanks for the feedback.  If really needed I can revert this.  In your example I'm measuring a 11% code size increase at -O3.

I guess you mean just total linked binary size in -O3, with -g as
well? It's specifically the debug info size I was alerting you to.

I don't know what the right tradeoff is, but I just thought I'd
mention the debug-related wrinkle because it's not an obvious part of
the extern template tradeoff.

- Dave

>
> Howard
>
>>
>>>
>>> Modified:
>>>    libcxx/trunk/include/__config
>>>    libcxx/trunk/src/algorithm.cpp
>>>    libcxx/trunk/src/ios.cpp
>>>    libcxx/trunk/src/locale.cpp
>>>    libcxx/trunk/src/string.cpp
>>>    libcxx/trunk/src/valarray.cpp
>>>
>>> Modified: libcxx/trunk/include/__config
>>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__config?rev=189610&r1=189609&r2=189610&view=diff
>>> ==============================================================================
>>> --- libcxx/trunk/include/__config (original)
>>> +++ libcxx/trunk/include/__config Thu Aug 29 15:56:53 2013
>>> @@ -538,7 +538,7 @@ template <unsigned> struct __static_asse
>>> #endif
>>>
>>> #ifndef _LIBCPP_EXTERN_TEMPLATE
>>> -#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__;
>>> +#define _LIBCPP_EXTERN_TEMPLATE(...)
>>> #endif
>>>
>>> #ifndef _LIBCPP_EXTERN_TEMPLATE2
>>>
>>> Modified: libcxx/trunk/src/algorithm.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/algorithm.cpp?rev=189610&r1=189609&r2=189610&view=diff
>>> ==============================================================================
>>> --- libcxx/trunk/src/algorithm.cpp (original)
>>> +++ libcxx/trunk/src/algorithm.cpp Thu Aug 29 15:56:53 2013
>>> @@ -7,6 +7,7 @@
>>> //
>>> //===----------------------------------------------------------------------===//
>>>
>>> +#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__;
>>> #include "algorithm"
>>> #include "random"
>>> #include "mutex"
>>>
>>> Modified: libcxx/trunk/src/ios.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/ios.cpp?rev=189610&r1=189609&r2=189610&view=diff
>>> ==============================================================================
>>> --- libcxx/trunk/src/ios.cpp (original)
>>> +++ libcxx/trunk/src/ios.cpp Thu Aug 29 15:56:53 2013
>>> @@ -7,6 +7,8 @@
>>> //
>>> //===----------------------------------------------------------------------===//
>>>
>>> +#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__;
>>> +
>>> #include "ios"
>>> #include "streambuf"
>>> #include "istream"
>>>
>>> Modified: libcxx/trunk/src/locale.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/locale.cpp?rev=189610&r1=189609&r2=189610&view=diff
>>> ==============================================================================
>>> --- libcxx/trunk/src/locale.cpp (original)
>>> +++ libcxx/trunk/src/locale.cpp Thu Aug 29 15:56:53 2013
>>> @@ -7,6 +7,8 @@
>>> //
>>> //===----------------------------------------------------------------------===//
>>>
>>> +#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__;
>>> +
>>> // On Solaris, we need to define something to make the C99 parts of localeconv
>>> // visible.
>>> #ifdef __sun__
>>>
>>> Modified: libcxx/trunk/src/string.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/string.cpp?rev=189610&r1=189609&r2=189610&view=diff
>>> ==============================================================================
>>> --- libcxx/trunk/src/string.cpp (original)
>>> +++ libcxx/trunk/src/string.cpp Thu Aug 29 15:56:53 2013
>>> @@ -7,6 +7,8 @@
>>> //
>>> //===----------------------------------------------------------------------===//
>>>
>>> +#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__;
>>> +
>>> #include "string"
>>> #include "cstdlib"
>>> #include "cwchar"
>>>
>>> Modified: libcxx/trunk/src/valarray.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/valarray.cpp?rev=189610&r1=189609&r2=189610&view=diff
>>> ==============================================================================
>>> --- libcxx/trunk/src/valarray.cpp (original)
>>> +++ libcxx/trunk/src/valarray.cpp Thu Aug 29 15:56:53 2013
>>> @@ -7,6 +7,8 @@
>>> //
>>> //===----------------------------------------------------------------------===//
>>>
>>> +#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__;
>>> +
>>> #include "valarray"
>>>
>>> _LIBCPP_BEGIN_NAMESPACE_STD
>>>
>>>
>>> _______________________________________________
>>> cfe-commits mailing list
>>> cfe-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>




More information about the cfe-commits mailing list