llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-lldb Author: Michael Buch (Michael137) <details> <summary>Changes</summary> This combines the libc++ and libstdc++ test cases. The main difference was that the libstdcpp tests had additional tests for references/pointers to std::string. I moved those over. The libstdc++ formatters don't support `std::u16string`/`std::u32string` yet, so I extracted those into XFAILed test cases. There were also two test assertions that failed for libstdc++: 1. libstdc++ doesn't obey the capped/uncapped summary options 2. When a summary isn't available for a std::string, libc++ would print "Summary Unavailable", whereas libstdc++ just prints "((null))". This may be better suited for the STL-specific subdirectories, but left it here for now. I put those in separate XFAILed test-cases. Split out from https://github.com/llvm/llvm-project/pull/146740 --- Patch is 29.05 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/147355.diff 7 Files Affected: - (renamed) lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/string/Makefile (-3) - (renamed) lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/string/TestDataFormatterStdString.py (+128-52) - (added) lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/string/main.cpp (+104) - (removed) lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string/Makefile (-6) - (removed) lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string/main.cpp (-31) - (removed) lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/string/TestDataFormatterStdString.py (-93) - (removed) lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/string/main.cpp (-16) ``````````diff diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/string/Makefile b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/string/Makefile similarity index 53% rename from lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/string/Makefile rename to lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/string/Makefile index c825977b1a5dc..99998b20bcb05 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/string/Makefile +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/string/Makefile @@ -1,6 +1,3 @@ CXX_SOURCES := main.cpp -CFLAGS_EXTRAS := -O0 -USE_LIBSTDCPP := 1 - include Makefile.rules diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string/TestDataFormatterLibcxxString.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/string/TestDataFormatterStdString.py similarity index 52% rename from lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string/TestDataFormatterLibcxxString.py rename to lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/string/TestDataFormatterStdString.py index 2f7fc88e0f449..2991cf870dcd2 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string/TestDataFormatterLibcxxString.py +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/string/TestDataFormatterStdString.py @@ -10,7 +10,7 @@ from lldbsuite.test import lldbutil -class LibcxxStringDataFormatterTestCase(TestBase): +class StdStringDataFormatterTestCase(TestBase): def setUp(self): # Call super's setUp(). TestBase.setUp(self) @@ -18,17 +18,8 @@ def setUp(self): self.main_spec = lldb.SBFileSpec("main.cpp") self.namespace = "std" - @add_test_categories(["libc++"]) - @expectedFailureAll( - bugnumber="llvm.org/pr36109", debug_info="gmodules", triple=".*-android" - ) - # Inline namespace is randomly ignored as Clang due to broken lookup inside - # the std namespace. - @expectedFailureAll(debug_info="gmodules") - def test_with_run_command(self): + def do_test(self): """Test that that file and class static variables display correctly.""" - self.build() - (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint( self, "Set break point at this line.", self.main_spec ) @@ -47,42 +38,13 @@ def cleanup(): ns = self.namespace - self.expect( - "frame variable", - substrs=[ - '(%s::wstring) wempty = L""' % ns, - '(%s::wstring) s = L"hello world! מזל טוב!"' % ns, - '(%s::wstring) S = L"!!!!"' % ns, - "(const wchar_t *) mazeltov = 0x", - 'L"מזל טוב"', - '(%s::string) empty = ""' % ns, - '(%s::string) q = "hello world"' % ns, - '(%s::string) Q = "quite a long std::strin with lots of info inside it"' - % ns, - '(%s::string) IHaveEmbeddedZeros = "a\\0b\\0c\\0d"' % ns, - '(%s::wstring) IHaveEmbeddedZerosToo = L"hello world!\\0てざ ル゜䋨ミ㠧槊 きゅへ狦穤襩 じゃ馩リョ 䤦監"' - % ns, - '(%s::u16string) u16_string = u"ß水氶"' % ns, - '(%s::u16string) u16_empty = u""' % ns, - '(%s::u32string) u32_string = U"🍄🍅🍆🍌"' % ns, - '(%s::u32string) u32_empty = U""' % ns, - "(%s::string *) null_str = nullptr" % ns, - ], - ) + # Check 'S' pre-assignment. + self.expect("frame variable S", substrs=['(%s::wstring) S = L"!!!!"' % ns]) thread.StepOver() TheVeryLongOne = frame.FindVariable("TheVeryLongOne") summaryOptions = lldb.SBTypeSummaryOptions() - summaryOptions.SetCapping(lldb.eTypeSummaryUncapped) - uncappedSummaryStream = lldb.SBStream() - TheVeryLongOne.GetSummary(uncappedSummaryStream, summaryOptions) - uncappedSummary = uncappedSummaryStream.GetData() - self.assertGreater( - uncappedSummary.find("someText"), - 0, - "uncappedSummary does not include the full string", - ) summaryOptions.SetCapping(lldb.eTypeSummaryCapped) cappedSummaryStream = lldb.SBStream() TheVeryLongOne.GetSummary(cappedSummaryStream, summaryOptions) @@ -108,31 +70,145 @@ def cleanup(): self.expect( "frame variable", substrs=[ + '(%s::wstring) wempty = L""' % ns, + '(%s::wstring) s = L"hello world! מזל טוב!"' % ns, '(%s::wstring) S = L"!!!!!"' % ns, "(const wchar_t *) mazeltov = 0x", 'L"מזל טוב"', + '(%s::string) empty = ""' % ns, '(%s::string) q = "hello world"' % ns, '(%s::string) Q = "quite a long std::strin with lots of info inside it"' % ns, + "(%s::string *) null_str = nullptr" % ns, + ], + ) + + # Test references and pointers to std::string. + var_rq = self.frame().FindVariable("rq") + var_rQ = self.frame().FindVariable("rQ") + var_pq = self.frame().FindVariable("pq") + var_pQ = self.frame().FindVariable("pQ") + + self.assertEqual(var_rq.GetSummary(), '"hello world"', "rq summary wrong") + self.assertEqual( + var_rQ.GetSummary(), + '"quite a long std::strin with lots of info inside it"', + "rQ summary wrong", + ) + self.assertEqual(var_pq.GetSummary(), '"hello world"', "pq summary wrong") + self.assertEqual( + var_pQ.GetSummary(), + '"quite a long std::strin with lots of info inside it"', + "pQ summary wrong", + ) + + @expectedFailureAll( + bugnumber="llvm.org/pr36109", debug_info="gmodules", triple=".*-android" + ) + # Inline namespace is randomly ignored as Clang due to broken lookup inside + # the std namespace. + @expectedFailureAll(debug_info="gmodules") + @add_test_categories(["libc++"]) + def test_libcxx(self): + self.build(dictionary={"USE_LIBCPP": 1}) + self.do_test() + + @expectedFailureAll( + bugnumber="llvm.org/pr36109", debug_info="gmodules", triple=".*-android" + ) + # Inline namespace is randomly ignored as Clang due to broken lookup inside + # the std namespace. + @expectedFailureAll(debug_info="gmodules") + @add_test_categories(["libstdcxx"]) + def test_libstdcxx(self): + self.build(dictionary={"USE_LIBSTDCPP": 1}) + self.do_test() + + def do_test_multibyte(self): + lldbutil.run_to_source_breakpoint( + self, "Set break point at this line.", self.main_spec + ) + + ns = self.namespace + + self.expect( + "frame variable", + substrs=[ '(%s::string) IHaveEmbeddedZeros = "a\\0b\\0c\\0d"' % ns, '(%s::wstring) IHaveEmbeddedZerosToo = L"hello world!\\0てざ ル゜䋨ミ㠧槊 きゅへ狦穤襩 じゃ馩リョ 䤦監"' % ns, '(%s::u16string) u16_string = u"ß水氶"' % ns, + '(%s::u16string) u16_empty = u""' % ns, '(%s::u32string) u32_string = U"🍄🍅🍆🍌"' % ns, '(%s::u32string) u32_empty = U""' % ns, - "(%s::string *) null_str = nullptr" % ns, ], ) - # Finally, make sure that if the string is not readable, we give an error: - bkpt_2 = target.BreakpointCreateBySourceRegex( - "Break here to look at bad string", self.main_spec + @add_test_categories(["libc++"]) + def test_multibyte_libcxx(self): + self.build(dictionary={"USE_LIBCPP": 1}) + self.do_test_multibyte() + + @expectedFailureAll( + bugnumber="libstdc++ formatters don't support UTF-16/UTF-32 strings yet." + ) + @add_test_categories(["libstdcxx"]) + def test_multibyte_libstdcxx(self): + self.build(dictionary={"USE_LIBSTDCPP": 1}) + self.do_test_multibyte() + + def do_test_uncapped_summary(self): + lldbutil.run_to_source_breakpoint( + self, "Set break point at this line.", self.main_spec + ) + + TheVeryLongOne = frame.FindVariable("TheVeryLongOne") + summaryOptions = lldb.SBTypeSummaryOptions() + summaryOptions.SetCapping(lldb.eTypeSummaryUncapped) + uncappedSummaryStream = lldb.SBStream() + TheVeryLongOne.GetSummary(uncappedSummaryStream, summaryOptions) + uncappedSummary = uncappedSummaryStream.GetData() + self.assertGreater( + uncappedSummary.find("someText"), + 0, + "uncappedSummary does not include the full string", ) - self.assertEqual(bkpt_2.GetNumLocations(), 1, "Got one location") - threads = lldbutil.continue_to_breakpoint(process, bkpt_2) - self.assertEqual(len(threads), 1, "Stopped at second breakpoint") - frame = threads[0].frames[0] - var = frame.FindVariable("in_str") - self.assertTrue(var.GetError().Success(), "Made variable") + + @add_test_categories(["libc++"]) + def test_uncapped_libcxx(self): + self.build(dictionary={"USE_LIBCPP": 1}) + self.do_test_uncapped_summary() + + @expectedFailureAll( + bugnumber="libstdc++ std::string summary provider doesn't obey summary options." + ) + @add_test_categories(["libstdcxx"]) + def test_uncapped_libstdcxx(self): + self.build(dictionary={"USE_LIBSTDCPP": 1}) + self.do_test_uncapped_summary() + + def do_test_summary_unavailable(self): + """ + Make sure that if the string is not readable, we give an error. + """ + (_, _, thread, _) = lldbutil.run_to_source_breakpoint( + self, "Break here to look at bad string", self.main_spec + ) + + var = thread.frames[0].FindVariable("in_str") + self.assertTrue(var.GetError().Success(), "Found variable") summary = var.GetSummary() self.assertEqual(summary, "Summary Unavailable", "No summary for bad value") + + @add_test_categories(["libc++"]) + def test_unavailable_summary_libcxx(self): + self.build(dictionary={"USE_LIBCPP": 1}) + self.do_test_summary_unavailable() + + @expectedFailureAll( + bugnumber="libstdc++ std::string summary provider doesn't output a user-friendly message for invalid strings." + ) + @add_test_categories(["libstdcxx"]) + def test_unavailable_summary_libstdcxx(self): + self.build(dictionary={"USE_LIBSTDCPP": 1}) + self.do_test_summary_unavailable() diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/string/main.cpp b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/string/main.cpp new file mode 100644 index 0000000000000..db695ed06f015 --- /dev/null +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/string/main.cpp @@ -0,0 +1,104 @@ +#include <stdint.h> +#include <string> + +size_t touch_string(std::string &in_str) { + return in_str.size(); // Break here to look at bad string +} + +int main() { + std::wstring wempty(L""); + std::wstring s(L"hello world! מזל טוב!"); + std::wstring S(L"!!!!"); + const wchar_t *mazeltov = L"מזל טוב"; + std::string empty(""); + std::string q("hello world"); + std::string Q("quite a long std::strin with lots of info inside it"); + std::string TheVeryLongOne( + "123456789012345678901234567890123456789012345678901234567890123456789012" + "345678901234567890123456789012345678901234567890123456789012345678901234" + "567890123456789012345678901234567890123456789012345678901234567890123456" + "789012345678901234567890123456789012345678901234567890123456789012345678" + "901234567890123456789012345678901234567890123456789012345678901234567890" + "123456789012345678901234567890123456789012345678901234567890123456789012" + "345678901234567890123456789012345678901234567890123456789012345678901234" + "567890123456789012345678901234567890123456789012345678901234567890123456" + "789012345678901234567890123456789012345678901234567890123456789012345678" + "901234567890123456789012345678901234567890123456789012345678901234567890" + "123456789012345678901234567890123456789012345678901234567890123456789012" + "345678901234567890123456789012345678901234567890123456789012345678901234" + "567890123456789012345678901234567890123456789012345678901234567890123456" + "789012345678901234567890123456789012345678901234567890123456789012345678" + "901234567890123456789012345678901234567890123456789012345678901234567890" + "123456789012345678901234567890123456789012345678901234567890123456789012" + "345678901234567890123456789012345678901234567890123456789012345678901234" + "567890123456789012345678901234567890123456789012345678901234567890123456" + "789012345678901234567890123456789012345678901234567890123456789012345678" + "901234567890123456789012345678901234567890123456789012345678901234567890" + "123456789012345678901234567890123456789012345678901234567890123456789012" + "345678901234567890123456789012345678901234567890123456789012345678901234" + "567890123456789012345678901234567890123456789012345678901234567890123456" + "789012345678901234567890123456789012345678901234567890123456789012345678" + "901234567890123456789012345678901234567890123456789012345678901234567890" + "123456789012345678901234567890123456789012345678901234567890123456789012" + "345678901234567890123456789012345678901234567890123456789012345678901234" + "567890123456789012345678901234567890123456789012345678901234567890123456" + "789012345678901234567890123456789012345678901234567890123456789012345678" + "901234567890123456789012345678901234567890123456789012345678901234567890" + "123456789012345678901234567890123456789012345678901234567890123456789012" + "345678901234567890123456789012345678901234567890123456789012345678901234" + "567890123456789012345678901234567890123456789012345678901234567890123456" + "789012345678901234567890123456789012345678901234567890123456789012345678" + "9012345678901234567890123456789012345678901234567890someText123456789012" + "345678901234567890123456789012345678901234567890123456789012345678901234" + "567890123456789012345678901234567890123456789012345678901234567890123456" + "789012345678901234567890123456789012345678901234567890123456789012345678" + "901234567890123456789012345678901234567890123456789012345678901234567890" + "123456789012345678901234567890123456789012345678901234567890123456789012" + "345678901234567890123456789012345678901234567890123456789012345678901234" + "567890123456789012345678901234567890123456789012345678901234567890123456" + "789012345678901234567890123456789012345678901234567890123456789012345678" + "901234567890123456789012345678901234567890123456789012345678901234567890" + "123456789012345678901234567890123456789012345678901234567890123456789012" + "345678901234567890123456789012345678901234567890123456789012345678901234" + "567890123456789012345678901234567890123456789012345678901234567890123456" + "789012345678901234567890123456789012345678901234567890123456789012345678" + "901234567890123456789012345678901234567890123456789012345678901234567890" + "123456789012345678901234567890123456789012345678901234567890123456789012" + "345678901234567890123456789012345678901234567890123456789012345678901234" + "567890123456789012345678901234567890123456789012345678901234567890123456" + "789012345678901234567890123456789012345678901234567890123456789012345678" + "901234567890123456789012345678901234567890123456789012345678901234567890" + "123456789012345678901234567890123456789012345678901234567890123456789012" + "345678901234567890123456789012345678901234567890123456789012345678901234" + "567890123456789012345678901234567890123456789012345678901234567890123456" + "789012345678901234567890123456789012345678901234567890123456789012345678" + "901234567890123456789012345678901234567890123456789012345678901234567890" + "123456789012345678901234567890123456789012345678901234567890123456789012" + "345678901234567890123456789012345678901234567890123456789012345678901234" + "567890123456789012345678901234567890123456789012345678901234567890123456" + "789012345678901234567890123456789012345678901234567890123456789012345678" + "901234567890123456789012345678901234567890123456789012345678901234567890" + "123456789012345678901234567890123456789012345678901234567890123456789012" + "345678901234567890123456789012345678901234567890123456789012345678901234" + "567890123456789012345678901234567890123456789012345678901234567890123456" + "789012345678901234567890123456789012345678901234567890123456789012345678" + "901234567890123456789012345678901234567890123456789012345678901234567890" + "1234567890123456789012345678901234567890"); + std::string IHaveEmbeddedZeros("a\0b\0c\0d", 7); + std::wstring IHaveEmbeddedZerosToo( + L"hello world!\0てざ ル゜䋨ミ㠧槊 きゅへ狦穤襩 じゃ馩リョ 䤦監", 38); + std::u16string u16_string(u"ß水氶"); + std::u16string u16_empty(u""); + std::u32string u32_string(U"🍄🍅🍆🍌"); + std::u32string u32_empty(U""); + std::string *null_str = nullptr; + auto &rq = q; + auto &rQ = Q; + std::string *pq = &q; + std::string *pQ = &Q; + + S.assign(L"!!!!!"); // Set break point at this line. + std::string *not_a_string = (std::string *)0x0; + touch_string(*not_a_string); + return 0; +} diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string/Makefile b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string/Makefile deleted file mode 100644 index c7c91da728d1e..0000000000000 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -CXX_SOURCES := main.cpp - -USE_LIBCPP := 1 - -CXXFLAGS_EXTRAS := -std=c++11 -O0 -include Makefile.rules diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string/main.cpp b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string/main.cpp deleted file mode 100644 index 373f817a80f7d..0000000000000 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string/main.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include <string> -#include <stdint.h> - -size_t touch_string(std::string &in_str) -{ - return in_str.size(); // Break here to look at bad string -} - -int main() -{ - std::wstring wempty(L""); - std::wstring s(L"hello world! מזל טוב!"); - std::wstring S(L"!!!!"); - const wchar_t *mazeltov = L"מזל טוב"; - std::string empty(""); - std::string q("hello world"); - std::string Q("quite a long std::strin with lots of info inside it"); - std::string TheVeryLongOne("123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/147355 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits