On Thu, Aug 29, 2013 at 2:14 PM, Howard Hinnant <[email protected]> wrote: > > On Aug 29, 2013, at 5:07 PM, David Blaikie <[email protected]> wrote: > >> On Thu, Aug 29, 2013 at 1:56 PM, Howard Hinnant <[email protected]> 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 >>> [email protected] >>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
