[Lldb-commits] [lldb] 11dc235 - [lldb] Fix matchers for char array formatters
Pavel Labath via lldb-commits
lldb-commits at lists.llvm.org
Fri Dec 17 01:09:55 PST 2021
Author: Pavel Labath
Date: 2021-12-17T10:06:38+01:00
New Revision: 11dc235c7dda298befa84833a51ac9cdc92e7c2e
URL: https://github.com/llvm/llvm-project/commit/11dc235c7dda298befa84833a51ac9cdc92e7c2e
DIFF: https://github.com/llvm/llvm-project/commit/11dc235c7dda298befa84833a51ac9cdc92e7c2e.diff
LOG: [lldb] Fix matchers for char array formatters
They were being applied too narrowly (they didn't cover signed char *,
for instance), and too broadly (they covered SomeTemplate<char[6]>) at
the same time.
Differential Revision: https://reviews.llvm.org/D112709
Added:
Modified:
lldb/source/DataFormatters/FormatManager.cpp
lldb/test/API/functionalities/data-formatter/stringprinter/main.cpp
Removed:
################################################################################
diff --git a/lldb/source/DataFormatters/FormatManager.cpp b/lldb/source/DataFormatters/FormatManager.cpp
index cda1ae60d8572..924b7b6948f3c 100644
--- a/lldb/source/DataFormatters/FormatManager.cpp
+++ b/lldb/source/DataFormatters/FormatManager.cpp
@@ -724,7 +724,7 @@ void FormatManager::LoadSystemFormatters() {
lldb::TypeSummaryImplSP string_array_format(
new StringSummaryFormat(string_array_flags, "${var%char[]}"));
- RegularExpression any_size_char_arr(llvm::StringRef("char ?\\[[0-9]+\\]"));
+ RegularExpression any_size_char_arr(R"(^((un)?signed )?char ?\[[0-9]+\]$)");
TypeCategoryImpl::SharedPointer sys_category_sp =
GetCategory(m_system_category_name);
@@ -733,6 +733,9 @@ void FormatManager::LoadSystemFormatters() {
string_format);
sys_category_sp->GetTypeSummariesContainer()->Add(
ConstString("unsigned char *"), string_format);
+ sys_category_sp->GetTypeSummariesContainer()->Add(
+ ConstString("signed char *"), string_format);
+
sys_category_sp->GetRegexTypeSummariesContainer()->Add(
std::move(any_size_char_arr), string_array_format);
diff --git a/lldb/test/API/functionalities/data-formatter/stringprinter/main.cpp b/lldb/test/API/functionalities/data-formatter/stringprinter/main.cpp
index cdd1b0ada5e08..b6886ea7f2052 100644
--- a/lldb/test/API/functionalities/data-formatter/stringprinter/main.cpp
+++ b/lldb/test/API/functionalities/data-formatter/stringprinter/main.cpp
@@ -6,6 +6,27 @@ struct A {
char overflow[4];
};
+#define MAKE_VARS3(c, v, s) \
+ c v s char c##v##s##chararray[] = #c #v #s "char"; \
+ c v s char *c##v##s##charstar = c##v##s##chararray
+#define MAKE_VARS2(c, v) \
+ MAKE_VARS3(c, v, ); \
+ MAKE_VARS3(c, v, signed); \
+ MAKE_VARS3(c, v, unsigned)
+#define MAKE_VARS(c) \
+ MAKE_VARS2(c, ); \
+ MAKE_VARS2(c, volatile)
+
+MAKE_VARS();
+MAKE_VARS(const);
+
+template<typename T>
+struct S {
+ int x = 0;
+};
+S<char[5]> Schar5;
+S<char *> Scharstar;
+
int main (int argc, char const *argv[])
{
A a, b, c;
@@ -15,7 +36,7 @@ int main (int argc, char const *argv[])
memcpy(b.data, "FO\0BAR", 7);
memcpy(c.data, "F\0O\0AR", 7);
std::string stdstring("Hello\t\tWorld\nI am here\t\tto say hello\n"); //%self.addTearDownHook(lambda x: x.runCmd("setting set escape-non-printables true"))
- const char* constcharstar = stdstring.c_str();
+ const char *charwithtabs = stdstring.c_str();
std::string longstring(
"I am a very long string; in fact I am longer than any reasonable length that a string should be; quite long indeed; oh my, so many words; so many letters; this is kind of like writing a poem; except in real life all that is happening"
" is just me producing a very very long set of words; there is text here, text there, text everywhere; it fills me with glee to see so much text; all around me it's just letters, and symbols, and other pleasant drawings that cause me"
@@ -32,15 +53,30 @@ int main (int argc, char const *argv[])
);
const char* longconstcharstar = longstring.c_str();
return 0; //% if self.TraceOn(): self.runCmd('frame variable')
+ //%
//% self.expect_var_path('stdstring', summary='"Hello\\t\\tWorld\\nI am here\\t\\tto say hello\\n"')
- //% self.expect_var_path('constcharstar', summary='"Hello\\t\\tWorld\\nI am here\\t\\tto say hello\\n"')
+ //% self.expect_var_path('charwithtabs', summary='"Hello\\t\\tWorld\\nI am here\\t\\tto say hello\\n"')
//% self.expect_var_path("a.data", summary='"FOOB"')
//% self.expect_var_path("b.data", summary=r'"FO\0B"')
//% self.expect_var_path("c.data", summary=r'"F\0O"')
//%
+ //% for c in ["", "const"]:
+ //% for v in ["", "volatile"]:
+ //% for s in ["", "signed", "unsigned"]:
+ //% summary = '"'+c+v+s+'char"'
+ //% self.expect_var_path(c+v+s+"chararray", summary=summary)
+ //% # These should be printed normally
+ //% self.expect_var_path(c+v+s+"charstar", summary=summary)
+ //% Schar5 = self.expect_var_path("Schar5",
+ //% children=[ValueCheck(name="x", value="0")])
+ //% self.assertIsNone(Schar5.GetSummary())
+ //% Scharstar = self.expect_var_path("Scharstar",
+ //% children=[ValueCheck(name="x", value="0")])
+ //% self.assertIsNone(Scharstar.GetSummary())
+ //%
//% self.runCmd("setting set escape-non-printables false")
//% self.expect_var_path('stdstring', summary='"Hello\t\tWorld\nI am here\t\tto say hello\n"')
- //% self.expect_var_path('constcharstar', summary='"Hello\t\tWorld\nI am here\t\tto say hello\n"')
+ //% self.expect_var_path('charwithtabs', summary='"Hello\t\tWorld\nI am here\t\tto say hello\n"')
//% self.assertTrue(self.frame().FindVariable('longstring').GetSummary().endswith('"...'))
//% self.assertTrue(self.frame().FindVariable('longconstcharstar').GetSummary().endswith('"...'))
// FIXME: make "b.data" and "c.data" work sanely
More information about the lldb-commits
mailing list