[Lldb-commits] [lldb] [LLDB] Improve ObjectFileELF files ability to load from memory. (PR #100900)
https://github.com/tschuett edited https://github.com/llvm/llvm-project/pull/100900 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] [WIP][lldb][test] Add a new __compressed_pair layout to libcxx simulator tests (PR #99012)
https://github.com/Michael137 updated https://github.com/llvm/llvm-project/pull/99012 >From 242f78b67d6d6ef125b72c9c797fb2686cce280d Mon Sep 17 00:00:00 2001 From: Michael Buch 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 __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 __padding1_; \ + [[no_unique_address]] T2 Initializer2; \ + [[no_unique_address]] __compressed_pair_padding __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 __padding1_; \ + [[no_unique_address]] T2 Initializer2; \ + [[no_unique_address]] __compressed_pair_padding __padding2_; \ + [[no_unique_address]] T3 Initializer3; \ + [[no_unique_address]] __compressed_pair_padding __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
[Lldb-commits] [lldb] [lldb] Support new libc++ __compressed_pair layout (PR #96538)
https://github.com/Michael137 updated https://github.com/llvm/llvm-project/pull/96538 >From 294246a77e1bb16a34e9451bae65ad340c7ef7a9 Mon Sep 17 00:00:00 2001 From: Michael Buch Date: Mon, 29 Jan 2024 16:23:16 + Subject: [PATCH 1/3] [lldb] Support new libc++ __compressed_pair layout --- lldb/examples/synthetic/libcxx.py | 26 ++- .../Plugins/Language/CPlusPlus/LibCxx.cpp | 85 ++--- .../Plugins/Language/CPlusPlus/LibCxx.h | 3 +- .../Plugins/Language/CPlusPlus/LibCxxList.cpp | 72 +--- .../Plugins/Language/CPlusPlus/LibCxxMap.cpp | 41 +++-- .../Language/CPlusPlus/LibCxxUnorderedMap.cpp | 166 +++--- .../Language/CPlusPlus/LibCxxVector.cpp | 38 ++-- .../list/TestDataFormatterGenericList.py | 2 +- 8 files changed, 282 insertions(+), 151 deletions(-) diff --git a/lldb/examples/synthetic/libcxx.py b/lldb/examples/synthetic/libcxx.py index 474aaa428fa23..060ff90100849 100644 --- a/lldb/examples/synthetic/libcxx.py +++ b/lldb/examples/synthetic/libcxx.py @@ -721,6 +721,12 @@ def _get_value_of_compressed_pair(self, pair): def update(self): logger = lldb.formatters.Logger.Logger() try: +has_compressed_pair_layout = True +alloc_valobj = self.valobj.GetChildMemberWithName("__alloc_") +size_valobj = self.valobj.GetChildMemberWithName("__size_") +if alloc_valobj.IsValid() and size_valobj.IsValid(): +has_compressed_pair_layout = False + # A deque is effectively a two-dim array, with fixed width. # 'map' contains pointers to the rows of this array. The # full memory area allocated by the deque is delimited @@ -734,9 +740,13 @@ def update(self): # variable tells which element in this NxM array is the 0th # one, and the 'size' element gives the number of elements # in the deque. -count = self._get_value_of_compressed_pair( -self.valobj.GetChildMemberWithName("__size_") -) +if has_compressed_pair_layout: +count = self._get_value_of_compressed_pair( +self.valobj.GetChildMemberWithName("__size_") +) +else: +count = size_valobj.GetValueAsUnsigned(0) + # give up now if we cant access memory reliably if self.block_size < 0: logger.write("block_size < 0") @@ -748,9 +758,13 @@ def update(self): self.map_begin = map_.GetChildMemberWithName("__begin_") map_begin = self.map_begin.GetValueAsUnsigned(0) map_end = map_.GetChildMemberWithName("__end_").GetValueAsUnsigned(0) -map_endcap = self._get_value_of_compressed_pair( -map_.GetChildMemberWithName("__end_cap_") -) + +if has_compressed_pair_layout: +map_endcap = self._get_value_of_compressed_pair( +map_.GetChildMemberWithName("__end_cap_") +) +else: +map_endcap = map_.GetChildMemberWithName("__end_cap_").GetValueAsUnsigned(0) # check consistency if not map_first <= map_begin <= map_end <= map_endcap: diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp index feaa51a96843a..7d3b2410a7296 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp @@ -27,6 +27,7 @@ #include "Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.h" #include "Plugins/TypeSystem/Clang/TypeSystemClang.h" #include "lldb/lldb-enumerations.h" +#include "lldb/lldb-forward.h" #include #include @@ -34,6 +35,32 @@ using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; +static void consumeInlineNamespace(llvm::StringRef &name) { + // Delete past an inline namespace, if any: __[a-zA-Z0-9_]+:: + auto scratch = name; + if (scratch.consume_front("__") && std::isalnum(scratch[0])) { +scratch = scratch.drop_while([](char c) { return std::isalnum(c); }); +if (scratch.consume_front("::")) { + // Successfully consumed a namespace. + name = scratch; +} + } +} + +bool lldb_private::formatters::isOldCompressedPairLayout( +ValueObject &pair_obj) { + return isStdTemplate(pair_obj.GetTypeName(), "__compressed_pair"); +} + +bool lldb_private::formatters::isStdTemplate(ConstString type_name, + llvm::StringRef type) { + llvm::StringRef name = type_name.GetStringRef(); + // The type name may be prefixed with `std::__::`. + if (name.consume_front("std::")) +consumeInlineNamespace(name); + return name.consume_front(type) && name.starts_with("<"); +} + lldb::ValueObjectSP lldb_private::formatters::GetChildMemberWithName( ValueObject &obj, llvm::ArrayRef alternative_names)
[Lldb-commits] [lldb] [WIP][lldb][test] Add a new __compressed_pair layout to libcxx simulator tests (PR #99012)
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 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 __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 __padding1_; \ + [[no_unique_address]] T2 Initializer2; \ + [[no_unique_address]] __compressed_pair_padding __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 __padding1_; \ + [[no_unique_address]] T2 Initializer2; \ + [[no_unique_address]] __compressed_pair_padding __padding2_; \ + [[no_unique_address]] T3 Initializer3; \ + [[no_unique_address]] __compressed_pair_padding __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