[llvm-branch-commits] [libcxx] r339882 - Merging r339874:

Hans Wennborg via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Thu Aug 16 07:54:37 PDT 2018

Author: hans
Date: Thu Aug 16 07:54:37 2018
New Revision: 339882

URL: http://llvm.org/viewvc/llvm-project?rev=339882&view=rev
Merging r339874:
r339874 | ldionne | 2018-08-16 14:44:28 +0200 (Thu, 16 Aug 2018) | 25 lines

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

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

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

    libcxx/branches/release_70/   (props changed)

Propchange: libcxx/branches/release_70/
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Aug 16 07:54:37 2018
@@ -1,2 +1,2 @@

Modified: libcxx/branches/release_70/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/libcxx/branches/release_70/CMakeLists.txt?rev=339882&r1=339881&r2=339882&view=diff
--- libcxx/branches/release_70/CMakeLists.txt (original)
+++ libcxx/branches/release_70/CMakeLists.txt Thu Aug 16 07:54:37 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()

Modified: libcxx/branches/release_70/docs/BuildingLibcxx.rst
URL: http://llvm.org/viewvc/llvm-project/libcxx/branches/release_70/docs/BuildingLibcxx.rst?rev=339882&r1=339881&r2=339882&view=diff
--- libcxx/branches/release_70/docs/BuildingLibcxx.rst (original)
+++ libcxx/branches/release_70/docs/BuildingLibcxx.rst Thu Aug 16 07:54:37 2018
@@ -332,6 +332,15 @@ libc++ Feature Options
   Use the specified GCC toolchain and standard library when building the native
   stdlib benchmark tests.
+  **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/branches/release_70/docs/DesignDocs/VisibilityMacros.rst
URL: http://llvm.org/viewvc/llvm-project/libcxx/branches/release_70/docs/DesignDocs/VisibilityMacros.rst?rev=339882&r1=339881&r2=339882&view=diff
--- libcxx/branches/release_70/docs/DesignDocs/VisibilityMacros.rst (original)
+++ libcxx/branches/release_70/docs/DesignDocs/VisibilityMacros.rst Thu Aug 16 07:54:37 2018
@@ -42,9 +42,42 @@ Visibility Macros
   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.
+  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).
+  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.
   Mark a type's typeinfo, vtable and members as having default visibility.

Modified: libcxx/branches/release_70/include/__config
URL: http://llvm.org/viewvc/llvm-project/libcxx/branches/release_70/include/__config?rev=339882&r1=339881&r2=339882&view=diff
--- libcxx/branches/release_70/include/__config (original)
+++ libcxx/branches/release_70/include/__config Thu Aug 16 07:54:37 2018
@@ -801,8 +801,20 @@ namespace std {
+#  else
+#  endif
+#  else
+#  endif
 // Just so we can migrate to _LIBCPP_HIDE_FROM_ABI gradually.

Modified: libcxx/branches/release_70/include/__config_site.in
URL: http://llvm.org/viewvc/llvm-project/libcxx/branches/release_70/include/__config_site.in?rev=339882&r1=339881&r2=339882&view=diff
--- libcxx/branches/release_70/include/__config_site.in (original)
+++ libcxx/branches/release_70/include/__config_site.in Thu Aug 16 07:54:37 2018
@@ -14,6 +14,7 @@
 #cmakedefine _LIBCPP_ABI_UNSTABLE
 #cmakedefine _LIBCPP_HAS_NO_STDIN
 #cmakedefine _LIBCPP_HAS_NO_STDOUT

Modified: libcxx/branches/release_70/utils/libcxx/test/config.py
URL: http://llvm.org/viewvc/llvm-project/libcxx/branches/release_70/utils/libcxx/test/config.py?rev=339882&r1=339881&r2=339882&view=diff
--- libcxx/branches/release_70/utils/libcxx/test/config.py (original)
+++ libcxx/branches/release_70/utils/libcxx/test/config.py Thu Aug 16 07:54:37 2018
@@ -677,7 +677,8 @@ class Configuration(object):
                 if feature_macros[m]:
                     define += '=%s' % (feature_macros[m])
                 self.cxx.compile_flags += [define]
+               m == '_LIBCPP_HIDE_FROM_ABI_PER_TU_BY_DEFAULT':
             if m == '_LIBCPP_ABI_VERSION':

More information about the llvm-branch-commits mailing list