diff options
author | Jordan Rupprecht <rupprecht@google.com> | 2019-11-22 10:25:03 -0800 |
---|---|---|
committer | Jordan Rupprecht <rupprecht@google.com> | 2019-11-22 10:25:03 -0800 |
commit | 506144da04b94d7d492ad34f7d3d81e8368677bb (patch) | |
tree | ace042b23006324b6c5fe3fdc251f12dcd22744c /lldb/packages/Python/lldbsuite/test | |
parent | 8b40bdbd7edc4cbd6c906911be0329b0900e0486 (diff) | |
download | bcm5719-llvm-506144da04b94d7d492ad34f7d3d81e8368677bb.tar.gz bcm5719-llvm-506144da04b94d7d492ad34f7d3d81e8368677bb.zip |
[lldb][DataFormatters] Support pretty printing std::string when built with -funsigned-char.
Summary:
When built w/ `-funsigned-char`, `std::string` becomes equivalent to `std::basic_string<unsigned char>`, causing these formatters to not match. This patch adds overloads for both libstdc++ and libc++ string formatters that accepts unsigned char.
Motivated by the following example:
```
$ cat pretty_print.cc
template <typename T>
void print_val(T s) {
std::cerr << s << '\n'; // Set a breakpoint here!
}
int main() {
std::string val = "hello";
print_val(val);
return 0;
}
$ clang++ -stdlib=libc++ -funsigned-char -fstandalone-debug -g pretty_print.cc
$ lldb ./a.out -b -o 'b pretty_print.cc:6' -o r -o 'fr v'
...
(lldb) fr v
(std::__1::basic_string<unsigned char, std::__1::char_traits<unsigned char>, std::__1::allocator<unsigned char> >) s = {
__r_ = {
std::__1::__compressed_pair_elem<std::__1::basic_string<unsigned char, std::__1::char_traits<unsigned char>, std::__1::allocator<unsigned char> >::__rep, 0, false> = {
__value_ = {
= {
__l = (__cap_ = 122511465736202, __size_ = 0, __data_ = 0x0000000000000000)
__s = {
= (__size_ = '\n', __lx = '\n')
__data_ = {
[0] = 'h'
[1] = 'e'
[2] = 'l'
[3] = 'l'
[4] = 'o'
[5] = '\0'
...
```
Reviewers: labath, JDevlieghere, shafik
Subscribers: christof, lldb-commits
Tags: #lldb
Differential Revision: https://reviews.llvm.org/D70517
Diffstat (limited to 'lldb/packages/Python/lldbsuite/test')
4 files changed, 26 insertions, 16 deletions
diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libcxx/string/TestDataFormatterLibcxxString.py b/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libcxx/string/TestDataFormatterLibcxxString.py index f36876ad51a..050d3afceb1 100644 --- a/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libcxx/string/TestDataFormatterLibcxxString.py +++ b/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libcxx/string/TestDataFormatterLibcxxString.py @@ -74,8 +74,10 @@ class LibcxxStringDataFormatterTestCase(TestBase): '(%s::u16string) u16_empty = ""'%ns, '(%s::u32string) u32_string = U"đđ
đđ"'%ns, # FIXME: This should have a 'U' prefix. - '(%s::u32string) u32_empty = ""'%ns -]) + '(%s::u32string) u32_empty = ""'%ns, + '(%s::basic_string<unsigned char, %s::char_traits<unsigned char>, ' + '%s::allocator<unsigned char> >) uchar = "aaaaa"'%(ns,ns,ns), + ]) self.runCmd("n") @@ -107,4 +109,8 @@ class LibcxxStringDataFormatterTestCase(TestBase): '(%s::string) IHaveEmbeddedZeros = "a\\0b\\0c\\0d"'%ns, '(%s::wstring) IHaveEmbeddedZerosToo = L"hello world!\\0ăŠă ă«ăäšăă §æ§ ăă
ăžçŠç©€è„© ăă銩ăȘ㧠䀊çŁ"'%ns, '(%s::u16string) u16_string = u"Ăæ°Žæ°¶"'%ns, - '(%s::u32string) u32_string = U"đđ
đđ"'%ns]) + '(%s::u32string) u32_string = U"đđ
đđ"'%ns, + '(%s::u32string) u32_empty = ""'%ns, + '(%s::basic_string<unsigned char, %s::char_traits<unsigned char>, ' + '%s::allocator<unsigned char> >) uchar = "aaaaa"'%(ns,ns,ns), + ]) diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libcxx/string/main.cpp b/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libcxx/string/main.cpp index ec9b8170b2f..afb56e67f0a 100644 --- a/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libcxx/string/main.cpp +++ b/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libcxx/string/main.cpp @@ -16,6 +16,7 @@ int main() std::u16string u16_empty(u""); std::u32string u32_string(U"đđ
đđ"); std::u32string u32_empty(U""); + std::basic_string<unsigned char> uchar(5, 'a'); S.assign(L"!!!!!"); // Set break point at this line. return 0; } diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/string/TestDataFormatterStdString.py b/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/string/TestDataFormatterStdString.py index 0adbaa91d6f..72434faa34f 100644 --- a/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/string/TestDataFormatterStdString.py +++ b/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/string/TestDataFormatterStdString.py @@ -59,26 +59,28 @@ class StdStringDataFormatterTestCase(TestBase): var_empty = self.frame().FindVariable('empty') var_q = self.frame().FindVariable('q') var_Q = self.frame().FindVariable('Q') + var_uchar = self.frame().FindVariable('uchar') # TODO: This is currently broken - # self.assertTrue(var_wempty.GetSummary() == 'L""', "wempty summary wrong") - self.assertTrue( - var_s.GetSummary() == 'L"hello world! ŚŚŚ ŚŚŚ!"', + # self.assertEqual(var_wempty.GetSummary(), 'L""', "wempty summary wrong") + self.assertEqual( + var_s.GetSummary(), 'L"hello world! ŚŚŚ ŚŚŚ!"', "s summary wrong") - self.assertTrue(var_S.GetSummary() == 'L"!!!!"', "S summary wrong") - self.assertTrue( - var_mazeltov.GetSummary() == 'L"ŚŚŚ ŚŚŚ"', + self.assertEqual(var_S.GetSummary(), 'L"!!!!"', "S summary wrong") + self.assertEqual( + var_mazeltov.GetSummary(), 'L"ŚŚŚ ŚŚŚ"', "mazeltov summary wrong") - self.assertTrue(var_empty.GetSummary() == '""', "empty summary wrong") - self.assertTrue( - var_q.GetSummary() == '"hello world"', + self.assertEqual(var_empty.GetSummary(), '""', "empty summary wrong") + self.assertEqual( + var_q.GetSummary(), '"hello world"', "q summary wrong") - self.assertTrue( - var_Q.GetSummary() == '"quite a long std::strin with lots of info inside it"', + self.assertEqual( + var_Q.GetSummary(), '"quite a long std::strin with lots of info inside it"', "Q summary wrong") + self.assertEqual(var_uchar.GetSummary(), '"aaaaa"', "u summary wrong") self.runCmd("next") - self.assertTrue( - var_S.GetSummary() == 'L"!!!!!"', + self.assertEqual( + var_S.GetSummary(), 'L"!!!!!"', "new S summary wrong") diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/string/main.cpp b/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/string/main.cpp index 6227a4d493a..73519197d8c 100644 --- a/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/string/main.cpp +++ b/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/string/main.cpp @@ -9,6 +9,7 @@ int main() std::string empty(""); std::string q("hello world"); std::string Q("quite a long std::strin with lots of info inside it"); + std::basic_string<unsigned char> uchar(5, 'a'); S.assign(L"!!!!!"); // Set break point at this line. return 0; } |