https://github.com/Michael137 updated https://github.com/llvm/llvm-project/pull/99012
>From 709c7c27a67286ab409f5bcc4c9430e025b118e8 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/4] [WIP][lldb][test] Add a new __compressed_pair layout to libcxx simulator tests --- .../compressed_pair.h | 34 ++++++++++++++++++- .../TestDataFormatterLibcxxStringSimulator.py | 19 ++++++----- .../libcxx-simulators/string/main.cpp | 33 +++++++++++------- ...stDataFormatterLibcxxUniquePtrSimulator.py | 14 ++++++-- .../libcxx-simulators/unique_ptr/main.cpp | 5 +++ 5 files changed, 81 insertions(+), 24 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 026e7183ab27a..f2c1b626bd46f 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 @@ -7,7 +7,7 @@ namespace std { namespace __lldb { -// Post-c88580c layout +#if COMPRESSED_PAIR_REV == 0 // Post-c88580c layout struct __value_init_tag {}; struct __default_init_tag {}; @@ -52,6 +52,38 @@ 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/string/TestDataFormatterLibcxxStringSimulator.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/string/TestDataFormatterLibcxxStringSimulator.py index 3e5c493692c4f..0d4270ef58568 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/string/TestDataFormatterLibcxxStringSimulator.py +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/string/TestDataFormatterLibcxxStringSimulator.py @@ -25,12 +25,13 @@ def _run_test(self, defines): for v in [None, "ALTERNATE_LAYOUT"]: for r in range(5): - name = "test_r%d" % r - defines = ["REVISION=%d" % r] - if v: - name += "_" + v - defines += [v] - f = functools.partialmethod( - LibcxxStringDataFormatterSimulatorTestCase._run_test, defines - ) - setattr(LibcxxStringDataFormatterSimulatorTestCase, name, f) + for c in range(3): + name = "test_r%d_c%d" % (r, c) + defines = ["REVISION=%d" % r, "COMPRESSED_PAIR_REV=%d" % c] + if v: + name += "_" + v + defines += [v] + f = functools.partialmethod( + LibcxxStringDataFormatterSimulatorTestCase._run_test, defines + ) + setattr(LibcxxStringDataFormatterSimulatorTestCase, name, f) diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/string/main.cpp b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/string/main.cpp index 7beeb9c39de49..cf7474cb096e8 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/string/main.cpp +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/string/main.cpp @@ -183,31 +183,40 @@ template <class _CharT, class _Traits, class _Allocator> class basic_string { }; }; +#if COMPRESSED_PAIR_REV == 0 std::__lldb::__compressed_pair<__rep, allocator_type> __r_; +#define __R_ __r_ +#define __R_L __r_.first().__l +#define __R_S __r_.first().__s +#elif COMPRESSED_PAIR_REV <= 2 + _LLDB_COMPRESSED_PAIR(__rep, __rep_, allocator_type, __alloc_); +#define __R_ __rep_ +#define __R_L __rep_.__l +#define __R_S __rep_.__s +#endif public: template <size_t __N> - basic_string(unsigned char __size, const value_type (&__data)[__N]) - : __r_({}, {}) { + basic_string(unsigned char __size, const value_type (&__data)[__N]) { static_assert(__N < __min_cap, ""); #ifdef BITMASKS - __r_.first().__s.__size_ = __size << __short_shift; + __R_S.__size_ = __size << __short_shift; #else - __r_.first().__s.__size_ = __size; - __r_.first().__s.__is_long_ = false; + __R_S.__size_ = __size; + __R_S.__is_long_ = false; #endif for (size_t __i = 0; __i < __N; ++__i) - __r_.first().__s.__data_[__i] = __data[__i]; + __R_S.__data_[__i] = __data[__i]; } - basic_string(size_t __cap, size_type __size, pointer __data) : __r_({}, {}) { + basic_string(size_t __cap, size_type __size, pointer __data) { #ifdef BITMASKS - __r_.first().__l.__cap_ = __cap | __long_mask; + __R_L.__cap_ = __cap | __long_mask; #else - __r_.first().__l.__cap_ = __cap / __endian_factor; - __r_.first().__l.__is_long_ = true; + __R_L.__cap_ = __cap / __endian_factor; + __R_L.__is_long_ = true; #endif - __r_.first().__l.__size_ = __size; - __r_.first().__l.__data_ = __data; + __R_L.__size_ = __size; + __R_L.__data_ = __data; } }; 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 da780f54bfd37..116400c4fd36a 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,13 +7,15 @@ 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 test(self): - self.build() + 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") ) @@ -22,3 +24,11 @@ def test(self): 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 a6bfaa3febebb..91a019566affb 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 @@ -16,9 +16,14 @@ 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 >From 0906d075bc0a4b71f6004e2507248498ef6515bb Mon Sep 17 00:00:00 2001 From: Michael Buch <michaelbuc...@gmail.com> Date: Tue, 16 Jul 2024 13:00:40 +0100 Subject: [PATCH 2/4] fixup! use getters for string internals --- .../libcxx-simulators/string/main.cpp | 40 ++++++++++++------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/string/main.cpp b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/string/main.cpp index cf7474cb096e8..9b65b2b98f55b 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/string/main.cpp +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/string/main.cpp @@ -183,16 +183,26 @@ template <class _CharT, class _Traits, class _Allocator> class basic_string { }; }; + __long &getLongRep() { +#if COMPRESSED_PAIR_REV == 0 + return __r_.first().__l +#elif COMPRESSED_PAIR_REV <= 2 + return __rep_.__l; +#endif + } + + __short &getShortRep() { +#if COMPRESSED_PAIR_REV == 0 + return __r_.first().__s +#elif COMPRESSED_PAIR_REV <= 2 + return __rep_.__s; +#endif + } + #if COMPRESSED_PAIR_REV == 0 std::__lldb::__compressed_pair<__rep, allocator_type> __r_; -#define __R_ __r_ -#define __R_L __r_.first().__l -#define __R_S __r_.first().__s #elif COMPRESSED_PAIR_REV <= 2 _LLDB_COMPRESSED_PAIR(__rep, __rep_, allocator_type, __alloc_); -#define __R_ __rep_ -#define __R_L __rep_.__l -#define __R_S __rep_.__s #endif public: @@ -200,23 +210,23 @@ template <class _CharT, class _Traits, class _Allocator> class basic_string { basic_string(unsigned char __size, const value_type (&__data)[__N]) { static_assert(__N < __min_cap, ""); #ifdef BITMASKS - __R_S.__size_ = __size << __short_shift; + getShortRep().__size_ = __size << __short_shift; #else - __R_S.__size_ = __size; - __R_S.__is_long_ = false; + getShortRep().__size_ = __size; + getShortRep().__is_long_ = false; #endif for (size_t __i = 0; __i < __N; ++__i) - __R_S.__data_[__i] = __data[__i]; + getShortRep().__data_[__i] = __data[__i]; } basic_string(size_t __cap, size_type __size, pointer __data) { #ifdef BITMASKS - __R_L.__cap_ = __cap | __long_mask; + getLongRep().__cap_ = __cap | __long_mask; #else - __R_L.__cap_ = __cap / __endian_factor; - __R_L.__is_long_ = true; + getLongRep().__cap_ = __cap / __endian_factor; + getLongRep().__is_long_ = true; #endif - __R_L.__size_ = __size; - __R_L.__data_ = __data; + getLongRep().__size_ = __size; + getLongRep().__data_ = __data; } }; >From dc70923dc2b2f70168eff6a4f5446be1a16c4998 Mon Sep 17 00:00:00 2001 From: Michael Buch <michaelbuc...@gmail.com> Date: Tue, 16 Jul 2024 13:14:57 +0100 Subject: [PATCH 3/4] fixup! python format --- .../unique_ptr/TestDataFormatterLibcxxUniquePtrSimulator.py | 1 + 1 file changed, 1 insertion(+) 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 116400c4fd36a..0026eca8eebea 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 @@ -25,6 +25,7 @@ def _run_test(self, defines): "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] >From 6ad0d247c28039848ad6d5bca509a68822e928cf Mon Sep 17 00:00:00 2001 From: Michael Buch <michaelbuc...@gmail.com> Date: Sun, 28 Jul 2024 14:03:38 +0100 Subject: [PATCH 4/4] fixup! fix string test compilation --- .../data-formatter-stl/libcxx-simulators/string/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/string/main.cpp b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/string/main.cpp index 9b65b2b98f55b..85d2d8ad6ba55 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/string/main.cpp +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/string/main.cpp @@ -185,7 +185,7 @@ template <class _CharT, class _Traits, class _Allocator> class basic_string { __long &getLongRep() { #if COMPRESSED_PAIR_REV == 0 - return __r_.first().__l + return __r_.first().__l; #elif COMPRESSED_PAIR_REV <= 2 return __rep_.__l; #endif @@ -193,7 +193,7 @@ template <class _CharT, class _Traits, class _Allocator> class basic_string { __short &getShortRep() { #if COMPRESSED_PAIR_REV == 0 - return __r_.first().__s + return __r_.first().__s; #elif COMPRESSED_PAIR_REV <= 2 return __rep_.__s; #endif _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits