Merged to 7.0 in r339882.
On Thu, Aug 16, 2018 at 2:44 PM, Louis Dionne via cfe-commits <cfe-commits@lists.llvm.org> wrote: > Author: ldionne > Date: Thu Aug 16 05:44:28 2018 > New Revision: 339874 > > URL: http://llvm.org/viewvc/llvm-project?rev=339874&view=rev > Log: > [libcxx] By default, do not use internal_linkage to hide symbols from the ABI > > Summary: > https://reviews.llvm.org/D49240 led to symbol size problems in Chromium, and > we expect this may be the case in other projects built in debug mode too. > Instead, unless users explicitly ask for internal_linkage, we use > always_inline > like we used to. > > In the future, when we have a solution that allows us to drop always_inline > without falling back on internal_linkage, we can replace always_inline by > that. > > Note that this commit introduces a change in contract for existing libc++ > users: by default, libc++ used to guarantee that TUs built with different > versions of libc++ could be linked together. With the introduction of the > _LIBCPP_HIDE_FROM_ABI_PER_TU macro, the default behavior is that TUs built > with different libc++ versions are not guaranteed to link. This is a change > in contract but not a change in behavior, since the current implementation > still allows linking TUs built with different libc++ versions together. > > Reviewers: EricWF, mclow.lists, dexonsmith, hans, rnk > > Subscribers: christof, cfe-commits > > Differential Revision: https://reviews.llvm.org/D50652 > > Modified: > libcxx/trunk/CMakeLists.txt > libcxx/trunk/docs/BuildingLibcxx.rst > libcxx/trunk/docs/DesignDocs/VisibilityMacros.rst > libcxx/trunk/include/__config > libcxx/trunk/include/__config_site.in > libcxx/trunk/utils/libcxx/test/config.py > > Modified: libcxx/trunk/CMakeLists.txt > URL: > http://llvm.org/viewvc/llvm-project/libcxx/trunk/CMakeLists.txt?rev=339874&r1=339873&r2=339874&view=diff > ============================================================================== > --- libcxx/trunk/CMakeLists.txt (original) > +++ libcxx/trunk/CMakeLists.txt Thu Aug 16 05:44:28 2018 > @@ -120,6 +120,7 @@ set(LIBCXX_ABI_VERSION ${DEFAULT_ABI_VER > option(LIBCXX_ABI_UNSTABLE "Unstable ABI of libc++." OFF) > option(LIBCXX_ABI_FORCE_ITANIUM "Ignore auto-detection and force use of the > Itanium ABI.") > option(LIBCXX_ABI_FORCE_MICROSOFT "Ignore auto-detection and force use of > the Microsoft ABI.") > +option(LIBCXX_HIDE_FROM_ABI_PER_TU_BY_DEFAULT "Enable per TU ABI insulation > by default. To be used by vendors." OFF) > set(LIBCXX_ABI_DEFINES "" CACHE STRING "A semicolon separated list of ABI > macros to define in the site config header.") > option(LIBCXX_USE_COMPILER_RT "Use compiler-rt instead of libgcc" OFF) > > @@ -662,6 +663,7 @@ endif() > config_define_if(LIBCXX_ABI_UNSTABLE _LIBCPP_ABI_UNSTABLE) > config_define_if(LIBCXX_ABI_FORCE_ITANIUM _LIBCPP_ABI_FORCE_ITANIUM) > config_define_if(LIBCXX_ABI_FORCE_MICROSOFT _LIBCPP_ABI_FORCE_MICROSOFT) > +config_define_if(LIBCXX_HIDE_FROM_ABI_PER_TU_BY_DEFAULT > _LIBCPP_HIDE_FROM_ABI_PER_TU_BY_DEFAULT) > > config_define_if_not(LIBCXX_ENABLE_GLOBAL_FILESYSTEM_NAMESPACE > _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE) > config_define_if_not(LIBCXX_ENABLE_STDIN _LIBCPP_HAS_NO_STDIN) > > Modified: libcxx/trunk/docs/BuildingLibcxx.rst > URL: > http://llvm.org/viewvc/llvm-project/libcxx/trunk/docs/BuildingLibcxx.rst?rev=339874&r1=339873&r2=339874&view=diff > ============================================================================== > --- libcxx/trunk/docs/BuildingLibcxx.rst (original) > +++ libcxx/trunk/docs/BuildingLibcxx.rst Thu Aug 16 05:44:28 2018 > @@ -332,6 +332,15 @@ libc++ Feature Options > Use the specified GCC toolchain and standard library when building the > native > stdlib benchmark tests. > > +.. option:: LIBCXX_HIDE_FROM_ABI_PER_TU_BY_DEFAULT:BOOL > + > + **Default**: ``OFF`` > + > + Pick the default for whether to constrain ABI-unstable symbols to > + each individual translation unit. This setting controls whether > + `_LIBCPP_HIDE_FROM_ABI_PER_TU_BY_DEFAULT` is defined by default -- > + see the documentation of that macro for details. > + > > libc++ ABI Feature Options > -------------------------- > > Modified: libcxx/trunk/docs/DesignDocs/VisibilityMacros.rst > URL: > http://llvm.org/viewvc/llvm-project/libcxx/trunk/docs/DesignDocs/VisibilityMacros.rst?rev=339874&r1=339873&r2=339874&view=diff > ============================================================================== > --- libcxx/trunk/docs/DesignDocs/VisibilityMacros.rst (original) > +++ libcxx/trunk/docs/DesignDocs/VisibilityMacros.rst Thu Aug 16 05:44:28 2018 > @@ -42,9 +42,7 @@ Visibility Macros > > **_LIBCPP_HIDE_FROM_ABI** > Mark a function as not being part of the ABI of any final linked image that > - uses it, and also as being internal to each TU that uses that function. In > - other words, the address of a function marked with this attribute is not > - guaranteed to be the same across translation units. > + uses it. > > **_LIBCPP_HIDE_FROM_ABI_AFTER_V1** > Mark a function as being hidden from the ABI (per `_LIBCPP_HIDE_FROM_ABI`) > @@ -61,6 +59,41 @@ Visibility Macros > ABI, we should create a new _LIBCPP_HIDE_FROM_ABI_AFTER_XXX macro, and we > can > use it to start removing symbols from the ABI after that stable version. > > +**_LIBCPP_HIDE_FROM_ABI_PER_TU** > + This macro controls whether symbols hidden from the ABI with > `_LIBCPP_HIDE_FROM_ABI` > + are local to each translation unit in addition to being local to each final > + linked image. This macro is defined to either 0 or 1. When it is defined to > + 1, translation units compiled with different versions of libc++ can be > linked > + together, since all non ABI-facing functions are local to each translation > unit. > + This allows static archives built with different versions of libc++ to be > linked > + together. This also means that functions marked with > `_LIBCPP_HIDE_FROM_ABI` > + are not guaranteed to have the same address across translation unit > boundaries. > + > + When the macro is defined to 0, there is no guarantee that translation > units > + compiled with different versions of libc++ can interoperate. However, this > + leads to code size improvements, since non ABI-facing functions can be > + deduplicated across translation unit boundaries. > + > + This macro can be defined by users to control the behavior they want from > + libc++. The default value of this macro (0 or 1) is controlled by whether > + `_LIBCPP_HIDE_FROM_ABI_PER_TU_BY_DEFAULT` is defined, which is intended to > + be used by vendors only (see below). > + > +**_LIBCPP_HIDE_FROM_ABI_PER_TU_BY_DEFAULT** > + This macro controls the default value for `_LIBCPP_HIDE_FROM_ABI_PER_TU`. > + When the macro is defined, per TU ABI insulation is enabled by default, and > + `_LIBCPP_HIDE_FROM_ABI_PER_TU` is defined to 1 unless overriden by users. > + Otherwise, per TU ABI insulation is disabled by default, and > + `_LIBCPP_HIDE_FROM_ABI_PER_TU` is defined to 0 unless overriden by users. > + > + This macro is intended for vendors to control whether they want to ship > + libc++ with per TU ABI insulation enabled by default. Users can always > + control the behavior they want by defining `_LIBCPP_HIDE_FROM_ABI_PER_TU` > + appropriately. > + > + By default, this macro is not defined, which means that per TU ABI > insulation > + is not provided unless explicitly overriden by users. > + > **_LIBCPP_TYPE_VIS** > Mark a type's typeinfo, vtable and members as having default visibility. > This attribute cannot be used on class templates. > > Modified: libcxx/trunk/include/__config > URL: > http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__config?rev=339874&r1=339873&r2=339874&view=diff > ============================================================================== > --- libcxx/trunk/include/__config (original) > +++ libcxx/trunk/include/__config Thu Aug 16 05:44:28 2018 > @@ -798,8 +798,20 @@ namespace std { > # define _LIBCPP_INTERNAL_LINKAGE _LIBCPP_ALWAYS_INLINE > #endif > > +#ifndef _LIBCPP_HIDE_FROM_ABI_PER_TU > +# ifndef _LIBCPP_HIDE_FROM_ABI_PER_TU_BY_DEFAULT > +# define _LIBCPP_HIDE_FROM_ABI_PER_TU 0 > +# else > +# define _LIBCPP_HIDE_FROM_ABI_PER_TU 1 > +# endif > +#endif > + > #ifndef _LIBCPP_HIDE_FROM_ABI > -# define _LIBCPP_HIDE_FROM_ABI _LIBCPP_HIDDEN _LIBCPP_INTERNAL_LINKAGE > +# if _LIBCPP_HIDE_FROM_ABI_PER_TU > +# define _LIBCPP_HIDE_FROM_ABI _LIBCPP_HIDDEN _LIBCPP_INTERNAL_LINKAGE > +# else > +# define _LIBCPP_HIDE_FROM_ABI _LIBCPP_HIDDEN _LIBCPP_ALWAYS_INLINE > +# endif > #endif > > #ifdef _LIBCPP_BUILDING_LIBRARY > > Modified: libcxx/trunk/include/__config_site.in > URL: > http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__config_site.in?rev=339874&r1=339873&r2=339874&view=diff > ============================================================================== > --- libcxx/trunk/include/__config_site.in (original) > +++ libcxx/trunk/include/__config_site.in Thu Aug 16 05:44:28 2018 > @@ -14,6 +14,7 @@ > #cmakedefine _LIBCPP_ABI_UNSTABLE > #cmakedefine _LIBCPP_ABI_FORCE_ITANIUM > #cmakedefine _LIBCPP_ABI_FORCE_MICROSOFT > +#cmakedefine _LIBCPP_HIDE_FROM_ABI_PER_TU_BY_DEFAULT > #cmakedefine _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE > #cmakedefine _LIBCPP_HAS_NO_STDIN > #cmakedefine _LIBCPP_HAS_NO_STDOUT > > Modified: libcxx/trunk/utils/libcxx/test/config.py > URL: > http://llvm.org/viewvc/llvm-project/libcxx/trunk/utils/libcxx/test/config.py?rev=339874&r1=339873&r2=339874&view=diff > ============================================================================== > --- libcxx/trunk/utils/libcxx/test/config.py (original) > +++ libcxx/trunk/utils/libcxx/test/config.py Thu Aug 16 05:44:28 2018 > @@ -677,7 +677,8 @@ class Configuration(object): > if feature_macros[m]: > define += '=%s' % (feature_macros[m]) > self.cxx.compile_flags += [define] > - if m == '_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS': > + if m == '_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS' or \ > + m == '_LIBCPP_HIDE_FROM_ABI_PER_TU_BY_DEFAULT': > continue > if m == '_LIBCPP_ABI_VERSION': > self.config.available_features.add('libcpp-abi-version-v%s' > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > 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