Skip to content

Commit b0fd949

Browse files
committed
[libc++] Add a lightweight overridable assertion handler
This patch adds a lightweight assertion handler mechanism that can be overriden at link-time in a fashion similar to `operator new`. This is a third take on https://llvm.org/D121123 (which allowed customizing the assertion handler at compile-time), and https://llvm.org/D119969 (which allowed customizing the assertion handler at runtime only). This approach is, I think, the best of all three explored approaches. Indeed, replacing the assertion handler in user code is ergonomic, yet we retain the ability to provide a custom assertion handler when deploying to older platforms that don't have a default handler in the dylib. As-is, this patch provides a pretty good amount of backwards compatibility with the previous debug mode: - Code that used to set _LIBCPP_DEBUG=0 in order to get basic assertions in their code will still get basic assertions out of the box, but those assertions will be using the new assertion handler support. - Code that was previously compiled with references to __libcpp_debug_function and friends will work out-of-the-box, no changes required. This is because we provide the same symbols in the dylib as we used to. - Code that used to set a custom __libcpp_debug_function will stop compiling, because we don't provide that declaration anymore. Users will have to migrate to the new way of setting a custom assertion handler, which is extremely easy. I suspect that pool of users is very limited, so breaking them at compile-time is probably acceptable. The main downside of this approach is that code being compiled with assertions enabled but deploying to an older platform where the assertion handler didn't exist yet will fail to compile. However users can easily fix the problem by providing a custom assertion handler and defining the _LIBCPP_AVAILABILITY_CUSTOM_ASSERTION_HANDLER_PROVIDED macro to let the library know about the custom handler. In a way, this is actually a feature because it avoids a load-time error that one would otherwise get when trying to run the code on the older target. Differential Revision: https://reviews.llvm.org/D121478
1 parent b6efd25 commit b0fd949

File tree

75 files changed

+550
-229
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

75 files changed

+550
-229
lines changed

libcxx/CMakeLists.txt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,10 @@ include(CMakeDependentOption)
8282
include(HandleCompilerRT)
8383

