[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