[Lldb-commits] [PATCH] D112709: [lldb] Fix matchers for char array formatters

Pavel Labath via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Thu Oct 28 05:15:27 PDT 2021


labath created this revision.
labath added reviewers: teemperor, jingham.
labath requested review of this revision.
Herald added a project: LLDB.

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.

Depends on D112708 <https://reviews.llvm.org/D112708>.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D112709

Files:
  lldb/source/DataFormatters/FormatManager.cpp
  lldb/test/API/functionalities/data-formatter/stringprinter/main.cpp


Index: lldb/test/API/functionalities/data-formatter/stringprinter/main.cpp
===================================================================
--- lldb/test/API/functionalities/data-formatter/stringprinter/main.cpp
+++ lldb/test/API/functionalities/data-formatter/stringprinter/main.cpp
@@ -6,6 +6,27 @@
   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 @@
     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 @@
       );
     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
Index: lldb/source/DataFormatters/FormatManager.cpp
===================================================================
--- lldb/source/DataFormatters/FormatManager.cpp
+++ lldb/source/DataFormatters/FormatManager.cpp
@@ -724,7 +724,7 @@
   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 @@
                                                     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);
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D112709.382994.patch
Type: text/x-patch
Size: 5087 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20211028/03524527/attachment-0001.bin>


More information about the lldb-commits mailing list