2011-09-15 02:33:51 +08:00
|
|
|
// -*- C++ -*-
|
2021-11-18 05:25:01 +08:00
|
|
|
//===----------------------------------------------------------------------===//
|
2011-09-15 02:33:51 +08:00
|
|
|
//
|
2019-01-19 18:56:40 +08:00
|
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
2011-09-15 02:33:51 +08:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2022-03-24 01:11:04 +08:00
|
|
|
#ifndef _LIBCPP___DEBUG
|
|
|
|
#define _LIBCPP___DEBUG
|
2011-09-15 02:33:51 +08:00
|
|
|
|
2022-02-15 02:41:09 +08:00
|
|
|
#include <__assert>
|
2014-08-11 07:53:08 +08:00
|
|
|
#include <__config>
|
2022-06-21 05:10:53 +08:00
|
|
|
#include <cstddef>
|
2022-01-11 07:33:35 +08:00
|
|
|
#include <type_traits>
|
2014-08-11 07:53:08 +08:00
|
|
|
|
2013-08-24 01:37:05 +08:00
|
|
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
2022-02-02 09:16:40 +08:00
|
|
|
# pragma GCC system_header
|
2013-08-24 01:37:05 +08:00
|
|
|
#endif
|
|
|
|
|
[libc++] Make the Debug mode a configuration-time only option
The debug mode has been broken pretty much ever since it was shipped
because it was possible to enable the debug mode in user code without
actually enabling it in the dylib, leading to ODR violations that
caused various kinds of failures.
This commit makes the debug mode a knob that is configured when
building the library and which can't be changed afterwards. This is
less flexible for users, however it will actually work as intended
and it will allow us, in the future, to add various kinds of checks
that do not assume the same ABI as the normal library. Furthermore,
this will make the debug mode more robust, which means that vendors
might be more tempted to support it properly, which hasn't been the
case with the current debug mode.
This patch shouldn't break any user code, except folks who are building
against a library that doesn't have the debug mode enabled and who try
to enable the debug mode in their code. Such users will get a compile-time
error explaining that this configuration isn't supported anymore.
In the future, we should further increase the granularity of the debug
mode checks so that we can cherry-pick which checks to enable, like we
do for unspecified behavior randomization.
Differential Revision: https://reviews.llvm.org/D122941
2022-04-02 04:38:30 +08:00
|
|
|
// Catch invalid uses of the legacy _LIBCPP_DEBUG toggle.
|
|
|
|
#if defined(_LIBCPP_DEBUG) && _LIBCPP_DEBUG != 0 && !defined(_LIBCPP_ENABLE_DEBUG_MODE)
|
|
|
|
# error "Enabling the debug mode now requires having configured the library with support for the debug mode"
|
2016-12-28 12:58:52 +08:00
|
|
|
#endif
|
|
|
|
|
[libc++] Make the Debug mode a configuration-time only option
The debug mode has been broken pretty much ever since it was shipped
because it was possible to enable the debug mode in user code without
actually enabling it in the dylib, leading to ODR violations that
caused various kinds of failures.
This commit makes the debug mode a knob that is configured when
building the library and which can't be changed afterwards. This is
less flexible for users, however it will actually work as intended
and it will allow us, in the future, to add various kinds of checks
that do not assume the same ABI as the normal library. Furthermore,
this will make the debug mode more robust, which means that vendors
might be more tempted to support it properly, which hasn't been the
case with the current debug mode.
This patch shouldn't break any user code, except folks who are building
against a library that doesn't have the debug mode enabled and who try
to enable the debug mode in their code. Such users will get a compile-time
error explaining that this configuration isn't supported anymore.
In the future, we should further increase the granularity of the debug
mode checks so that we can cherry-pick which checks to enable, like we
do for unspecified behavior randomization.
Differential Revision: https://reviews.llvm.org/D122941
2022-04-02 04:38:30 +08:00
|
|
|
#if defined(_LIBCPP_ENABLE_DEBUG_MODE) && !defined(_LIBCPP_CXX03_LANG) && !defined(_LIBCPP_DEBUG_RANDOMIZE_UNSPECIFIED_STABILITY)
|
|
|
|
# define _LIBCPP_DEBUG_RANDOMIZE_UNSPECIFIED_STABILITY
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef _LIBCPP_ENABLE_DEBUG_MODE
|
2022-02-05 04:37:01 +08:00
|
|
|
# define _LIBCPP_DEBUG_ASSERT(x, m) _LIBCPP_ASSERT(::std::__libcpp_is_constant_evaluated() || (x), m)
|
2020-10-03 03:02:52 +08:00
|
|
|
#else
|
[libc++] Make the Debug mode a configuration-time only option
The debug mode has been broken pretty much ever since it was shipped
because it was possible to enable the debug mode in user code without
actually enabling it in the dylib, leading to ODR violations that
caused various kinds of failures.
This commit makes the debug mode a knob that is configured when
building the library and which can't be changed afterwards. This is
less flexible for users, however it will actually work as intended
and it will allow us, in the future, to add various kinds of checks
that do not assume the same ABI as the normal library. Furthermore,
this will make the debug mode more robust, which means that vendors
might be more tempted to support it properly, which hasn't been the
case with the current debug mode.
This patch shouldn't break any user code, except folks who are building
against a library that doesn't have the debug mode enabled and who try
to enable the debug mode in their code. Such users will get a compile-time
error explaining that this configuration isn't supported anymore.
In the future, we should further increase the granularity of the debug
mode checks so that we can cherry-pick which checks to enable, like we
do for unspecified behavior randomization.
Differential Revision: https://reviews.llvm.org/D122941
2022-04-02 04:38:30 +08:00
|
|
|
# define _LIBCPP_DEBUG_ASSERT(x, m) ((void)0)
|
2016-07-24 04:36:55 +08:00
|
|
|
#endif
|
2020-10-03 03:02:52 +08:00
|
|
|
|
[libc++] Make the Debug mode a configuration-time only option
The debug mode has been broken pretty much ever since it was shipped
because it was possible to enable the debug mode in user code without
actually enabling it in the dylib, leading to ODR violations that
caused various kinds of failures.
This commit makes the debug mode a knob that is configured when
building the library and which can't be changed afterwards. This is
less flexible for users, however it will actually work as intended
and it will allow us, in the future, to add various kinds of checks
that do not assume the same ABI as the normal library. Furthermore,
this will make the debug mode more robust, which means that vendors
might be more tempted to support it properly, which hasn't been the
case with the current debug mode.
This patch shouldn't break any user code, except folks who are building
against a library that doesn't have the debug mode enabled and who try
to enable the debug mode in their code. Such users will get a compile-time
error explaining that this configuration isn't supported anymore.
In the future, we should further increase the granularity of the debug
mode checks so that we can cherry-pick which checks to enable, like we
do for unspecified behavior randomization.
Differential Revision: https://reviews.llvm.org/D122941
2022-04-02 04:38:30 +08:00
|
|
|
#if defined(_LIBCPP_ENABLE_DEBUG_MODE) || defined(_LIBCPP_BUILDING_LIBRARY)
|
|
|
|
|
|
|
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
2016-12-28 12:58:52 +08:00
|
|
|
|
2013-03-07 07:30:19 +08:00
|
|
|
struct _LIBCPP_TYPE_VIS __c_node;
|
2011-09-15 02:33:51 +08:00
|
|
|
|
2013-03-07 07:30:19 +08:00
|
|
|
struct _LIBCPP_TYPE_VIS __i_node
|
2011-09-15 02:33:51 +08:00
|
|
|
{
|
|
|
|
void* __i_;
|
|
|
|
__i_node* __next_;
|
|
|
|
__c_node* __c_;
|
|
|
|
|
|
|
|
__i_node(const __i_node&) = delete;
|
|
|
|
__i_node& operator=(const __i_node&) = delete;
|
2022-02-17 01:55:43 +08:00
|
|
|
|
2011-09-15 02:33:51 +08:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
__i_node(void* __i, __i_node* __next, __c_node* __c)
|
|
|
|
: __i_(__i), __next_(__next), __c_(__c) {}
|
|
|
|
~__i_node();
|
|
|
|
};
|
|
|
|
|
2013-03-07 07:30:19 +08:00
|
|
|
struct _LIBCPP_TYPE_VIS __c_node
|
2011-09-15 02:33:51 +08:00
|
|
|
{
|
|
|
|
void* __c_;
|
|
|
|
__c_node* __next_;
|
|
|
|
__i_node** beg_;
|
|
|
|
__i_node** end_;
|
|
|
|
__i_node** cap_;
|
|
|
|
|
|
|
|
__c_node(const __c_node&) = delete;
|
|
|
|
__c_node& operator=(const __c_node&) = delete;
|
2022-02-17 01:55:43 +08:00
|
|
|
|
2011-09-15 02:33:51 +08:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2022-02-10 06:30:46 +08:00
|
|
|
explicit __c_node(void* __c, __c_node* __next)
|
2011-09-15 02:33:51 +08:00
|
|
|
: __c_(__c), __next_(__next), beg_(nullptr), end_(nullptr), cap_(nullptr) {}
|
|
|
|
virtual ~__c_node();
|
|
|
|
|
|
|
|
virtual bool __dereferenceable(const void*) const = 0;
|
|
|
|
virtual bool __decrementable(const void*) const = 0;
|
|
|
|
virtual bool __addable(const void*, ptrdiff_t) const = 0;
|
|
|
|
virtual bool __subscriptable(const void*, ptrdiff_t) const = 0;
|
|
|
|
|
2011-09-28 07:55:03 +08:00
|
|
|
void __add(__i_node* __i);
|
2011-09-15 02:33:51 +08:00
|
|
|
_LIBCPP_HIDDEN void __remove(__i_node* __i);
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class _Cont>
|
|
|
|
struct _C_node
|
|
|
|
: public __c_node
|
|
|
|
{
|
2022-02-10 06:30:46 +08:00
|
|
|
explicit _C_node(void* __c, __c_node* __n)
|
2011-09-15 02:33:51 +08:00
|
|
|
: __c_node(__c, __n) {}
|
|
|
|
|
|
|
|
virtual bool __dereferenceable(const void*) const;
|
|
|
|
virtual bool __decrementable(const void*) const;
|
|
|
|
virtual bool __addable(const void*, ptrdiff_t) const;
|
|
|
|
virtual bool __subscriptable(const void*, ptrdiff_t) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class _Cont>
|
2016-12-28 12:58:52 +08:00
|
|
|
inline bool
|
2011-09-15 02:33:51 +08:00
|
|
|
_C_node<_Cont>::__dereferenceable(const void* __i) const
|
|
|
|
{
|
|
|
|
typedef typename _Cont::const_iterator iterator;
|
|
|
|
const iterator* __j = static_cast<const iterator*>(__i);
|
2011-11-30 02:15:50 +08:00
|
|
|
_Cont* _Cp = static_cast<_Cont*>(__c_);
|
|
|
|
return _Cp->__dereferenceable(__j);
|
2011-09-15 02:33:51 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class _Cont>
|
2016-12-28 12:58:52 +08:00
|
|
|
inline bool
|
2011-09-15 02:33:51 +08:00
|
|
|
_C_node<_Cont>::__decrementable(const void* __i) const
|
|
|
|
{
|
|
|
|
typedef typename _Cont::const_iterator iterator;
|
|
|
|
const iterator* __j = static_cast<const iterator*>(__i);
|
2011-11-30 02:15:50 +08:00
|
|
|
_Cont* _Cp = static_cast<_Cont*>(__c_);
|
|
|
|
return _Cp->__decrementable(__j);
|
2011-09-15 02:33:51 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class _Cont>
|
2016-12-28 12:58:52 +08:00
|
|
|
inline bool
|
2011-09-15 02:33:51 +08:00
|
|
|
_C_node<_Cont>::__addable(const void* __i, ptrdiff_t __n) const
|
|
|
|
{
|
|
|
|
typedef typename _Cont::const_iterator iterator;
|
|
|
|
const iterator* __j = static_cast<const iterator*>(__i);
|
2011-11-30 02:15:50 +08:00
|
|
|
_Cont* _Cp = static_cast<_Cont*>(__c_);
|
|
|
|
return _Cp->__addable(__j, __n);
|
2011-09-15 02:33:51 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class _Cont>
|
2016-12-28 12:58:52 +08:00
|
|
|
inline bool
|
2011-09-15 02:33:51 +08:00
|
|
|
_C_node<_Cont>::__subscriptable(const void* __i, ptrdiff_t __n) const
|
|
|
|
{
|
|
|
|
typedef typename _Cont::const_iterator iterator;
|
|
|
|
const iterator* __j = static_cast<const iterator*>(__i);
|
2011-11-30 02:15:50 +08:00
|
|
|
_Cont* _Cp = static_cast<_Cont*>(__c_);
|
|
|
|
return _Cp->__subscriptable(__j, __n);
|
2011-09-15 02:33:51 +08:00
|
|
|
}
|
|
|
|
|
2013-03-07 07:30:19 +08:00
|
|
|
class _LIBCPP_TYPE_VIS __libcpp_db
|
2011-09-15 02:33:51 +08:00
|
|
|
{
|
|
|
|
__c_node** __cbeg_;
|
|
|
|
__c_node** __cend_;
|
|
|
|
size_t __csz_;
|
|
|
|
__i_node** __ibeg_;
|
|
|
|
__i_node** __iend_;
|
|
|
|
size_t __isz_;
|
|
|
|
|
2022-02-10 06:30:46 +08:00
|
|
|
explicit __libcpp_db();
|
2011-09-15 02:33:51 +08:00
|
|
|
public:
|
|
|
|
__libcpp_db(const __libcpp_db&) = delete;
|
|
|
|
__libcpp_db& operator=(const __libcpp_db&) = delete;
|
2022-02-17 01:55:43 +08:00
|
|
|
|
2011-09-15 02:33:51 +08:00
|
|
|
~__libcpp_db();
|
|
|
|
|
|
|
|
class __db_c_iterator;
|
|
|
|
class __db_c_const_iterator;
|
|
|
|
class __db_i_iterator;
|
|
|
|
class __db_i_const_iterator;
|
|
|
|
|
|
|
|
__db_c_const_iterator __c_end() const;
|
|
|
|
__db_i_const_iterator __i_end() const;
|
|
|
|
|
2019-03-05 10:10:31 +08:00
|
|
|
typedef __c_node*(_InsertConstruct)(void*, void*, __c_node*);
|
|
|
|
|
|
|
|
template <class _Cont>
|
|
|
|
_LIBCPP_INLINE_VISIBILITY static __c_node* __create_C_node(void *__mem, void *__c, __c_node *__next) {
|
2020-12-12 09:30:28 +08:00
|
|
|
return ::new (__mem) _C_node<_Cont>(__c, __next);
|
2019-03-05 10:10:31 +08:00
|
|
|
}
|
|
|
|
|
2011-09-15 02:33:51 +08:00
|
|
|
template <class _Cont>
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
void __insert_c(_Cont* __c)
|
|
|
|
{
|
2019-03-05 10:10:31 +08:00
|
|
|
__insert_c(static_cast<void*>(__c), &__create_C_node<_Cont>);
|
2011-09-15 02:33:51 +08:00
|
|
|
}
|
|
|
|
|
2011-09-17 03:52:23 +08:00
|
|
|
void __insert_i(void* __i);
|
2019-03-05 10:10:31 +08:00
|
|
|
void __insert_c(void* __c, _InsertConstruct* __fn);
|
2011-09-15 02:33:51 +08:00
|
|
|
void __erase_c(void* __c);
|
|
|
|
|
|
|
|
void __insert_ic(void* __i, const void* __c);
|
|
|
|
void __iterator_copy(void* __i, const void* __i0);
|
|
|
|
void __erase_i(void* __i);
|
|
|
|
|
|
|
|
void* __find_c_from_i(void* __i) const;
|
|
|
|
void __invalidate_all(void* __c);
|
|
|
|
__c_node* __find_c_and_lock(void* __c) const;
|
2011-09-28 07:55:03 +08:00
|
|
|
__c_node* __find_c(void* __c) const;
|
2011-09-15 02:33:51 +08:00
|
|
|
void unlock() const;
|
|
|
|
|
|
|
|
void swap(void* __c1, void* __c2);
|
|
|
|
|
|
|
|
|
|
|
|
bool __dereferenceable(const void* __i) const;
|
|
|
|
bool __decrementable(const void* __i) const;
|
|
|
|
bool __addable(const void* __i, ptrdiff_t __n) const;
|
|
|
|
bool __subscriptable(const void* __i, ptrdiff_t __n) const;
|
Ok, 3 major changes for debug mode in one commit:
1. I had been detecting and trapping iterator == and \!= among iterators
in different containers as an error. But the trapping itself is actually
an error.
Consider:
#include <iostream>
#include <vector>
#include <algorithm>
template <class C>
void
display(const C& c)
{
std::cout << "{";
bool first = true;
for (const auto& x : c)
{
if (\!first)
std::cout << ", ";
first = false;
std::cout << x;
}
std::cout << "}\n";
}
int
main()
{
typedef std::vector<int> V;
V v1 = {1, 3, 5};
V v2 = {2, 4, 6};
display(v1);
display(v2);
V::iterator i = std::find(v1.begin(), v1.end(), 1);
V::iterator j = std::find(v2.begin(), v2.end(), 2);
if (*i == *j)
i = j; // perfectly legal
// ...
if (i \!= j) // the only way to check
v2.push_back(*i);
display(v1);
display(v2);
}
It is legal to assign an iterator from one container to another of the
same type. This is required to work. One might want to test whether or
not such an assignment had been made. The way one performs such a check
is using the iterator's ==, \!= operator. This is a logical and necessary
function and does not constitute an error.
2. I had a header circular dependence bug when _LIBCPP_DEBUG2 is defined.
This caused a problem in several of the libc++ tests.
Fixed.
3. There is a serious problem when _LIBCPP_DEBUG2=1 at the moment in that
std::basic_string is inoperable. std::basic_string uses __wrap_iterator
to implement its iterators. __wrap_iterator has been rigged up in debug
mode to support vector. But string hasn't been rigged up yet. This means
that one gets false positives when using std::string in debug mode. I've
upped std::string's priority in www/debug_mode.html.
llvm-svn: 187636
2013-08-02 08:26:35 +08:00
|
|
|
bool __less_than_comparable(const void* __i, const void* __j) const;
|
2011-09-15 02:33:51 +08:00
|
|
|
private:
|
|
|
|
_LIBCPP_HIDDEN
|
|
|
|
__i_node* __insert_iterator(void* __i);
|
|
|
|
_LIBCPP_HIDDEN
|
|
|
|
__i_node* __find_iterator(const void* __i) const;
|
|
|
|
|
2013-03-07 07:30:19 +08:00
|
|
|
friend _LIBCPP_FUNC_VIS __libcpp_db* __get_db();
|
2011-09-15 02:33:51 +08:00
|
|
|
};
|
|
|
|
|
2013-03-07 07:30:19 +08:00
|
|
|
_LIBCPP_FUNC_VIS __libcpp_db* __get_db();
|
|
|
|
_LIBCPP_FUNC_VIS const __libcpp_db* __get_const_db();
|
2011-09-15 02:33:51 +08:00
|
|
|
|
[libc++] Make the Debug mode a configuration-time only option
The debug mode has been broken pretty much ever since it was shipped
because it was possible to enable the debug mode in user code without
actually enabling it in the dylib, leading to ODR violations that
caused various kinds of failures.
This commit makes the debug mode a knob that is configured when
building the library and which can't be changed afterwards. This is
less flexible for users, however it will actually work as intended
and it will allow us, in the future, to add various kinds of checks
that do not assume the same ABI as the normal library. Furthermore,
this will make the debug mode more robust, which means that vendors
might be more tempted to support it properly, which hasn't been the
case with the current debug mode.
This patch shouldn't break any user code, except folks who are building
against a library that doesn't have the debug mode enabled and who try
to enable the debug mode in their code. Such users will get a compile-time
error explaining that this configuration isn't supported anymore.
In the future, we should further increase the granularity of the debug
mode checks so that we can cherry-pick which checks to enable, like we
do for unspecified behavior randomization.
Differential Revision: https://reviews.llvm.org/D122941
2022-04-02 04:38:30 +08:00
|
|
|
_LIBCPP_END_NAMESPACE_STD
|
|
|
|
|
|
|
|
#endif // defined(_LIBCPP_ENABLE_DEBUG_MODE) || defined(_LIBCPP_BUILDING_LIBRARY)
|
2011-09-15 02:33:51 +08:00
|
|
|
|
[libc++] Make the Debug mode a configuration-time only option
The debug mode has been broken pretty much ever since it was shipped
because it was possible to enable the debug mode in user code without
actually enabling it in the dylib, leading to ODR violations that
caused various kinds of failures.
This commit makes the debug mode a knob that is configured when
building the library and which can't be changed afterwards. This is
less flexible for users, however it will actually work as intended
and it will allow us, in the future, to add various kinds of checks
that do not assume the same ABI as the normal library. Furthermore,
this will make the debug mode more robust, which means that vendors
might be more tempted to support it properly, which hasn't been the
case with the current debug mode.
This patch shouldn't break any user code, except folks who are building
against a library that doesn't have the debug mode enabled and who try
to enable the debug mode in their code. Such users will get a compile-time
error explaining that this configuration isn't supported anymore.
In the future, we should further increase the granularity of the debug
mode checks so that we can cherry-pick which checks to enable, like we
do for unspecified behavior randomization.
Differential Revision: https://reviews.llvm.org/D122941
2022-04-02 04:38:30 +08:00
|
|
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
2011-09-15 02:33:51 +08:00
|
|
|
|
2022-01-11 07:33:35 +08:00
|
|
|
template <class _Tp>
|
|
|
|
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 inline void __debug_db_insert_c(_Tp* __c) {
|
[libc++] Make the Debug mode a configuration-time only option
The debug mode has been broken pretty much ever since it was shipped
because it was possible to enable the debug mode in user code without
actually enabling it in the dylib, leading to ODR violations that
caused various kinds of failures.
This commit makes the debug mode a knob that is configured when
building the library and which can't be changed afterwards. This is
less flexible for users, however it will actually work as intended
and it will allow us, in the future, to add various kinds of checks
that do not assume the same ABI as the normal library. Furthermore,
this will make the debug mode more robust, which means that vendors
might be more tempted to support it properly, which hasn't been the
case with the current debug mode.
This patch shouldn't break any user code, except folks who are building
against a library that doesn't have the debug mode enabled and who try
to enable the debug mode in their code. Such users will get a compile-time
error explaining that this configuration isn't supported anymore.
In the future, we should further increase the granularity of the debug
mode checks so that we can cherry-pick which checks to enable, like we
do for unspecified behavior randomization.
Differential Revision: https://reviews.llvm.org/D122941
2022-04-02 04:38:30 +08:00
|
|
|
#ifdef _LIBCPP_ENABLE_DEBUG_MODE
|
2022-01-11 07:33:35 +08:00
|
|
|
if (!__libcpp_is_constant_evaluated())
|
|
|
|
__get_db()->__insert_c(__c);
|
|
|
|
#else
|
|
|
|
(void)(__c);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2022-01-18 02:25:21 +08:00
|
|
|
template <class _Tp>
|
|
|
|
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 inline void __debug_db_insert_i(_Tp* __i) {
|
[libc++] Make the Debug mode a configuration-time only option
The debug mode has been broken pretty much ever since it was shipped
because it was possible to enable the debug mode in user code without
actually enabling it in the dylib, leading to ODR violations that
caused various kinds of failures.
This commit makes the debug mode a knob that is configured when
building the library and which can't be changed afterwards. This is
less flexible for users, however it will actually work as intended
and it will allow us, in the future, to add various kinds of checks
that do not assume the same ABI as the normal library. Furthermore,
this will make the debug mode more robust, which means that vendors
might be more tempted to support it properly, which hasn't been the
case with the current debug mode.
This patch shouldn't break any user code, except folks who are building
against a library that doesn't have the debug mode enabled and who try
to enable the debug mode in their code. Such users will get a compile-time
error explaining that this configuration isn't supported anymore.
In the future, we should further increase the granularity of the debug
mode checks so that we can cherry-pick which checks to enable, like we
do for unspecified behavior randomization.
Differential Revision: https://reviews.llvm.org/D122941
2022-04-02 04:38:30 +08:00
|
|
|
#ifdef _LIBCPP_ENABLE_DEBUG_MODE
|
2022-01-18 02:25:21 +08:00
|
|
|
if (!__libcpp_is_constant_evaluated())
|
|
|
|
__get_db()->__insert_i(__i);
|
|
|
|
#else
|
|
|
|
(void)(__i);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2022-05-08 04:20:23 +08:00
|
|
|
template <class _Tp>
|
|
|
|
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 inline void __debug_db_erase_c(_Tp* __c) {
|
[libc++] Make the Debug mode a configuration-time only option
The debug mode has been broken pretty much ever since it was shipped
because it was possible to enable the debug mode in user code without
actually enabling it in the dylib, leading to ODR violations that
caused various kinds of failures.
This commit makes the debug mode a knob that is configured when
building the library and which can't be changed afterwards. This is
less flexible for users, however it will actually work as intended
and it will allow us, in the future, to add various kinds of checks
that do not assume the same ABI as the normal library. Furthermore,
this will make the debug mode more robust, which means that vendors
might be more tempted to support it properly, which hasn't been the
case with the current debug mode.
This patch shouldn't break any user code, except folks who are building
against a library that doesn't have the debug mode enabled and who try
to enable the debug mode in their code. Such users will get a compile-time
error explaining that this configuration isn't supported anymore.
In the future, we should further increase the granularity of the debug
mode checks so that we can cherry-pick which checks to enable, like we
do for unspecified behavior randomization.
Differential Revision: https://reviews.llvm.org/D122941
2022-04-02 04:38:30 +08:00
|
|
|
#ifdef _LIBCPP_ENABLE_DEBUG_MODE
|
2022-05-08 04:20:23 +08:00
|
|
|
if (!__libcpp_is_constant_evaluated())
|
|
|
|
__get_db()->__erase_c(__c);
|
|
|
|
#else
|
|
|
|
(void)(__c);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _Tp>
|
|
|
|
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 inline void __debug_db_swap(_Tp* __lhs, _Tp* __rhs) {
|
[libc++] Make the Debug mode a configuration-time only option
The debug mode has been broken pretty much ever since it was shipped
because it was possible to enable the debug mode in user code without
actually enabling it in the dylib, leading to ODR violations that
caused various kinds of failures.
This commit makes the debug mode a knob that is configured when
building the library and which can't be changed afterwards. This is
less flexible for users, however it will actually work as intended
and it will allow us, in the future, to add various kinds of checks
that do not assume the same ABI as the normal library. Furthermore,
this will make the debug mode more robust, which means that vendors
might be more tempted to support it properly, which hasn't been the
case with the current debug mode.
This patch shouldn't break any user code, except folks who are building
against a library that doesn't have the debug mode enabled and who try
to enable the debug mode in their code. Such users will get a compile-time
error explaining that this configuration isn't supported anymore.
In the future, we should further increase the granularity of the debug
mode checks so that we can cherry-pick which checks to enable, like we
do for unspecified behavior randomization.
Differential Revision: https://reviews.llvm.org/D122941
2022-04-02 04:38:30 +08:00
|
|
|
#ifdef _LIBCPP_ENABLE_DEBUG_MODE
|
2022-05-08 04:20:23 +08:00
|
|
|
if (!__libcpp_is_constant_evaluated())
|
|
|
|
__get_db()->swap(__lhs, __rhs);
|
|
|
|
#else
|
|
|
|
(void)(__lhs);
|
|
|
|
(void)(__rhs);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _Tp>
|
|
|
|
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 inline void __debug_db_invalidate_all(_Tp* __c) {
|
[libc++] Make the Debug mode a configuration-time only option
The debug mode has been broken pretty much ever since it was shipped
because it was possible to enable the debug mode in user code without
actually enabling it in the dylib, leading to ODR violations that
caused various kinds of failures.
This commit makes the debug mode a knob that is configured when
building the library and which can't be changed afterwards. This is
less flexible for users, however it will actually work as intended
and it will allow us, in the future, to add various kinds of checks
that do not assume the same ABI as the normal library. Furthermore,
this will make the debug mode more robust, which means that vendors
might be more tempted to support it properly, which hasn't been the
case with the current debug mode.
This patch shouldn't break any user code, except folks who are building
against a library that doesn't have the debug mode enabled and who try
to enable the debug mode in their code. Such users will get a compile-time
error explaining that this configuration isn't supported anymore.
In the future, we should further increase the granularity of the debug
mode checks so that we can cherry-pick which checks to enable, like we
do for unspecified behavior randomization.
Differential Revision: https://reviews.llvm.org/D122941
2022-04-02 04:38:30 +08:00
|
|
|
#ifdef _LIBCPP_ENABLE_DEBUG_MODE
|
2022-05-08 04:20:23 +08:00
|
|
|
if (!__libcpp_is_constant_evaluated())
|
|
|
|
__get_db()->__invalidate_all(__c);
|
|
|
|
#else
|
|
|
|
(void)(__c);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2016-12-28 12:58:52 +08:00
|
|
|
_LIBCPP_END_NAMESPACE_STD
|
2011-09-17 01:29:17 +08:00
|
|
|
|
2022-03-24 01:11:04 +08:00
|
|
|
#endif // _LIBCPP___DEBUG
|