8484
# Basic options ---------------------------------------------------------------
85-
option(LIBCXX_ENABLE_ASSERTIONS "Enable assertions independent of build mode." OFF)
85+
option(LIBCXX_ENABLE_ASSERTIONS
86+
"Enable assertions inside the compiled library, and at the same time make it the
87+
default when compiling user code. Note that assertions can be enabled or disabled
88+
by users in their own code regardless of this option." OFF)
8689
option(LIBCXX_ENABLE_SHARED "Build libc++ as a shared library." ON)
8790
option(LIBCXX_ENABLE_STATIC "Build libc++ as a static library." ON)
8891
option(LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY "Build libc++experimental.a" ON)
@@ -694,7 +697,6 @@ if (LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY AND LIBCXX_ENABLE_SHARED)
694697
endif()
695698

696699
# Assertion flags =============================================================
697-
define_if(LIBCXX_ENABLE_ASSERTIONS -D_LIBCPP_DEBUG=0)
698700
define_if(LIBCXX_DEBUG_BUILD -D_DEBUG)
699701
if (LIBCXX_ENABLE_ASSERTIONS AND NOT LIBCXX_DEBUG_BUILD)
700702
# MSVC doesn't like _DEBUG on release builds. See PR 4379.
@@ -896,6 +898,11 @@ config_define_if_not(LIBCXX_ENABLE_LOCALIZATION _LIBCPP_HAS_NO_LOCALIZATION)
896898
config_define_if_not(LIBCXX_ENABLE_UNICODE _LIBCPP_HAS_NO_UNICODE)
897899
config_define_if_not(LIBCXX_ENABLE_WIDE_CHARACTERS _LIBCPP_HAS_NO_WIDE_CHARACTERS)
898900
config_define_if_not(LIBCXX_ENABLE_VENDOR_AVAILABILITY_ANNOTATIONS _LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS)
901+
if (LIBCXX_ENABLE_ASSERTIONS)
902+
config_define(1 _LIBCPP_ENABLE_ASSERTIONS_DEFAULT)
903+
else()
904+
config_define(0 _LIBCPP_ENABLE_ASSERTIONS_DEFAULT)
905+
endif()
899906
# Incomplete features get their own specific disabling flags. This makes it
900907
# easier to grep for target specific flags once the feature is complete.
901908
config_define_if_not(LIBCXX_ENABLE_INCOMPLETE_FEATURES _LIBCPP_HAS_NO_INCOMPLETE_FORMAT)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
set(LIBCXX_ENABLE_ASSERTIONS ON CACHE BOOL "")
2+
set(LIBCXX_TEST_PARAMS "enable_assertions=True" CACHE STRING "")
3+
set(LIBCXXABI_TEST_PARAMS "enable_assertions=True" CACHE STRING "")

libcxx/docs/BuildingLibcxx.rst

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,10 @@ libc++ specific options
216216

217217
**Default**: ``OFF``
218218

219-
Build libc++ with assertions enabled.
219+
Build libc++ with assertions enabled in the compiled library, and enable assertions
220+
by default when building user code as well. Assertions can be turned off by users
221+
by defining ``_LIBCPP_ENABLE_ASSERTIONS=0``. For details, see
222+
:ref:`the documentation <assertions-mode>`.
220223

221224
.. option:: LIBCXX_ENABLE_SHARED:BOOL
222225

libcxx/docs/ReleaseNotes.rst

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,12 @@ New Features
4646
"heapsort with bounce" to reduce the number of comparisons, and rearranges
4747
elements using move-assignment instead of `swap`.
4848

49+
- Libc++ now supports a variety of assertions that can be turned on to help catch
50+
undefined behavior in user code. This new support is now separate from the old
51+
(and incomplete) Debug Mode. Vendors can select whether the library they ship
52+
should include assertions or not by default. For details, see
53+
:ref:`the documentation <assertions-mode>` about this new feature.
54+
4955
API Changes
5056
-----------
5157

@@ -74,6 +80,10 @@ API Changes
7480
- The C++14 function ``std::quoted(const char*)`` is no longer supported in
7581
C++03 or C++11 modes.
7682

83+
- Setting a custom debug handler with ``std::__libcpp_debug_function`` is not
84+
supported anymore. Please migrate to using the new support for
85+
:ref:`assertions <assertions-mode>` instead.
86+
7787
ABI Changes
7888
-----------
7989

libcxx/docs/UsingLibcxx.rst

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,92 @@ provide pretty-printers itself. Those can be used as:
121121
<args>
122122
123123
124+
.. _assertions-mode:
125+
126+
Enabling the "safe libc++" mode
127+
===============================
128+
129+
Libc++ contains a number of assertions whose goal is to catch undefined behavior in the
130+
library, usually caused by precondition violations. Those assertions do not aim to be
131+
exhaustive -- instead they aim to provide a good balance between safety and performance.
132+
In particular, these assertions do not change the complexity of algorithms. However, they
133+
might, in some cases, interfere with compiler optimizations.
134+
135+
By default, these assertions are turned off. Vendors can decide to turn them on while building
136+
the compiled library by defining ``LIBCXX_ENABLE_ASSERTIONS=ON`` at CMake configuration time.
137+
When ``LIBCXX_ENABLE_ASSERTIONS`` is used, the compiled library will be built with assertions
138+
enabled, **and** user code will be built with assertions enabled by default. If
139+
``LIBCXX_ENABLE_ASSERTIONS=OFF`` at CMake configure time, the compiled library will not contain
140+
assertions and the default when building user code will be to have assertions disabled.
141+
As a user, you can consult your vendor to know whether assertions are enabled by default.
142+
143+
Furthermore, independently of any vendor-selected default, users can always control whether
144+
assertions are enabled in their code by defining ``_LIBCPP_ENABLE_ASSERTIONS=0|1`` before
145+
including any libc++ header (we recommend passing ``-D_LIBCPP_ENABLE_ASSERTIONS=X`` to the
146+
compiler). Note that if the compiled library was built by the vendor without assertions,
147+
functions compiled inside the static or shared library won't have assertions enabled even
148+
if the user defines ``_LIBCPP_ENABLE_ASSERTIONS=1`` (the same is true for the inverse case
149+
where the static or shared library was compiled **with** assertions but the user tries to
150+
disable them). However, most of the code in libc++ is in the headers, so the user-selected
151+
value for ``_LIBCPP_ENABLE_ASSERTIONS`` (if any) will usually be respected.
152+
153+
When an assertion fails, an assertion handler function is called. The library provides a default
154+
assertion handler that prints an error message and calls ``std::abort()``. Note that this assertion
155+
handler is provided by the static or shared library, so it is only available when deploying to a
156+
platform where the compiled library is sufficiently recent. However, users can also override that
157+
assertion handler with their own, which can be useful to provide custom behavior, or when deploying
158+
to older platforms where the default assertion handler isn't available.
159+
160+
Replacing the default assertion handler is done by defining the following function:
161+
162+
.. code-block:: cpp
163+
164+
void __libcpp_assertion_handler(char const* file, int line, char const* expression, char const* message)
165+
166+
This mechanism is similar to how one can replace the default definition of ``operator new``
167+
and ``operator delete``. For example:
168+
169+
.. code-block:: cpp
170+
171+
// In HelloWorldHandler.cpp
172+
#include <__assert> // must include <__assert> before defining the handler
173+
174+
void std::__libcpp_assertion_handler(char const* file, int line, char const* expression, char const* message) {
175+
std::printf("Assertion %s failed at %s:%d, more info: %s", expression, file, line, message);
176+
std::abort();
177+
}
178+
179+
// In HelloWorld.cpp
180+
#include <vector>
181+
182+
int main() {
183+
std::vector<int> v;
184+
int& x = v[0]; // Your assertion handler will be called here if _LIBCPP_ENABLE_ASSERTIONS=1
185+
}
186+
187+
Also note that the assertion handler should usually not return. Since the assertions in libc++
188+
catch undefined behavior, your code will proceed with undefined behavior if your assertion
189+
handler is called and does return.
190+
191+
Furthermore, throwing an exception from the assertion handler is not recommended. Indeed, many
192+
functions in the library are ``noexcept``, and any exception thrown from the assertion handler
193+
will result in ``std::terminate`` being called.
194+
195+
Back-deploying with a custom assertion handler
196+
----------------------------------------------
197+
When deploying to an older platform that does not provide a default assertion handler, the
198+
compiler will diagnose the usage of ``std::__libcpp_assertion_handler`` with an error. This
199+
is done to avoid the load-time error that would otherwise happen if the code was being deployed
200+
on the older system.
201+
202+
If you are providing a custom assertion handler, this error is effectively a false positive.
203+
To let the library know that you are providing a custom assertion handler in back-deployment
204+
scenarios, you must define the ``_LIBCPP_AVAILABILITY_CUSTOM_ASSERTION_HANDLER_PROVIDED`` macro,
205+
and the library will assume that you are providing your own definition. If no definition is
206+
provided and the code is back-deployed to the older platform, it will fail to load when the
207+
dynamic linker fails to find a definition for ``std::__libcpp_assertion_handler``, so you
208+
should only remove the guard rails if you really mean it!
209+
124210
Libc++ Configuration Macros
125211
===========================
126212

libcxx/include/__assert

Lines changed: 21 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -10,52 +10,39 @@
1010
#ifndef _LIBCPP___ASSERT
1111
#define _LIBCPP___ASSERT
1212

13+
#include <__availability>
1314
#include <__config>
14-
#include <iosfwd> // for std::string
1515

1616
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1717
# pragma GCC system_header
1818
#endif
1919

20+
// This is for backwards compatibility with code that might have been enabling
21+
// assertions through the Debug mode previously.
2022
#if _LIBCPP_DEBUG_LEVEL >= 1
21-
# define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : ::std::__libcpp_debug_function(::std::__libcpp_debug_info(__FILE__, __LINE__, #x, m)))
23+
# ifndef _LIBCPP_ENABLE_ASSERTIONS
24+
# define _LIBCPP_ENABLE_ASSERTIONS 1
25+
# endif
26+
#endif
27+
28+
#ifndef _LIBCPP_ENABLE_ASSERTIONS
29+
# define _LIBCPP_ENABLE_ASSERTIONS _LIBCPP_ENABLE_ASSERTIONS_DEFAULT
30+
#endif
31+
32+
#if _LIBCPP_ENABLE_ASSERTIONS != 0 && _LIBCPP_ENABLE_ASSERTIONS != 1
33+
# error "_LIBCPP_ENABLE_ASSERTIONS must be set to 0 or 1"
34+
#endif
35+
36+
#if _LIBCPP_ENABLE_ASSERTIONS
37+
# define _LIBCPP_ASSERT(expression, message) ((expression) ? (void)0 : ::std::__libcpp_assertion_handler(__FILE__, __LINE__, #expression, message))
2238
#else
23-
# define _LIBCPP_ASSERT(x, m) ((void)0)
39+
# define _LIBCPP_ASSERT(x, m) ((void)0)
2440
#endif
2541

2642
_LIBCPP_BEGIN_NAMESPACE_STD
2743

28-
struct _LIBCPP_TEMPLATE_VIS __libcpp_debug_info {
29-
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
30-
__libcpp_debug_info()
31-
: __file_(nullptr), __line_(-1), __pred_(nullptr), __msg_(nullptr) {}
32-
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
33-
__libcpp_debug_info(const char* __f, int __l, const char* __p, const char* __m)
34-
: __file_(__f), __line_(__l), __pred_(__p), __msg_(__m) {}
35-
36-
_LIBCPP_FUNC_VIS string what() const;
37-
38-
const char* __file_;
39-
int __line_;
40-
const char* __pred_;
41-
const char* __msg_;
42-
};
43-
44-
/// __libcpp_debug_function_type - The type of the assertion failure handler.
45-
typedef void(*__libcpp_debug_function_type)(__libcpp_debug_info const&);
46-
47-
/// __libcpp_debug_function - The handler function called when a _LIBCPP_ASSERT
48-
/// fails.
49-
extern _LIBCPP_EXPORTED_FROM_ABI __libcpp_debug_function_type __libcpp_debug_function;
50-
51-
/// __libcpp_abort_debug_function - A debug handler that aborts when called.
52-
_LIBCPP_NORETURN _LIBCPP_FUNC_VIS
53-
void __libcpp_abort_debug_function(__libcpp_debug_info const&);
54-
55-
/// __libcpp_set_debug_function - Set the debug handler to the specified
56-
/// function.
57-
_LIBCPP_FUNC_VIS
58-
bool __libcpp_set_debug_function(__libcpp_debug_function_type __func);
44+
_LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_AVAILABILITY_ASSERTION_HANDLER
45+
void __libcpp_assertion_handler(char const* __file, int __line, char const* __expression, char const* __message);
5946

6047
_LIBCPP_END_NAMESPACE_STD
6148

libcxx/include/__availability

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,23 @@
159159
# define _LIBCPP_AVAILABILITY_FORMAT
160160
// # define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_format
161161

162+
// This controls whether the std::__libcpp_assertion_handler default
163+
// assertion handler is provided by the library.
164+
//
165+
// Note that when users provide their own custom assertion handler,
166+
// it doesn't matter whether the dylib provides a default handler,
167+
// and the availability markup can actually give a false positive
168+
// diagnostic (it will think that no handler is provided, when in
169+
// reality the user has provided their own).
170+
//
171+
// Users can pass -D_LIBCPP_AVAILABILITY_CUSTOM_ASSERTION_HANDLER_PROVIDED
172+
// to the compiler to tell the library to ignore the fact that the
173+
// default handler isn't available on their deployment target. Note that
174+
// defining this macro but failing to define a custom assertion handler
175+
// will lead to a load-time error on back-deployment targets, so it
176+
// should be avoided.
177+
# define _LIBCPP_AVAILABILITY_DEFAULT_ASSERTION_HANDLER
178+
162179
#elif defined(__APPLE__)
163180

164181
# define _LIBCPP_AVAILABILITY_SHARED_MUTEX \
@@ -260,6 +277,9 @@
260277
# define _LIBCPP_AVAILABILITY_FORMAT \
261278
__attribute__((unavailable))
262279
# define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_format
280+
281+
# define _LIBCPP_AVAILABILITY_DEFAULT_ASSERTION_HANDLER \
282+
__attribute__((unavailable))
263283
#else
264284

265285
// ...New vendors can add availability markup here...
@@ -283,4 +303,14 @@
283303
# define _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS
284304
#endif
285305

306+
// Define the special assertion handler availability attribute, which can be silenced by
307+
// users if they provide their own custom assertion handler. The rest of the code should
308+
// not use the *_DEFAULT_* macro directly, since that would make it ignore the fact that
309+
// the user provided a custom handler.
310+
#if defined(_LIBCPP_AVAILABILITY_CUSTOM_ASSERTION_HANDLER_PROVIDED)
311+
# define _LIBCPP_AVAILABILITY_ASSERTION_HANDLER /* nothing */
312+
#else
313+
# define _LIBCPP_AVAILABILITY_ASSERTION_HANDLER _LIBCPP_AVAILABILITY_DEFAULT_ASSERTION_HANDLER
314+
#endif
315+
286316
#endif // _LIBCPP___AVAILABILITY

libcxx/include/__config_site.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#cmakedefine _LIBCPP_HAS_NO_WIDE_CHARACTERS
3333
#cmakedefine _LIBCPP_HAS_NO_INCOMPLETE_FORMAT
3434
#cmakedefine _LIBCPP_HAS_NO_INCOMPLETE_RANGES
35+
#cmakedefine01 _LIBCPP_ENABLE_ASSERTIONS_DEFAULT
3536

3637
// __USE_MINGW_ANSI_STDIO gets redefined on MinGW
3738
#ifdef __clang__

libcxx/lib/abi/arm64-apple-darwin.libcxxabi.v1.stable.exceptions.nonew.debug.incomplete.abilist

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1561,6 +1561,7 @@
15611561
{'is_defined': True, 'name': '__ZNSt3__123__libcpp_atomic_monitorEPVKv', 'type': 'FUNC'}
15621562
{'is_defined': True, 'name': '__ZNSt3__123__libcpp_debug_functionE', 'size': 0, 'type': 'OBJECT'}
15631563
{'is_defined': True, 'name': '__ZNSt3__125notify_all_at_thread_exitERNS_18condition_variableENS_11unique_lockINS_5mutexEEE', 'type': 'FUNC'}
1564+
{'is_defined': True, 'name': '__ZNSt3__126__libcpp_assertion_handlerEPKciS1_S1_', 'type': 'FUNC'}
15641565
{'is_defined': True, 'name': '__ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIaaEEPaEEbT0_S5_T_', 'type': 'FUNC'}
15651566
{'is_defined': True, 'name': '__ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIccEEPcEEbT0_S5_T_', 'type': 'FUNC'}
15661567
{'is_defined': True, 'name': '__ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIddEEPdEEbT0_S5_T_', 'type': 'FUNC'}

libcxx/lib/abi/arm64-apple-darwin.libcxxabi.v1.stable.exceptions.nonew.nodebug.noincomplete.abilist

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1534,6 +1534,7 @@
15341534
{'is_defined': True, 'name': '__ZNSt3__123__libcpp_atomic_monitorEPVKNS_17__cxx_atomic_implIxNS_22__cxx_atomic_base_implIxEEEE', 'type': 'FUNC'}
15351535
{'is_defined': True, 'name': '__ZNSt3__123__libcpp_atomic_monitorEPVKv', 'type': 'FUNC'}
15361536
{'is_defined': True, 'name': '__ZNSt3__125notify_all_at_thread_exitERNS_18condition_variableENS_11unique_lockINS_5mutexEEE', 'type': 'FUNC'}
1537+
{'is_defined': True, 'name': '__ZNSt3__126__libcpp_assertion_handlerEPKciS1_S1_', 'type': 'FUNC'}
15371538
{'is_defined': True, 'name': '__ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIaaEEPaEEbT0_S5_T_', 'type': 'FUNC'}
15381539
{'is_defined': True, 'name': '__ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIccEEPcEEbT0_S5_T_', 'type': 'FUNC'}
15391540
{'is_defined': True, 'name': '__ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIddEEPdEEbT0_S5_T_', 'type': 'FUNC'}

libcxx/lib/abi/x86_64-apple-darwin.libcxxabi.v1.stable.exceptions.nonew.debug.incomplete.abilist

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1561,6 +1561,7 @@
15611561
{'is_defined': True, 'name': '__ZNSt3__123__libcpp_atomic_monitorEPVKv', 'type': 'FUNC'}
15621562
{'is_defined': True, 'name': '__ZNSt3__123__libcpp_debug_functionE', 'size': 0, 'type': 'OBJECT'}
15631563
{'is_defined': True, 'name': '__ZNSt3__125notify_all_at_thread_exitERNS_18condition_variableENS_11unique_lockINS_5mutexEEE', 'type': 'FUNC'}
1564+
{'is_defined': True, 'name': '__ZNSt3__126__libcpp_assertion_handlerEPKciS1_S1_', 'type': 'FUNC'}
15641565
{'is_defined': True, 'name': '__ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIaaEEPaEEbT0_S5_T_', 'type': 'FUNC'}
15651566
{'is_defined': True, 'name': '__ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIccEEPcEEbT0_S5_T_', 'type': 'FUNC'}
15661567
{'is_defined': True, 'name': '__ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIddEEPdEEbT0_S5_T_', 'type': 'FUNC'}

libcxx/lib/abi/x86_64-apple-darwin.libcxxabi.v1.stable.exceptions.nonew.nodebug.noincomplete.abilist

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1534,6 +1534,7 @@
15341534
{'is_defined': True, 'name': '__ZNSt3__123__libcpp_atomic_monitorEPVKNS_17__cxx_atomic_implIxNS_22__cxx_atomic_base_implIxEEEE', 'type': 'FUNC'}
15351535
{'is_defined': True, 'name': '__ZNSt3__123__libcpp_atomic_monitorEPVKv', 'type': 'FUNC'}
15361536
{'is_defined': True, 'name': '__ZNSt3__125notify_all_at_thread_exitERNS_18condition_variableENS_11unique_lockINS_5mutexEEE', 'type': 'FUNC'}
1537+
{'is_defined': True, 'name': '__ZNSt3__126__libcpp_assertion_handlerEPKciS1_S1_', 'type': 'FUNC'}
15371538
{'is_defined': True, 'name': '__ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIaaEEPaEEbT0_S5_T_', 'type': 'FUNC'}
15381539
{'is_defined': True, 'name': '__ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIccEEPcEEbT0_S5_T_', 'type': 'FUNC'}
15391540
{'is_defined': True, 'name': '__ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIddEEPdEEbT0_S5_T_', 'type': 'FUNC'}

libcxx/lib/abi/x86_64-unknown-linux-gnu.libcxxabi.v1.stable.exceptions.nonew.debug.incomplete.abilist

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1252,6 +1252,7 @@
12521252
{'is_defined': True, 'name': '_ZNSt3__123__libcpp_atomic_monitorEPVKv', 'type': 'FUNC'}
12531253
{'is_defined': True, 'name': '_ZNSt3__123__libcpp_debug_functionE', 'size': 8, 'type': 'OBJECT'}
12541254
{'is_defined': True, 'name': '_ZNSt3__125notify_all_at_thread_exitERNS_18condition_variableENS_11unique_lockINS_5mutexEEE', 'type': 'FUNC'}
1255+
{'is_defined': True, 'name': '_ZNSt3__126__libcpp_assertion_handlerEPKciS1_S1_', 'type': 'FUNC'}
12551256
{'is_defined': True, 'name': '_ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIaaEEPaEEbT0_S5_T_', 'type': 'FUNC'}
12561257
{'is_defined': True, 'name': '_ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIccEEPcEEbT0_S5_T_', 'type': 'FUNC'}
12571258
{'is_defined': True, 'name': '_ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIddEEPdEEbT0_S5_T_', 'type': 'FUNC'}

libcxx/lib/abi/x86_64-unknown-linux-gnu.libcxxabi.v1.stable.exceptions.nonew.debug.noincomplete.abilist

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1249,6 +1249,7 @@
12491249
{'is_defined': True, 'name': '_ZNSt3__123__libcpp_atomic_monitorEPVKv', 'type': 'FUNC'}
12501250
{'is_defined': True, 'name': '_ZNSt3__123__libcpp_debug_functionE', 'size': 8, 'type': 'OBJECT'}
12511251
{'is_defined': True, 'name': '_ZNSt3__125notify_all_at_thread_exitERNS_18condition_variableENS_11unique_lockINS_5mutexEEE', 'type': 'FUNC'}
1252+
{'is_defined': True, 'name': '_ZNSt3__126__libcpp_assertion_handlerEPKciS1_S1_', 'type': 'FUNC'}
12521253
{'is_defined': True, 'name': '_ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIaaEEPaEEbT0_S5_T_', 'type': 'FUNC'}
12531254
{'is_defined': True, 'name': '_ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIccEEPcEEbT0_S5_T_', 'type': 'FUNC'}
12541255
{'is_defined': True, 'name': '_ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIddEEPdEEbT0_S5_T_', 'type': 'FUNC'}

libcxx/lib/abi/x86_64-unknown-linux-gnu.libcxxabi.v1.stable.exceptions.nonew.nodebug.incomplete.abilist

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1228,6 +1228,7 @@
12281228
{'is_defined': True, 'name': '_ZNSt3__123__libcpp_atomic_monitorEPVKNS_17__cxx_atomic_implIiNS_22__cxx_atomic_base_implIiEEEE', 'type': 'FUNC'}
12291229
{'is_defined': True, 'name': '_ZNSt3__123__libcpp_atomic_monitorEPVKv', 'type': 'FUNC'}
12301230
{'is_defined': True, 'name': '_ZNSt3__125notify_all_at_thread_exitERNS_18condition_variableENS_11unique_lockINS_5mutexEEE', 'type': 'FUNC'}
1231+
{'is_defined': True, 'name': '_ZNSt3__126__libcpp_assertion_handlerEPKciS1_S1_', 'type': 'FUNC'}
12311232
{'is_defined': True, 'name': '_ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIaaEEPaEEbT0_S5_T_', 'type': 'FUNC'}
12321233
{'is_defined': True, 'name': '_ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIccEEPcEEbT0_S5_T_', 'type': 'FUNC'}
12331234
{'is_defined': True, 'name': '_ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIddEEPdEEbT0_S5_T_', 'type': 'FUNC'}

libcxx/lib/abi/x86_64-unknown-linux-gnu.libcxxabi.v1.stable.noexceptions.nonew.debug.incomplete.abilist

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1224,6 +1224,7 @@
12241224
{'is_defined': True, 'name': '_ZNSt3__123__libcpp_atomic_monitorEPVKv', 'type': 'FUNC'}
12251225
{'is_defined': True, 'name': '_ZNSt3__123__libcpp_debug_functionE', 'size': 8, 'type': 'OBJECT'}
12261226
{'is_defined': True, 'name': '_ZNSt3__125notify_all_at_thread_exitERNS_18condition_variableENS_11unique_lockINS_5mutexEEE', 'type': 'FUNC'}
1227+
{'is_defined': True, 'name': '_ZNSt3__126__libcpp_assertion_handlerEPKciS1_S1_', 'type': 'FUNC'}
12271228
{'is_defined': True, 'name': '_ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIaaEEPaEEbT0_S5_T_', 'type': 'FUNC'}
12281229
{'is_defined': True, 'name': '_ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIccEEPcEEbT0_S5_T_', 'type': 'FUNC'}
12291230
{'is_defined': True, 'name': '_ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIddEEPdEEbT0_S5_T_', 'type': 'FUNC'}

0 commit comments

Comments
 (0)