[libcxx] r339874 - [libcxx] By default, do not use internal_linkage to hide symbols from the ABI

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Thu Aug 16 07:55:20 PDT 2018


Merged to 7.0 in r339882.

On Thu, Aug 16, 2018 at 2:44 PM, Louis Dionne via cfe-commits
<cfe-commits at 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 at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list