diff --git a/lldb/examples/synthetic/gnu_libstdcpp.py b/lldb/examples/synthetic/gnu_libstdcpp.py --- a/lldb/examples/synthetic/gnu_libstdcpp.py +++ b/lldb/examples/synthetic/gnu_libstdcpp.py @@ -315,10 +315,10 @@ 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 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -902,12 +902,17 @@ 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 @@ 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 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 --- 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 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 --- 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 @@ '[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 @@ '[3] = ', 'first = 3', 'second = 1']) + + self.check("ii", 4) lldbutil.continue_to_breakpoint(self.process(), bkpt) @@ -88,6 +111,8 @@ 'first = 7', 'second = 1']) + self.check("ii", 8) + self.expect("p ii", substrs=[multimap, 'size=8', '[5] = ', @@ -235,12 +260,16 @@ 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 @@ '[2] = (first = "gatto", second = "cat")', ]) + self.check("ss", 3) + self.expect( "p ss", substrs=[ @@ -285,3 +316,14 @@ 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 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