[Lldb-commits] [lldb] f869e0b - [formatters] Add a libstdcpp formatter for multimap and unify modify tests across stdlibs

Walter Erquinigo via lldb-commits lldb-commits at lists.llvm.org
Sat Oct 30 13:05:23 PDT 2021


Author: Danil Stefaniuc
Date: 2021-10-30T12:53:32-07:00
New Revision: f869e0be445800e71f9a74a60b4f5611d3cff7d0

URL: https://github.com/llvm/llvm-project/commit/f869e0be445800e71f9a74a60b4f5611d3cff7d0
DIFF: https://github.com/llvm/llvm-project/commit/f869e0be445800e71f9a74a60b4f5611d3cff7d0.diff

LOG: [formatters] Add a libstdcpp formatter for multimap and unify modify tests across stdlibs

This diff adds a data formatter for libstdcpp's multimap. Besides, it improves and unifies the tests for multimap for libcxx and libstdcpp for maintainability.

Reviewed By: wallace

Differential Revision: https://reviews.llvm.org/D112752

Added: 
    lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multimap/Makefile
    lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multimap/TestDataFormatterGenericMultiMap.py
    lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multimap/main.cpp

Modified: 
    lldb/examples/synthetic/gnu_libstdcpp.py
    lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp

Removed: 
    lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/multimap/Makefile
    lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/multimap/TestDataFormatterLibccMultiMap.py
    lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/multimap/main.cpp


################################################################################
diff  --git a/lldb/examples/synthetic/gnu_libstdcpp.py b/lldb/examples/synthetic/gnu_libstdcpp.py
index 21c89754c082..dd07195d6ec8 100644
--- a/lldb/examples/synthetic/gnu_libstdcpp.py
+++ b/lldb/examples/synthetic/gnu_libstdcpp.py
@@ -315,10 +315,10 @@ def has_children(self):
         return True
 
     """
-    Set and Map have the same underlying data structure,
-    therefore we can use exactly the same implementation for the formatter.
+     This formatter can be applied to all
+     map-like structures (map, multimap, set, multiset)
     """
-class StdSetOrMapSynthProvider:
+class StdMapLikeSynthProvider:
 
     def __init__(self, valobj, dict):
         logger = lldb.formatters.Logger.Logger()

diff  --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
index 626c5a5a8282..7b64faa6d6ed 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
@@ -902,12 +902,17 @@ static void LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
       RegularExpression("^std::map<.+> >(( )?&)?$"),
       SyntheticChildrenSP(new ScriptedSyntheticChildren(
           stl_synth_flags,
-          "lldb.formatters.cpp.gnu_libstdcpp.StdSetOrMapSynthProvider")));
+          "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
   cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(
       RegularExpression("^std::set<.+> >(( )?&)?$"),
       SyntheticChildrenSP(new ScriptedSyntheticChildren(
           stl_deref_flags,
-          "lldb.formatters.cpp.gnu_libstdcpp.StdSetOrMapSynthProvider")));
+          "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
+  cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(
+      RegularExpression("^std::multimap<.+> >(( )?&)?$"),
+      SyntheticChildrenSP(new ScriptedSyntheticChildren(
+          stl_deref_flags,
+          "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
   cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(
       RegularExpression("^std::(__cxx11::)?list<.+>(( )?&)?$"),
       SyntheticChildrenSP(new ScriptedSyntheticChildren(
@@ -931,6 +936,10 @@ static void LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
       RegularExpression("^std::set<.+> >(( )?&)?$"),
       TypeSummaryImplSP(
           new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
+  cpp_category_sp->GetRegexTypeSummariesContainer()->Add(
+      RegularExpression("^std::multimap<.+> >(( )?&)?$"),
+      TypeSummaryImplSP(
+          new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
   cpp_category_sp->GetRegexTypeSummariesContainer()->Add(
       RegularExpression("^std::(__cxx11::)?list<.+>(( )?&)?$"),
       TypeSummaryImplSP(

diff  --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/multimap/Makefile b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multimap/Makefile
similarity index 54%
rename from lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/multimap/Makefile
rename to lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multimap/Makefile
index 564cbada74e0..99998b20bcb0 100644
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/multimap/Makefile
+++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multimap/Makefile
@@ -1,6 +1,3 @@
 CXX_SOURCES := main.cpp
 
-USE_LIBCPP := 1
-
-CXXFLAGS_EXTRAS := -O0
 include Makefile.rules

diff  --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/multimap/TestDataFormatterLibccMultiMap.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multimap/TestDataFormatterGenericMultiMap.py
similarity index 88%
rename from lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/multimap/TestDataFormatterLibccMultiMap.py
rename to lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multimap/TestDataFormatterGenericMultiMap.py
index 3fd25752da5a..b90964951fee 100644
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/multimap/TestDataFormatterLibccMultiMap.py
+++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multimap/TestDataFormatterGenericMultiMap.py
@@ -10,19 +10,38 @@
 from lldbsuite.test.lldbtest import *
 from lldbsuite.test import lldbutil
 
+USE_LIBSTDCPP = "USE_LIBSTDCPP"
+USE_LIBCPP = "USE_LIBCPP"
 
-class LibcxxMultiMapDataFormatterTestCase(TestBase):
+class GenericMultiMapDataFormatterTestCase(TestBase):
 
     mydir = TestBase.compute_mydir(__file__)
 
     def setUp(self):
         TestBase.setUp(self)
         self.namespace = 'std'
-
-    @add_test_categories(["libc++"])
-    def test_with_run_command(self):
+    
+    def findVariable(self, name):
+        var = self.frame().FindVariable(name)
+        self.assertTrue(var.IsValid())
+        return var
+
+    def getVariableType(self, name):
+        var = self.findVariable(name)
+        return var.GetType().GetDisplayTypeName()
+
+    def check(self, var_name, size):
+        var = self.findVariable(var_name)
+        self.assertEqual(var.GetNumChildren(), size)
+        children = []
+        for i in range(size):
+            child = var.GetChildAtIndex(i)
+            children.append(ValueCheck(value=child.GetValue()))
+        self.expect_var_path(var_name, type=self.getVariableType(var_name), children=children)
+
+    def do_test_with_run_command(self, stdlib_type):
         """Test that that file and class static variables display correctly."""
-        self.build()
+        self.build(dictionary={stdlib_type: "1"})
         self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
 
         bkpt = self.target().FindBreakpointByID(
@@ -65,6 +84,8 @@ def cleanup():
                 '[0] = (first = 0, second = 0)',
                 '[1] = (first = 1, second = 1)',
             ])
+        
+        self.check("ii", 2)
 
         lldbutil.continue_to_breakpoint(self.process(), bkpt)
 
@@ -76,6 +97,8 @@ def cleanup():
                              '[3] = ',
                              'first = 3',
                              'second = 1'])
+        
+        self.check("ii", 4)
 
         lldbutil.continue_to_breakpoint(self.process(), bkpt)
 
@@ -88,6 +111,8 @@ def cleanup():
                              'first = 7',
                              'second = 1'])
 
+        self.check("ii", 8)
+
         self.expect("p ii",
                     substrs=[multimap, 'size=8',
                              '[5] = ',
@@ -235,12 +260,16 @@ def cleanup():
                     substrs=[multimap, 'size=0',
                              '{}'])
 
+        self.check("is", 0)
+
         lldbutil.continue_to_breakpoint(self.process(), bkpt)
 
         self.expect('frame variable ss',
                     substrs=[multimap, 'size=0',
                              '{}'])
 
+        self.check("ss", 0)
+
         lldbutil.continue_to_breakpoint(self.process(), bkpt)
 
         self.expect(
@@ -253,6 +282,8 @@ def cleanup():
                 '[2] = (first = "gatto", second = "cat")',
             ])
 
+        self.check("ss", 3)
+
         self.expect(
             "p ss",
             substrs=[
@@ -285,3 +316,14 @@ def cleanup():
         self.expect('frame variable ss',
                     substrs=[multimap, 'size=0',
                              '{}'])
+
+        self.check("ss", 0)
+
+    @add_test_categories(["libstdcxx"])
+    def test_with_run_command_libstdcpp(self):
+        self.do_test_with_run_command(USE_LIBSTDCPP)
+
+    @add_test_categories(["libc++"])
+    def test_with_run_command_libcpp(self):
+        self.do_test_with_run_command(USE_LIBCPP)
+    

diff  --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/multimap/main.cpp b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multimap/main.cpp
similarity index 100%
rename from lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/multimap/main.cpp
rename to lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multimap/main.cpp


        


More information about the lldb-commits mailing list