Skip to content

Commit

Permalink
[formatters] Add a libstdcpp formatter for multimap and unify modify …
Browse files Browse the repository at this point in the history
…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
  • Loading branch information
danilashtefan authored and walter-erquinigo committed Oct 30, 2021
1 parent 025f549 commit f869e0b
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 13 deletions.
6 changes: 3 additions & 3 deletions lldb/examples/synthetic/gnu_libstdcpp.py
Expand Up @@ -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()
Expand Down
13 changes: 11 additions & 2 deletions lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
Expand Up @@ -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(
Expand All @@ -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(
Expand Down
@@ -1,6 +1,3 @@
CXX_SOURCES := main.cpp

USE_LIBCPP := 1

CXXFLAGS_EXTRAS := -O0
include Makefile.rules
Expand Up @@ -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(
Expand Down Expand Up @@ -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)

Expand All @@ -76,6 +97,8 @@ def cleanup():
'[3] = ',
'first = 3',
'second = 1'])

self.check("ii", 4)

lldbutil.continue_to_breakpoint(self.process(), bkpt)

Expand All @@ -88,6 +111,8 @@ def cleanup():
'first = 7',
'second = 1'])

self.check("ii", 8)

self.expect("p ii",
substrs=[multimap, 'size=8',
'[5] = ',
Expand Down Expand Up @@ -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(
Expand All @@ -253,6 +282,8 @@ def cleanup():
'[2] = (first = "gatto", second = "cat")',
])

self.check("ss", 3)

self.expect(
"p ss",
substrs=[
Expand Down Expand Up @@ -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)

0 comments on commit f869e0b

Please sign in to comment.