https://github.com/Michael137 updated https://github.com/llvm/llvm-project/pull/98330
>From a25b3c8a6a36326730d00d1060ff84181bece26e Mon Sep 17 00:00:00 2001 From: Michael Buch <michaelbuc...@gmail.com> Date: Wed, 10 Jul 2024 15:37:45 +0100 Subject: [PATCH 1/6] [WIP][lldb][test] Add a layout simulator test for std::unique_ptr --- .../libcxx-simulators/compressed_pair.h | 89 +++++++++++++++++++ .../libcxx-simulators/unique_ptr/Makefile | 3 + ...stDataFormatterLibcxxUniquePtrSimulator.py | 32 +++++++ .../libcxx-simulators/unique_ptr/main.cpp | 43 +++++++++ 4 files changed, 167 insertions(+) create mode 100644 lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/compressed_pair.h create mode 100644 lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/Makefile create mode 100644 lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/TestDataFormatterLibcxxUniquePtrSimulator.py create mode 100644 lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/main.cpp diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/compressed_pair.h b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/compressed_pair.h new file mode 100644 index 0000000000000..ec978b8053646 --- /dev/null +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/compressed_pair.h @@ -0,0 +1,89 @@ +#ifndef STD_LLDB_COMPRESSED_PAIR_H +#define STD_LLDB_COMPRESSED_PAIR_H + +#include <__memory/compressed_pair.h> +#include <type_traits> + +namespace std { +namespace __lldb { + +#if COMPRESSED_PAIR_REV == 0 // Post-c88580c layout +struct __value_init_tag {}; +struct __default_init_tag {}; + +template <class _Tp, int _Idx, + bool _CanBeEmptyBase = + std::is_empty<_Tp>::value && !std::is_final<_Tp>::value> +struct __compressed_pair_elem { + explicit __compressed_pair_elem(__default_init_tag) {} + explicit __compressed_pair_elem(__value_init_tag) : __value_() {} + + explicit __compressed_pair_elem(_Tp __t) : __value_(__t) {} + + _Tp &__get() { return __value_; } + +private: + _Tp __value_; +}; + +template <class _Tp, int _Idx> +struct __compressed_pair_elem<_Tp, _Idx, true> : private _Tp { + explicit __compressed_pair_elem(_Tp __t) : _Tp(__t) {} + explicit __compressed_pair_elem(__default_init_tag) {} + explicit __compressed_pair_elem(__value_init_tag) : _Tp() {} + + _Tp &__get() { return *this; } +}; + +template <class _T1, class _T2> +class __compressed_pair : private __compressed_pair_elem<_T1, 0>, + private __compressed_pair_elem<_T2, 1> { +public: + using _Base1 = __compressed_pair_elem<_T1, 0>; + using _Base2 = __compressed_pair_elem<_T2, 1>; + + explicit __compressed_pair(_T1 __t1, _T2 __t2) : _Base1(__t1), _Base2(__t2) {} + explicit __compressed_pair() + : _Base1(__value_init_tag()), _Base2(__value_init_tag()) {} + + template <class _U1, class _U2> + explicit __compressed_pair(_U1 &&__t1, _U2 &&__t2) + : _Base1(std::forward<_U1>(__t1)), _Base2(std::forward<_U2>(__t2)) {} + + _T1 &first() { return static_cast<_Base1 &>(*this).__get(); } +}; +#elif COMPRESSED_PAIR_REV == 1 +#define _LLDB_COMPRESSED_PAIR(T1, Initializer1, T2, Initializer2) \ + [[__gnu__::__aligned__(alignof(T2))]] [[no_unique_address]] T1 Initializer1; \ + [[no_unique_address]] __compressed_pair_padding<T1> _LIBCPP_CONCAT3( \ + __padding1_, __LINE__, _); \ + [[no_unique_address]] T2 Initializer2; \ + [[no_unique_address]] __compressed_pair_padding<T2> _LIBCPP_CONCAT3( \ + __padding2_, __LINE__, _) + +#define _LLDB_COMPRESSED_TRIPLE(T1, Initializer1, T2, Initializer2, T3, \ + Initializer3) \ + [[using __gnu__: __aligned__(alignof(T2)), \ + __aligned__(alignof(T3))]] [[no_unique_address]] T1 Initializer1; \ + [[no_unique_address]] __compressed_pair_padding<T1> _LIBCPP_CONCAT3( \ + __padding1_, __LINE__, _); \ + [[no_unique_address]] T2 Initializer2; \ + [[no_unique_address]] __compressed_pair_padding<T2> _LIBCPP_CONCAT3( \ + __padding2_, __LINE__, _); \ + [[no_unique_address]] T3 Initializer3; \ + [[no_unique_address]] __compressed_pair_padding<T3> _LIBCPP_CONCAT3( \ + __padding3_, __LINE__, _) +#elif COMPRESSED_PAIR_REV == 2 +#define _LLDB_COMPRESSED_PAIR(T1, Name1, T2, Name2) \ + [[no_unique_address]] T1 Name1; \ + [[no_unique_address]] T2 Name2 + +#define _LLDB_COMPRESSED_TRIPLE(T1, Name1, T2, Name2, T3, Name3) \ + [[no_unique_address]] T1 Name1; \ + [[no_unique_address]] T2 Name2; \ + [[no_unique_address]] T3 Name3 +#endif +} // namespace __lldb +} // namespace std + +#endif // _H diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/Makefile b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/Makefile new file mode 100644 index 0000000000000..38cfa81053488 --- /dev/null +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/Makefile @@ -0,0 +1,3 @@ +CXX_SOURCES := main.cpp +override CXXFLAGS_EXTRAS += -std=c++14 +include Makefile.rules diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/TestDataFormatterLibcxxUniquePtrSimulator.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/TestDataFormatterLibcxxUniquePtrSimulator.py new file mode 100644 index 0000000000000..fe3570ff99ae5 --- /dev/null +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/TestDataFormatterLibcxxUniquePtrSimulator.py @@ -0,0 +1,32 @@ +""" +Test we can understand various layouts of the libc++'s std::unique_ptr +""" + + +import lldb +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil +import functools + +class LibcxxUniquePtrDataFormatterSimulatorTestCase(TestBase): + NO_DEBUG_INFO_TESTCASE = True + + def _run_test(self, defines): + cxxflags_extras = " ".join(["-D%s" % d for d in defines]) + self.build(dictionary=dict(CXXFLAGS_EXTRAS=cxxflags_extras)) + lldbutil.run_to_source_breakpoint( + self, "// Break here", lldb.SBFileSpec("main.cpp") + ) + self.expect("frame variable var_up", substrs=["pointer ="]) + self.expect("frame variable var_up", substrs=["deleter ="], matching=False) + self.expect("frame variable var_with_deleter_up", substrs=["pointer =", "deleter ="]) + +#for r in range(3): +for r in range(1): + name = "test_r%d" % r + defines = ["COMPRESSED_PAIR_REV=%d" % r] + f = functools.partialmethod( + LibcxxUniquePtrDataFormatterSimulatorTestCase._run_test, defines + ) + setattr(LibcxxUniquePtrDataFormatterSimulatorTestCase, name, f) diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/main.cpp b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/main.cpp new file mode 100644 index 0000000000000..33066febc7623 --- /dev/null +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/main.cpp @@ -0,0 +1,43 @@ +#include "../compressed_pair.h" + +#include <__memory/allocator_traits.h> + +namespace std { +namespace __lldb { +template <class _Tp> struct default_delete { + default_delete() noexcept = default; + + void operator()(_Tp *__ptr) const noexcept { delete __ptr; } +}; + +template <class _Tp, class _Dp = default_delete<_Tp>> class unique_ptr { +public: + typedef _Tp element_type; + typedef _Dp deleter_type; + typedef typename __pointer<_Tp, deleter_type>::type pointer; + +#if COMPRESSED_PAIR_REV == 0 + std::__lldb::__compressed_pair<pointer, deleter_type> __ptr_; + explicit unique_ptr(pointer __p) noexcept + : __ptr_(__p, std::__lldb::__value_init_tag()) {} +#elif COMPRESSED_PAIR_REV == 1 || COMPRESSED_PAIR_REV == 2 + _LLDB_COMPRESSED_PAIR(pointer, __ptr_, deleter_type, __deleter_); + explicit unique_ptr(pointer __p) noexcept : __ptr_(__p), __deleter_() {} +#endif +}; +} // namespace __lldb +} // namespace std + +struct StatefulDeleter { + StatefulDeleter() noexcept = default; + + void operator()(int *__ptr) const noexcept { delete __ptr; } + + int m_state = 50; +}; + +int main() { + std::__lldb::unique_ptr<int> var_up(new int(5)); + std::__lldb::unique_ptr<int, StatefulDeleter> var_with_deleter_up(new int(5)); + return 0; // Break here +} >From b25d2ab0ec693fd41e7cbfeafe973e686343eb7a Mon Sep 17 00:00:00 2001 From: Michael Buch <michaelbuc...@gmail.com> Date: Wed, 10 Jul 2024 17:07:42 +0100 Subject: [PATCH 2/6] fixup! format python file --- .../TestDataFormatterLibcxxUniquePtrSimulator.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/TestDataFormatterLibcxxUniquePtrSimulator.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/TestDataFormatterLibcxxUniquePtrSimulator.py index fe3570ff99ae5..e63de67dfb759 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/TestDataFormatterLibcxxUniquePtrSimulator.py +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/TestDataFormatterLibcxxUniquePtrSimulator.py @@ -9,6 +9,7 @@ from lldbsuite.test import lldbutil import functools + class LibcxxUniquePtrDataFormatterSimulatorTestCase(TestBase): NO_DEBUG_INFO_TESTCASE = True @@ -20,10 +21,13 @@ def _run_test(self, defines): ) self.expect("frame variable var_up", substrs=["pointer ="]) self.expect("frame variable var_up", substrs=["deleter ="], matching=False) - self.expect("frame variable var_with_deleter_up", substrs=["pointer =", "deleter ="]) + self.expect( + "frame variable var_with_deleter_up", substrs=["pointer =", "deleter ="] + ) + -#for r in range(3): -for r in range(1): +# for r in range(3): +for r in [0, 2]: name = "test_r%d" % r defines = ["COMPRESSED_PAIR_REV=%d" % r] f = functools.partialmethod( >From 1575ca227d3e55ca7fab54a769bad8efc39d5ff2 Mon Sep 17 00:00:00 2001 From: Michael Buch <michaelbuc...@gmail.com> Date: Thu, 11 Jul 2024 16:57:39 +0100 Subject: [PATCH 3/6] fixup! remove dependency on internal libc++ headers; move common header --- .../compressed_pair.h | 22 +++++++++---------- ...stDataFormatterLibcxxUniquePtrSimulator.py | 3 +-- .../libcxx-simulators/unique_ptr/main.cpp | 6 ++--- 3 files changed, 14 insertions(+), 17 deletions(-) rename lldb/{test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators => packages/Python/lldbsuite/test/make/libcxx-simulators-common}/compressed_pair.h (79%) diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/compressed_pair.h b/lldb/packages/Python/lldbsuite/test/make/libcxx-simulators-common/compressed_pair.h similarity index 79% rename from lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/compressed_pair.h rename to lldb/packages/Python/lldbsuite/test/make/libcxx-simulators-common/compressed_pair.h index ec978b8053646..858ef3c4500db 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/compressed_pair.h +++ b/lldb/packages/Python/lldbsuite/test/make/libcxx-simulators-common/compressed_pair.h @@ -1,7 +1,6 @@ #ifndef STD_LLDB_COMPRESSED_PAIR_H #define STD_LLDB_COMPRESSED_PAIR_H -#include <__memory/compressed_pair.h> #include <type_traits> namespace std { @@ -53,26 +52,27 @@ class __compressed_pair : private __compressed_pair_elem<_T1, 0>, _T1 &first() { return static_cast<_Base1 &>(*this).__get(); } }; #elif COMPRESSED_PAIR_REV == 1 +template <class _ToPad> class __compressed_pair_padding { + char __padding_[(is_empty<_ToPad>::value && !__libcpp_is_final<_ToPad>::value) + ? 0 + : sizeof(_ToPad) - __datasizeof(_ToPad)]; +}; + #define _LLDB_COMPRESSED_PAIR(T1, Initializer1, T2, Initializer2) \ [[__gnu__::__aligned__(alignof(T2))]] [[no_unique_address]] T1 Initializer1; \ - [[no_unique_address]] __compressed_pair_padding<T1> _LIBCPP_CONCAT3( \ - __padding1_, __LINE__, _); \ + [[no_unique_address]] __compressed_pair_padding<T1> __padding1_; \ [[no_unique_address]] T2 Initializer2; \ - [[no_unique_address]] __compressed_pair_padding<T2> _LIBCPP_CONCAT3( \ - __padding2_, __LINE__, _) + [[no_unique_address]] __compressed_pair_padding<T2> __padding2_; #define _LLDB_COMPRESSED_TRIPLE(T1, Initializer1, T2, Initializer2, T3, \ Initializer3) \ [[using __gnu__: __aligned__(alignof(T2)), \ __aligned__(alignof(T3))]] [[no_unique_address]] T1 Initializer1; \ - [[no_unique_address]] __compressed_pair_padding<T1> _LIBCPP_CONCAT3( \ - __padding1_, __LINE__, _); \ + [[no_unique_address]] __compressed_pair_padding<T1> __padding1_; \ [[no_unique_address]] T2 Initializer2; \ - [[no_unique_address]] __compressed_pair_padding<T2> _LIBCPP_CONCAT3( \ - __padding2_, __LINE__, _); \ + [[no_unique_address]] __compressed_pair_padding<T2> __padding2_; \ [[no_unique_address]] T3 Initializer3; \ - [[no_unique_address]] __compressed_pair_padding<T3> _LIBCPP_CONCAT3( \ - __padding3_, __LINE__, _) + [[no_unique_address]] __compressed_pair_padding<T3> __padding3_; #elif COMPRESSED_PAIR_REV == 2 #define _LLDB_COMPRESSED_PAIR(T1, Name1, T2, Name2) \ [[no_unique_address]] T1 Name1; \ diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/TestDataFormatterLibcxxUniquePtrSimulator.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/TestDataFormatterLibcxxUniquePtrSimulator.py index e63de67dfb759..b870afaa67467 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/TestDataFormatterLibcxxUniquePtrSimulator.py +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/TestDataFormatterLibcxxUniquePtrSimulator.py @@ -26,8 +26,7 @@ def _run_test(self, defines): ) -# for r in range(3): -for r in [0, 2]: +for r in range(3): name = "test_r%d" % r defines = ["COMPRESSED_PAIR_REV=%d" % r] f = functools.partialmethod( diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/main.cpp b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/main.cpp index 33066febc7623..9c47c2914de6a 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/main.cpp +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/main.cpp @@ -1,6 +1,4 @@ -#include "../compressed_pair.h" - -#include <__memory/allocator_traits.h> +#include <libcxx-simulators-common/compressed_pair.h> namespace std { namespace __lldb { @@ -14,7 +12,7 @@ template <class _Tp, class _Dp = default_delete<_Tp>> class unique_ptr { public: typedef _Tp element_type; typedef _Dp deleter_type; - typedef typename __pointer<_Tp, deleter_type>::type pointer; + typedef _Tp *pointer; #if COMPRESSED_PAIR_REV == 0 std::__lldb::__compressed_pair<pointer, deleter_type> __ptr_; >From 69c2a7cf6a95b5db2ead60e4bf4ad8e473205f1b Mon Sep 17 00:00:00 2001 From: Michael Buch <michaelbuc...@gmail.com> Date: Fri, 12 Jul 2024 08:33:51 +0100 Subject: [PATCH 4/6] fixup! remove new compressed_pair layout for now --- .../compressed_pair.h | 34 +------------------ ...stDataFormatterLibcxxUniquePtrSimulator.py | 17 ++-------- .../libcxx-simulators/unique_ptr/main.cpp | 8 ++--- 3 files changed, 6 insertions(+), 53 deletions(-) diff --git a/lldb/packages/Python/lldbsuite/test/make/libcxx-simulators-common/compressed_pair.h b/lldb/packages/Python/lldbsuite/test/make/libcxx-simulators-common/compressed_pair.h index 858ef3c4500db..30765b24c8333 100644 --- a/lldb/packages/Python/lldbsuite/test/make/libcxx-simulators-common/compressed_pair.h +++ b/lldb/packages/Python/lldbsuite/test/make/libcxx-simulators-common/compressed_pair.h @@ -6,7 +6,7 @@ namespace std { namespace __lldb { -#if COMPRESSED_PAIR_REV == 0 // Post-c88580c layout +// Post-c88580c layout struct __value_init_tag {}; struct __default_init_tag {}; @@ -51,38 +51,6 @@ class __compressed_pair : private __compressed_pair_elem<_T1, 0>, _T1 &first() { return static_cast<_Base1 &>(*this).__get(); } }; -#elif COMPRESSED_PAIR_REV == 1 -template <class _ToPad> class __compressed_pair_padding { - char __padding_[(is_empty<_ToPad>::value && !__libcpp_is_final<_ToPad>::value) - ? 0 - : sizeof(_ToPad) - __datasizeof(_ToPad)]; -}; - -#define _LLDB_COMPRESSED_PAIR(T1, Initializer1, T2, Initializer2) \ - [[__gnu__::__aligned__(alignof(T2))]] [[no_unique_address]] T1 Initializer1; \ - [[no_unique_address]] __compressed_pair_padding<T1> __padding1_; \ - [[no_unique_address]] T2 Initializer2; \ - [[no_unique_address]] __compressed_pair_padding<T2> __padding2_; - -#define _LLDB_COMPRESSED_TRIPLE(T1, Initializer1, T2, Initializer2, T3, \ - Initializer3) \ - [[using __gnu__: __aligned__(alignof(T2)), \ - __aligned__(alignof(T3))]] [[no_unique_address]] T1 Initializer1; \ - [[no_unique_address]] __compressed_pair_padding<T1> __padding1_; \ - [[no_unique_address]] T2 Initializer2; \ - [[no_unique_address]] __compressed_pair_padding<T2> __padding2_; \ - [[no_unique_address]] T3 Initializer3; \ - [[no_unique_address]] __compressed_pair_padding<T3> __padding3_; -#elif COMPRESSED_PAIR_REV == 2 -#define _LLDB_COMPRESSED_PAIR(T1, Name1, T2, Name2) \ - [[no_unique_address]] T1 Name1; \ - [[no_unique_address]] T2 Name2 - -#define _LLDB_COMPRESSED_TRIPLE(T1, Name1, T2, Name2, T3, Name3) \ - [[no_unique_address]] T1 Name1; \ - [[no_unique_address]] T2 Name2; \ - [[no_unique_address]] T3 Name3 -#endif } // namespace __lldb } // namespace std diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/TestDataFormatterLibcxxUniquePtrSimulator.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/TestDataFormatterLibcxxUniquePtrSimulator.py index b870afaa67467..da780f54bfd37 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/TestDataFormatterLibcxxUniquePtrSimulator.py +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/TestDataFormatterLibcxxUniquePtrSimulator.py @@ -7,29 +7,18 @@ from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * from lldbsuite.test import lldbutil -import functools class LibcxxUniquePtrDataFormatterSimulatorTestCase(TestBase): NO_DEBUG_INFO_TESTCASE = True - def _run_test(self, defines): - cxxflags_extras = " ".join(["-D%s" % d for d in defines]) - self.build(dictionary=dict(CXXFLAGS_EXTRAS=cxxflags_extras)) + def test(self): + self.build() lldbutil.run_to_source_breakpoint( - self, "// Break here", lldb.SBFileSpec("main.cpp") + self, "Break here", lldb.SBFileSpec("main.cpp") ) self.expect("frame variable var_up", substrs=["pointer ="]) self.expect("frame variable var_up", substrs=["deleter ="], matching=False) self.expect( "frame variable var_with_deleter_up", substrs=["pointer =", "deleter ="] ) - - -for r in range(3): - name = "test_r%d" % r - defines = ["COMPRESSED_PAIR_REV=%d" % r] - f = functools.partialmethod( - LibcxxUniquePtrDataFormatterSimulatorTestCase._run_test, defines - ) - setattr(LibcxxUniquePtrDataFormatterSimulatorTestCase, name, f) diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/main.cpp b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/main.cpp index 9c47c2914de6a..08324e24f9cc4 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/main.cpp +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/unique_ptr/main.cpp @@ -14,14 +14,9 @@ template <class _Tp, class _Dp = default_delete<_Tp>> class unique_ptr { typedef _Dp deleter_type; typedef _Tp *pointer; -#if COMPRESSED_PAIR_REV == 0 std::__lldb::__compressed_pair<pointer, deleter_type> __ptr_; explicit unique_ptr(pointer __p) noexcept : __ptr_(__p, std::__lldb::__value_init_tag()) {} -#elif COMPRESSED_PAIR_REV == 1 || COMPRESSED_PAIR_REV == 2 - _LLDB_COMPRESSED_PAIR(pointer, __ptr_, deleter_type, __deleter_); - explicit unique_ptr(pointer __p) noexcept : __ptr_(__p), __deleter_() {} -#endif }; } // namespace __lldb } // namespace std @@ -37,5 +32,6 @@ struct StatefulDeleter { int main() { std::__lldb::unique_ptr<int> var_up(new int(5)); std::__lldb::unique_ptr<int, StatefulDeleter> var_with_deleter_up(new int(5)); - return 0; // Break here + __builtin_printf("Break here\n"); + return 0; } >From 1996194fc6c2b5ccf5445468d5714b596b81f077 Mon Sep 17 00:00:00 2001 From: Michael Buch <michaelbuc...@gmail.com> Date: Fri, 12 Jul 2024 08:42:43 +0100 Subject: [PATCH 5/6] fixup! use the common compressed_pair implementation for string simulator --- .../libcxx/string/simulator/main.cpp | 35 ++----------------- 1 file changed, 3 insertions(+), 32 deletions(-) diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string/simulator/main.cpp b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string/simulator/main.cpp index 33e71044482a7..7beeb9c39de49 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string/simulator/main.cpp +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string/simulator/main.cpp @@ -1,3 +1,5 @@ +#include <libcxx-simulators-common/compressed_pair.h> + #include <climits> #include <memory> #include <type_traits> @@ -32,37 +34,6 @@ namespace std { namespace __lldb { -template <class _Tp, int _Idx, - bool _CanBeEmptyBase = - std::is_empty<_Tp>::value && !std::is_final<_Tp>::value> -struct __compressed_pair_elem { - explicit __compressed_pair_elem(_Tp __t) : __value_(__t) {} - - _Tp &__get() { return __value_; } - -private: - _Tp __value_; -}; - -template <class _Tp, int _Idx> -struct __compressed_pair_elem<_Tp, _Idx, true> : private _Tp { - explicit __compressed_pair_elem(_Tp __t) : _Tp(__t) {} - - _Tp &__get() { return *this; } -}; - -template <class _T1, class _T2> -class __compressed_pair : private __compressed_pair_elem<_T1, 0>, - private __compressed_pair_elem<_T2, 1> { -public: - using _Base1 = __compressed_pair_elem<_T1, 0>; - using _Base2 = __compressed_pair_elem<_T2, 1>; - - explicit __compressed_pair(_T1 __t1, _T2 __t2) : _Base1(__t1), _Base2(__t2) {} - - _T1 &first() { return static_cast<_Base1 &>(*this).__get(); } -}; - #if defined(ALTERNATE_LAYOUT) && defined(SUBCLASS_PADDING) template <class _CharT, size_t = sizeof(_CharT)> struct __padding { unsigned char __xx[sizeof(_CharT) - 1]; @@ -212,7 +183,7 @@ template <class _CharT, class _Traits, class _Allocator> class basic_string { }; }; - __compressed_pair<__rep, allocator_type> __r_; + std::__lldb::__compressed_pair<__rep, allocator_type> __r_; public: template <size_t __N> >From c13766bc2d8ce2b9955438d8861944474aaf7ba7 Mon Sep 17 00:00:00 2001 From: Michael Buch <michaelbuc...@gmail.com> Date: Mon, 15 Jul 2024 20:16:34 +0100 Subject: [PATCH 6/6] fixup! add missing header --- .../test/make/libcxx-simulators-common/compressed_pair.h | 1 + 1 file changed, 1 insertion(+) diff --git a/lldb/packages/Python/lldbsuite/test/make/libcxx-simulators-common/compressed_pair.h b/lldb/packages/Python/lldbsuite/test/make/libcxx-simulators-common/compressed_pair.h index 30765b24c8333..026e7183ab27a 100644 --- a/lldb/packages/Python/lldbsuite/test/make/libcxx-simulators-common/compressed_pair.h +++ b/lldb/packages/Python/lldbsuite/test/make/libcxx-simulators-common/compressed_pair.h @@ -2,6 +2,7 @@ #define STD_LLDB_COMPRESSED_PAIR_H #include <type_traits> +#include <utility> // for std::forward namespace std { namespace __lldb { _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits