Skip to content

Commit 506144d

Browse files
committed
[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
1 parent 8b40bdb commit 506144d

File tree

5 files changed

+37
-16
lines changed

5 files changed

+37
-16
lines changed

lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libcxx/string/TestDataFormatterLibcxxString.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,10 @@ def cleanup():
7474
'(%s::u16string) u16_empty = ""'%ns,
7575
'(%s::u32string) u32_string = U"🍄🍅🍆🍌"'%ns,
7676
# FIXME: This should have a 'U' prefix.
77-
'(%s::u32string) u32_empty = ""'%ns
78-
])
77+
'(%s::u32string) u32_empty = ""'%ns,
78+
'(%s::basic_string<unsigned char, %s::char_traits<unsigned char>, '
79+
'%s::allocator<unsigned char> >) uchar = "aaaaa"'%(ns,ns,ns),
80+
])
7981

8082
self.runCmd("n")
8183

@@ -107,4 +109,8 @@ def cleanup():
107109
'(%s::string) IHaveEmbeddedZeros = "a\\0b\\0c\\0d"'%ns,
108110
'(%s::wstring) IHaveEmbeddedZerosToo = L"hello world!\\0てざ ル゜䋨ミ㠧槊 きゅへ狦穤襩 じゃ馩リョ 䤦監"'%ns,
109111
'(%s::u16string) u16_string = u"ß水氶"'%ns,
110-
'(%s::u32string) u32_string = U"🍄🍅🍆🍌"'%ns])
112+
'(%s::u32string) u32_string = U"🍄🍅🍆🍌"'%ns,
113+
'(%s::u32string) u32_empty = ""'%ns,
114+
'(%s::basic_string<unsigned char, %s::char_traits<unsigned char>, '
115+
'%s::allocator<unsigned char> >) uchar = "aaaaa"'%(ns,ns,ns),
116+
])

lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libcxx/string/main.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ int main()
1616
std::u16string u16_empty(u"");
1717
std::u32string u32_string(U"🍄🍅🍆🍌");
1818
std::u32string u32_empty(U"");
19+
std::basic_string<unsigned char> uchar(5, 'a');
1920
S.assign(L"!!!!!"); // Set break point at this line.
2021
return 0;
2122
}

lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/string/TestDataFormatterStdString.py

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -59,26 +59,28 @@ def cleanup():
5959
var_empty = self.frame().FindVariable('empty')
6060
var_q = self.frame().FindVariable('q')
6161
var_Q = self.frame().FindVariable('Q')
62+
var_uchar = self.frame().FindVariable('uchar')
6263

6364
# TODO: This is currently broken
64-
# self.assertTrue(var_wempty.GetSummary() == 'L""', "wempty summary wrong")
65-
self.assertTrue(
66-
var_s.GetSummary() == 'L"hello world! מזל טוב!"',
65+
# self.assertEqual(var_wempty.GetSummary(), 'L""', "wempty summary wrong")
66+
self.assertEqual(
67+
var_s.GetSummary(), 'L"hello world! מזל טוב!"',
6768
"s summary wrong")
68-
self.assertTrue(var_S.GetSummary() == 'L"!!!!"', "S summary wrong")
69-
self.assertTrue(
70-
var_mazeltov.GetSummary() == 'L"מזל טוב"',
69+
self.assertEqual(var_S.GetSummary(), 'L"!!!!"', "S summary wrong")
70+
self.assertEqual(
71+
var_mazeltov.GetSummary(), 'L"מזל טוב"',
7172
"mazeltov summary wrong")
72-
self.assertTrue(var_empty.GetSummary() == '""', "empty summary wrong")
73-
self.assertTrue(
74-
var_q.GetSummary() == '"hello world"',
73+
self.assertEqual(var_empty.GetSummary(), '""', "empty summary wrong")
74+
self.assertEqual(
75+
var_q.GetSummary(), '"hello world"',
7576
"q summary wrong")
76-
self.assertTrue(
77-
var_Q.GetSummary() == '"quite a long std::strin with lots of info inside it"',
77+
self.assertEqual(
78+
var_Q.GetSummary(), '"quite a long std::strin with lots of info inside it"',
7879
"Q summary wrong")
80+
self.assertEqual(var_uchar.GetSummary(), '"aaaaa"', "u summary wrong")
7981

8082
self.runCmd("next")
8183

82-
self.assertTrue(
83-
var_S.GetSummary() == 'L"!!!!!"',
84+
self.assertEqual(
85+
var_S.GetSummary(), 'L"!!!!!"',
8486
"new S summary wrong")

lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/string/main.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ int main()
99
std::string empty("");
1010
std::string q("hello world");
1111
std::string Q("quite a long std::strin with lots of info inside it");
12+
std::basic_string<unsigned char> uchar(5, 'a');
1213
S.assign(L"!!!!!"); // Set break point at this line.
1314
return 0;
1415
}

lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,13 @@ static void LoadLibCxxFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
425425
"std::__[[:alnum:]]+::char_traits<char>, "
426426
"std::__[[:alnum:]]+::allocator<char> >$"),
427427
stl_summary_flags, true);
428+
AddCXXSummary(cpp_category_sp,
429+
lldb_private::formatters::LibcxxStringSummaryProviderASCII,
430+
"std::string summary provider",
431+
ConstString("^std::__[[:alnum:]]+::basic_string<unsigned char, "
432+
"std::__[[:alnum:]]+::char_traits<unsigned char>, "
433+
"std::__[[:alnum:]]+::allocator<unsigned char> >$"),
434+
stl_summary_flags, true);
428435

429436
AddCXXSummary(cpp_category_sp,
430437
lldb_private::formatters::LibcxxStringSummaryProviderUTF16,
@@ -723,6 +730,10 @@ static void LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
723730
ConstString("std::__cxx11::basic_string<char, std::char_traits<char>, "
724731
"std::allocator<char> >"),
725732
cxx11_string_summary_sp);
733+
cpp_category_sp->GetTypeSummariesContainer()->Add(
734+
ConstString("std::__cxx11::basic_string<unsigned char, std::char_traits<unsigned char>, "
735+
"std::allocator<unsigned char> >"),
736+
cxx11_string_summary_sp);
726737

727738
// making sure we force-pick the summary for printing wstring (_M_p is a
728739
// wchar_t*)

0 commit comments

Comments
 (0)