diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2016-01-06 20:12:03 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2016-01-06 20:12:03 +0000 | 
| commit | 9e6d35490a6542f9c97607f93c2ef8ca8e03cbcc (patch) | |
| tree | dd2a1ddf0476664c2b823409c36cbccd52662ca7 /packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp | |
| parent | 3bd2e91faeb9eeec1aae82c64a3253afff551cfd (diff) | |
Notes
Diffstat (limited to 'packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp')
18 files changed, 1218 insertions, 0 deletions
diff --git a/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/iterator/Makefile b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/iterator/Makefile new file mode 100644 index 000000000000..7fe01d004f03 --- /dev/null +++ b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/iterator/Makefile @@ -0,0 +1,15 @@ +LEVEL = ../../../../../make + +CXX_SOURCES := main.cpp + +CFLAGS_EXTRAS += -O0 +USE_LIBSTDCPP := 1 + +# clang-3.5+ outputs FullDebugInfo by default for Darwin/FreeBSD  +# targets.  Other targets do not, which causes this test to fail. +# This flag enables FullDebugInfo for all targets. +ifneq (,$(findstring clang,$(CC))) +  CFLAGS_EXTRAS += -fno-limit-debug-info +endif + +include $(LEVEL)/Makefile.rules diff --git a/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/iterator/TestDataFormatterStdIterator.py b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/iterator/TestDataFormatterStdIterator.py new file mode 100644 index 000000000000..6742c9e71701 --- /dev/null +++ b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/iterator/TestDataFormatterStdIterator.py @@ -0,0 +1,62 @@ +""" +Test lldb data formatter subsystem. +""" + +from __future__ import print_function + + + +import os, time +import lldb +from lldbsuite.test.lldbtest import * +import lldbsuite.test.lldbutil as lldbutil + +class StdIteratorDataFormatterTestCase(TestBase): + +    mydir = TestBase.compute_mydir(__file__) + +    def setUp(self): +        # Call super's setUp(). +        TestBase.setUp(self) +        # Find the line number to break at. +        self.line = line_number('main.cpp', '// Set break point at this line.') + +    @skipIfWindows # libstdcpp not ported to Windows +    @expectedFailureIcc # llvm.org/pr15301 LLDB prints incorrect sizes of STL containers +    def test_with_run_command(self): +        """Test that libstdcpp iterators format properly.""" +        self.build() +        self.runCmd("file a.out", CURRENT_EXECUTABLE_SET) + +        lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line, num_expected_locations=-1) + +        self.runCmd("run", RUN_SUCCEEDED) + +        # The stop reason of the thread should be breakpoint. +        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, +            substrs = ['stopped', +                       'stop reason = breakpoint']) + +        # This is the function to remove the custom formats in order to have a +        # clean slate for the next test case. +        def cleanup(): +            self.runCmd('type format clear', check=False) +            self.runCmd('type summary clear', check=False) +            self.runCmd('type filter clear', check=False) +            self.runCmd('type synth clear', check=False) +            self.runCmd("settings set target.max-children-count 256", check=False) + +        # Execute the cleanup function during test case tear down. +        self.addTearDownHook(cleanup) + +        self.expect('frame variable ivI', substrs = ['item = 3']) +        self.expect('expr ivI', substrs = ['item = 3']) + +        self.expect('frame variable iimI', substrs = ['first = 0','second = 12']) +        self.expect('expr iimI', substrs = ['first = 0','second = 12']) + +        self.expect('frame variable simI', substrs = ['first = "world"','second = 42']) +        self.expect('expr simI', substrs = ['first = "world"','second = 42']) + +        self.expect('frame variable svI', substrs = ['item = "hello"']) +        self.expect('expr svI', substrs = ['item = "hello"']) diff --git a/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/iterator/main.cpp b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/iterator/main.cpp new file mode 100644 index 000000000000..d7b046c5bff8 --- /dev/null +++ b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/iterator/main.cpp @@ -0,0 +1,38 @@ +#include <string> +#include <map> +#include <vector> + +typedef std::map<int, int> intint_map; +typedef std::map<std::string, int> strint_map; + +typedef std::vector<int> int_vector; +typedef std::vector<std::string> string_vector; + +typedef intint_map::iterator iimter; +typedef strint_map::iterator simter; + +typedef int_vector::iterator ivter; +typedef string_vector::iterator svter; + +int main() +{ +    intint_map iim; +	iim[0] = 12; +	 +	strint_map sim; +	sim["world"] = 42; +     +	int_vector iv; +	iv.push_back(3); +	 +	string_vector sv; +	sv.push_back("hello"); + +	iimter iimI = iim.begin(); +	simter simI = sim.begin(); +	 +	ivter ivI = iv.begin(); +	svter svI = sv.begin(); + +    return 0; // Set break point at this line. +}
\ No newline at end of file diff --git a/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/list/Makefile b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/list/Makefile new file mode 100644 index 000000000000..7fe01d004f03 --- /dev/null +++ b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/list/Makefile @@ -0,0 +1,15 @@ +LEVEL = ../../../../../make + +CXX_SOURCES := main.cpp + +CFLAGS_EXTRAS += -O0 +USE_LIBSTDCPP := 1 + +# clang-3.5+ outputs FullDebugInfo by default for Darwin/FreeBSD  +# targets.  Other targets do not, which causes this test to fail. +# This flag enables FullDebugInfo for all targets. +ifneq (,$(findstring clang,$(CC))) +  CFLAGS_EXTRAS += -fno-limit-debug-info +endif + +include $(LEVEL)/Makefile.rules diff --git a/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/list/TestDataFormatterStdList.py b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/list/TestDataFormatterStdList.py new file mode 100644 index 000000000000..5147d18da0fe --- /dev/null +++ b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/list/TestDataFormatterStdList.py @@ -0,0 +1,188 @@ +""" +Test lldb data formatter subsystem. +""" + +from __future__ import print_function + + + +import os, time +import lldb +from lldbsuite.test.lldbtest import * +import lldbsuite.test.lldbutil as lldbutil + +class StdListDataFormatterTestCase(TestBase): + +    mydir = TestBase.compute_mydir(__file__) + +    def setUp(self): +        # Call super's setUp(). +        TestBase.setUp(self) +        # Find the line numbers to break at for the different tests. +        self.line = line_number('main.cpp', '// Set break point at this line.') +        self.optional_line = line_number('main.cpp', '// Optional break point at this line.') +        self.final_line = line_number('main.cpp', '// Set final break point at this line.') + +    @skipIfWindows # libstdcpp not ported to Windows +    def test_with_run_command(self): +        """Test that that file and class static variables display correctly.""" +        self.build() +        self.runCmd("file a.out", CURRENT_EXECUTABLE_SET) + +        lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line, num_expected_locations=-1) + +        self.runCmd("run", RUN_SUCCEEDED) + +        # The stop reason of the thread should be breakpoint. +        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, +            substrs = ['stopped', +                       'stop reason = breakpoint']) + +        # This is the function to remove the custom formats in order to have a +        # clean slate for the next test case. +        def cleanup(): +            self.runCmd('type format clear', check=False) +            self.runCmd('type summary clear', check=False) +            self.runCmd('type filter clear', check=False) +            self.runCmd('type synth clear', check=False) +            self.runCmd("settings set target.max-children-count 256", check=False) + +        # Execute the cleanup function during test case tear down. +        self.addTearDownHook(cleanup) + +        self.runCmd("frame variable numbers_list --show-types") + +        self.runCmd("type format add -f hex int") + +        self.expect("frame variable numbers_list --raw", matching=False, +                    substrs = ['size=0', +                               '{}']) +        self.expect("frame variable &numbers_list._M_impl._M_node --raw", matching=False, +                    substrs = ['size=0', +                               '{}']) + +        self.expect("frame variable numbers_list", +                    substrs = ['size=0', +                               '{}']) + +        self.expect("p numbers_list", +                    substrs = ['size=0', +                               '{}']) + +        self.runCmd("n") + +        self.expect("frame variable numbers_list", +                    substrs = ['size=1', +                               '[0] = ', +                               '0x12345678']) + +        self.runCmd("n");self.runCmd("n");self.runCmd("n"); + +        self.expect("frame variable numbers_list", +                    substrs = ['size=4', +                               '[0] = ', +                               '0x12345678', +                               '[1] =', +                               '0x11223344', +                               '[2] =', +                               '0xbeeffeed', +                               '[3] =', +                               '0x00abba00']) + +        self.runCmd("n");self.runCmd("n"); + +        self.expect("frame variable numbers_list", +                    substrs = ['size=6', +                               '[0] = ', +                               '0x12345678', +                               '0x11223344', +                               '0xbeeffeed', +                               '0x00abba00', +                               '[4] =', +                               '0x0abcdef0', +                               '[5] =', +                               '0x0cab0cab']) + +        self.expect("p numbers_list", +                    substrs = ['size=6', +                               '[0] = ', +                               '0x12345678', +                               '0x11223344', +                               '0xbeeffeed', +                               '0x00abba00', +                               '[4] =', +                               '0x0abcdef0', +                               '[5] =', +                               '0x0cab0cab']) + +        # check access-by-index +        self.expect("frame variable numbers_list[0]", +                    substrs = ['0x12345678']); +        self.expect("frame variable numbers_list[1]", +                    substrs = ['0x11223344']); +         +        # but check that expression does not rely on us +        self.expect("expression numbers_list[0]", matching=False, error=True, +                    substrs = ['0x12345678']) + +        # check that MightHaveChildren() gets it right +        self.assertTrue(self.frame().FindVariable("numbers_list").MightHaveChildren(), "numbers_list.MightHaveChildren() says False for non empty!") + +        self.runCmd("n") +             +        self.expect("frame variable numbers_list", +                    substrs = ['size=0', +                               '{}']) + +        self.runCmd("n");self.runCmd("n");self.runCmd("n");self.runCmd("n"); +             +        self.expect("frame variable numbers_list", +                    substrs = ['size=4', +                               '[0] = ', '1', +                               '[1] = ', '2', +                               '[2] = ', '3', +                               '[3] = ', '4'])             + +        self.runCmd("type format delete int") + +        self.runCmd("n") +             +        self.expect("frame variable text_list", +            substrs = ['size=0', +                       '{}']) +         +        lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.final_line, num_expected_locations=-1) + +        self.runCmd("c", RUN_SUCCEEDED) + +        # The stop reason of the thread should be breakpoint. +        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, +            substrs = ['stopped', +                       'stop reason = breakpoint']) + +        self.expect("frame variable text_list", +                    substrs = ['size=4', +                               '[0]', 'goofy', +                               '[1]', 'is', +                               '[2]', 'smart', +                               '[3]', '!!!']) + +        self.expect("p text_list", +                    substrs = ['size=4', +                               '\"goofy\"', +                               '\"is\"', +                               '\"smart\"', +                               '\"!!!\"']) +         +        # check access-by-index +        self.expect("frame variable text_list[0]", +                    substrs = ['goofy']); +        self.expect("frame variable text_list[3]", +                    substrs = ['!!!']); +         +        # but check that expression does not rely on us +        self.expect("expression text_list[0]", matching=False, error=True, +                    substrs = ['goofy']) + +        # check that MightHaveChildren() gets it right +        self.assertTrue(self.frame().FindVariable("text_list").MightHaveChildren(), "text_list.MightHaveChildren() says False for non empty!") diff --git a/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/list/main.cpp b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/list/main.cpp new file mode 100644 index 000000000000..191acdcc97be --- /dev/null +++ b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/list/main.cpp @@ -0,0 +1,34 @@ +#include <list> +#include <string> + +typedef std::list<int> int_list; +typedef std::list<std::string> string_list; + +int main() +{ +    int_list numbers_list; +     +    numbers_list.push_back(0x12345678); // Set break point at this line. +    numbers_list.push_back(0x11223344); +    numbers_list.push_back(0xBEEFFEED); +    numbers_list.push_back(0x00ABBA00); +    numbers_list.push_back(0x0ABCDEF0); +    numbers_list.push_back(0x0CAB0CAB); +     +    numbers_list.clear(); +     +    numbers_list.push_back(1); +    numbers_list.push_back(2); +    numbers_list.push_back(3); +    numbers_list.push_back(4); +     +    string_list text_list; +    text_list.push_back(std::string("goofy")); // Optional break point at this line. +    text_list.push_back(std::string("is")); +    text_list.push_back(std::string("smart")); +     +    text_list.push_back(std::string("!!!")); +         +    return 0; // Set final break point at this line. +} + diff --git a/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/map/Makefile b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/map/Makefile new file mode 100644 index 000000000000..2c6c3cf72842 --- /dev/null +++ b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/map/Makefile @@ -0,0 +1,14 @@ +LEVEL = ../../../../../make + +CXX_SOURCES := main.cpp + +USE_LIBSTDCPP := 1 + +# clang-3.5+ outputs FullDebugInfo by default for Darwin/FreeBSD +# targets.  Other targets do not, which causes this test to fail. +# This flag enables FullDebugInfo for all targets. +ifneq (,$(findstring clang,$(CC))) +  CFLAGS_EXTRAS += -fno-limit-debug-info +endif + +include $(LEVEL)/Makefile.rules diff --git a/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/map/TestDataFormatterStdMap.py b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/map/TestDataFormatterStdMap.py new file mode 100644 index 000000000000..e21c4e94c2c4 --- /dev/null +++ b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/map/TestDataFormatterStdMap.py @@ -0,0 +1,322 @@ +""" +Test lldb data formatter subsystem. +""" + +from __future__ import print_function + + + +import os, time +import lldb +from lldbsuite.test.lldbtest import * +import lldbsuite.test.lldbutil as lldbutil + +class StdMapDataFormatterTestCase(TestBase): + +    mydir = TestBase.compute_mydir(__file__) + +    def setUp(self): +        # Call super's setUp(). +        TestBase.setUp(self) +        # Find the line number to break at. +        self.line = line_number('main.cpp', '// Set break point at this line.') + +    @expectedFailureIcc   # llvm.org/pr15301: LLDB prints incorrect size of libstdc++ containers +    @skipIfWindows # libstdcpp not ported to Windows +    @skipIfFreeBSD +    def test_with_run_command(self): +        """Test that that file and class static variables display correctly.""" +        self.build() +        self.runCmd("file a.out", CURRENT_EXECUTABLE_SET) + +        lldbutil.run_break_set_by_source_regexp (self, "Set break point at this line.") + +        self.runCmd("run", RUN_SUCCEEDED) + +        # The stop reason of the thread should be breakpoint. +        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, +            substrs = ['stopped', +                       'stop reason = breakpoint']) + +        # This is the function to remove the custom formats in order to have a +        # clean slate for the next test case. +        def cleanup(): +            self.runCmd('type format clear', check=False) +            self.runCmd('type summary clear', check=False) +            self.runCmd('type filter clear', check=False) +            self.runCmd('type synth clear', check=False) +            self.runCmd("settings set target.max-children-count 256", check=False) + +        # Execute the cleanup function during test case tear down. +        self.addTearDownHook(cleanup) + +        self.runCmd("frame variable ii --show-types") +         +        self.runCmd("type summary add -x \"std::map<\" --summary-string \"map has ${svar%#} items\" -e")  +         +        self.expect('frame variable ii', +            substrs = ['map has 0 items', +                       '{}']) + +        self.runCmd("c"); + +        self.expect('frame variable ii', +                    substrs = ['map has 2 items', +                               '[0] = ', +                               'first = 0', +                               'second = 0', +                               '[1] = ', +                               'first = 1', +                               'second = 1']) + +        self.runCmd("c"); + +        self.expect('frame variable ii', +                    substrs = ['map has 4 items', +                               '[2] = ', +                               'first = 2', +                               'second = 0', +                               '[3] = ', +                               'first = 3', +                               'second = 1']) + +        self.runCmd("c"); + +        self.expect("frame variable ii", +                    substrs = ['map has 9 items', +                               '[5] = ', +                               'first = 5', +                               'second = 0', +                               '[7] = ', +                               'first = 7', +                               'second = 1']) +         +        self.expect("p ii", +                    substrs = ['map has 9 items', +                               '[5] = ', +                               'first = 5', +                               'second = 0', +                               '[7] = ', +                               'first = 7', +                               'second = 1']) + +        # check access-by-index +        self.expect("frame variable ii[0]", +                    substrs = ['first = 0', +                               'second = 0']); +        self.expect("frame variable ii[3]", +                    substrs = ['first =', +                               'second =']); +         +        self.expect("frame variable ii[8]", matching=True, +                    substrs = ['1234567']) + +        # check that MightHaveChildren() gets it right +        self.assertTrue(self.frame().FindVariable("ii").MightHaveChildren(), "ii.MightHaveChildren() says False for non empty!") + +        # check that the expression parser does not make use of +        # synthetic children instead of running code +        # TOT clang has a fix for this, which makes the expression command here succeed +        # since this would make the test fail or succeed depending on clang version in use +        # this is safer commented for the time being +        #self.expect("expression ii[8]", matching=False, error=True, +        #            substrs = ['1234567']) + +        self.runCmd("c") +         +        self.expect('frame variable ii', +                    substrs = ['map has 0 items', +                               '{}']) +         +        self.runCmd("frame variable si --show-types") + +        self.expect('frame variable si', +                    substrs = ['map has 0 items', +                               '{}']) + +        self.runCmd("c") + +        self.expect('frame variable si', +                    substrs = ['map has 1 items', +                               '[0] = ', +                               'first = \"zero\"', +                               'second = 0']) + +        self.runCmd("c"); + +        self.expect("frame variable si", +                    substrs = ['map has 5 items', +                               '[0] = ', +                               'first = \"zero\"', +                               'second = 0', +                                '[1] = ', +                                'first = \"one\"', +                                'second = 1', +                                '[2] = ', +                                'first = \"two\"', +                                'second = 2', +                                '[3] = ', +                                'first = \"three\"', +                                'second = 3', +                                '[4] = ', +                                'first = \"four\"', +                                'second = 4']) + +        self.expect("p si", +                    substrs = ['map has 5 items', +                               '[0] = ', +                               'first = \"zero\"', +                               'second = 0', +                               '[1] = ', +                               'first = \"one\"', +                               'second = 1', +                               '[2] = ', +                               'first = \"two\"', +                               'second = 2', +                               '[3] = ', +                               'first = \"three\"', +                               'second = 3', +                               '[4] = ', +                               'first = \"four\"', +                               'second = 4']) + +        # check access-by-index +        self.expect("frame variable si[0]", +                    substrs = ['first = ', 'four', +                               'second = 4']); + +        # check that MightHaveChildren() gets it right +        self.assertTrue(self.frame().FindVariable("si").MightHaveChildren(), "si.MightHaveChildren() says False for non empty!") + +        # check that the expression parser does not make use of +        # synthetic children instead of running code +        # TOT clang has a fix for this, which makes the expression command here succeed +        # since this would make the test fail or succeed depending on clang version in use +        # this is safer commented for the time being +        #self.expect("expression si[0]", matching=False, error=True, +        #            substrs = ['first = ', 'zero']) + +        self.runCmd("c") +         +        self.expect('frame variable si', +                    substrs = ['map has 0 items', +                               '{}']) + +        self.runCmd("frame variable is --show-types") +         +        self.expect('frame variable is', +                    substrs = ['map has 0 items', +                               '{}']) + +        self.runCmd("c"); + +        self.expect("frame variable is", +                    substrs = ['map has 4 items', +                               '[0] = ', +                               'second = \"goofy\"', +                               'first = 85', +                               '[1] = ', +                               'second = \"is\"', +                               'first = 1', +                               '[2] = ', +                               'second = \"smart\"', +                               'first = 2', +                               '[3] = ', +                               'second = \"!!!\"', +                               'first = 3']) +         +        self.expect("p is", +                    substrs = ['map has 4 items', +                               '[0] = ', +                               'second = \"goofy\"', +                               'first = 85', +                               '[1] = ', +                               'second = \"is\"', +                               'first = 1', +                               '[2] = ', +                               'second = \"smart\"', +                               'first = 2', +                               '[3] = ', +                               'second = \"!!!\"', +                               'first = 3']) + +        # check access-by-index +        self.expect("frame variable is[0]", +                    substrs = ['first = ', +                               'second =']); + +        # check that MightHaveChildren() gets it right +        self.assertTrue(self.frame().FindVariable("is").MightHaveChildren(), "is.MightHaveChildren() says False for non empty!") + +        # check that the expression parser does not make use of +        # synthetic children instead of running code +        # TOT clang has a fix for this, which makes the expression command here succeed +        # since this would make the test fail or succeed depending on clang version in use +        # this is safer commented for the time being +        #self.expect("expression is[0]", matching=False, error=True, +        #            substrs = ['first = ', 'goofy']) + +        self.runCmd("c") +         +        self.expect('frame variable is', +                    substrs = ['map has 0 items', +                               '{}']) + +        self.runCmd("frame variable ss --show-types") +         +        self.expect('frame variable ss', +                    substrs = ['map has 0 items', +                               '{}']) + +        self.runCmd("c"); + +        self.expect("frame variable ss", +                    substrs = ['map has 4 items', +                               '[0] = ', +                               'second = \"hello\"', +                               'first = \"ciao\"', +                               '[1] = ', +                               'second = \"house\"', +                               'first = \"casa\"', +                               '[2] = ', +                               'second = \"cat\"', +                               'first = \"gatto\"', +                               '[3] = ', +                               'second = \"..is always a Mac!\"', +                               'first = \"a Mac..\"']) +         +        self.expect("p ss", +                    substrs = ['map has 4 items', +                               '[0] = ', +                               'second = \"hello\"', +                               'first = \"ciao\"', +                               '[1] = ', +                               'second = \"house\"', +                               'first = \"casa\"', +                               '[2] = ', +                               'second = \"cat\"', +                               'first = \"gatto\"', +                               '[3] = ', +                               'second = \"..is always a Mac!\"', +                               'first = \"a Mac..\"']) + +        # check access-by-index +        self.expect("frame variable ss[3]", +                    substrs = ['gatto', 'cat']); + +        # check that MightHaveChildren() gets it right +        self.assertTrue(self.frame().FindVariable("ss").MightHaveChildren(), "ss.MightHaveChildren() says False for non empty!") +         +        # check that the expression parser does not make use of +        # synthetic children instead of running code +        # TOT clang has a fix for this, which makes the expression command here succeed +        # since this would make the test fail or succeed depending on clang version in use +        # this is safer commented for the time being +        #self.expect("expression ss[3]", matching=False, error=True, +        #            substrs = ['gatto']) + +        self.runCmd("c") +         +        self.expect('frame variable ss', +                    substrs = ['map has 0 items', +                               '{}']) diff --git a/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/map/main.cpp b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/map/main.cpp new file mode 100644 index 000000000000..568c35efe072 --- /dev/null +++ b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/map/main.cpp @@ -0,0 +1,55 @@ +#include <map> +#include <string> + +#define intint_map std::map<int, int>  +#define strint_map std::map<std::string, int>  +#define intstr_map std::map<int, std::string>  +#define strstr_map std::map<std::string, std::string>  + + +int main() +{ +    intint_map ii; +     +    ii[0] = 0; // Set break point at this line. +    ii[1] = 1; +    ii[2] = 0;// Set break point at this line. +    ii[3] = 1; +    ii[4] = 0;// Set break point at this line. +    ii[5] = 1; +    ii[6] = 0; +    ii[7] = 1; +    ii[85] = 1234567; +     +    ii.clear();// Set break point at this line. +     +    strint_map si; +     +    si["zero"] = 0;// Set break point at this line. +    si["one"] = 1;// Set break point at this line. +    si["two"] = 2; +    si["three"] = 3; +    si["four"] = 4; + +    si.clear();// Set break point at this line. +     +    intstr_map is; +     +    is[85] = "goofy";// Set break point at this line. +    is[1] = "is"; +    is[2] = "smart"; +    is[3] = "!!!"; +     +    is.clear();// Set break point at this line. +     +    strstr_map ss; +     +    ss["ciao"] = "hello";// Set break point at this line. +    ss["casa"] = "house"; +    ss["gatto"] = "cat"; +    ss["a Mac.."] = "..is always a Mac!"; +     +    ss.clear();// Set break point at this line. +     +    return 0;// Set break point at this line. +}
\ No newline at end of file diff --git a/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/string/Makefile b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/string/Makefile new file mode 100644 index 000000000000..7fe01d004f03 --- /dev/null +++ b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/string/Makefile @@ -0,0 +1,15 @@ +LEVEL = ../../../../../make + +CXX_SOURCES := main.cpp + +CFLAGS_EXTRAS += -O0 +USE_LIBSTDCPP := 1 + +# clang-3.5+ outputs FullDebugInfo by default for Darwin/FreeBSD  +# targets.  Other targets do not, which causes this test to fail. +# This flag enables FullDebugInfo for all targets. +ifneq (,$(findstring clang,$(CC))) +  CFLAGS_EXTRAS += -fno-limit-debug-info +endif + +include $(LEVEL)/Makefile.rules diff --git a/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/string/TestDataFormatterStdString.py b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/string/TestDataFormatterStdString.py new file mode 100644 index 000000000000..2d6af24c6afc --- /dev/null +++ b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/string/TestDataFormatterStdString.py @@ -0,0 +1,66 @@ +#coding=utf8 +""" +Test lldb data formatter subsystem. +""" + +from __future__ import print_function + + + +import os, time +import lldb +from lldbsuite.test.lldbtest import * +import lldbsuite.test.lldbutil as lldbutil + +class StdStringDataFormatterTestCase(TestBase): + +    mydir = TestBase.compute_mydir(__file__) + +    def setUp(self): +        # Call super's setUp(). +        TestBase.setUp(self) +        # Find the line number to break at. +        self.line = line_number('main.cpp', '// Set break point at this line.') + +    @skipIfWindows # libstdcpp not ported to Windows +    def test_with_run_command(self): +        """Test that that file and class static variables display correctly.""" +        self.build() +        self.runCmd("file a.out", CURRENT_EXECUTABLE_SET) + +        lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line, num_expected_locations=-1) + +        self.runCmd("run", RUN_SUCCEEDED) + +        # The stop reason of the thread should be breakpoint. +        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, +            substrs = ['stopped', +                       'stop reason = breakpoint']) + +        # This is the function to remove the custom formats in order to have a +        # clean slate for the next test case. +        def cleanup(): +            self.runCmd('type format clear', check=False) +            self.runCmd('type summary clear', check=False) +            self.runCmd('type filter clear', check=False) +            self.runCmd('type synth clear', check=False) +            self.runCmd("settings set target.max-children-count 256", check=False) + +        # Execute the cleanup function during test case tear down. +        self.addTearDownHook(cleanup) + +        var_s = self.frame().FindVariable('s') +        var_S = self.frame().FindVariable('S') +        var_mazeltov = self.frame().FindVariable('mazeltov') +        var_q = self.frame().FindVariable('q') +        var_Q = self.frame().FindVariable('Q') + +        self.assertTrue(var_s.GetSummary() == 'L"hello world! מזל טוב!"', "s summary wrong") +        self.assertTrue(var_S.GetSummary() == 'L"!!!!"', "S summary wrong") +        self.assertTrue(var_mazeltov.GetSummary() == 'L"מזל טוב"', "mazeltov summary wrong") +        self.assertTrue(var_q.GetSummary() == '"hello world"', "q summary wrong") +        self.assertTrue(var_Q.GetSummary() == '"quite a long std::strin with lots of info inside it"', "Q summary wrong") + +        self.runCmd("next") + +        self.assertTrue(var_S.GetSummary() == 'L"!!!!!"', "new S summary wrong") diff --git a/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/string/main.cpp b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/string/main.cpp new file mode 100644 index 000000000000..4a9b4fc7d0db --- /dev/null +++ b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/string/main.cpp @@ -0,0 +1,12 @@ +#include <string> + +int main() +{ +    std::wstring s(L"hello world! מזל טוב!"); +    std::wstring S(L"!!!!"); +    const wchar_t *mazeltov = L"מזל טוב"; +    std::string q("hello world"); +    std::string Q("quite a long std::strin with lots of info inside it"); +    S.assign(L"!!!!!"); // Set break point at this line. +    return 0; +}
\ No newline at end of file diff --git a/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/Makefile b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/Makefile new file mode 100644 index 000000000000..2e8bcb9079bd --- /dev/null +++ b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/Makefile @@ -0,0 +1,8 @@ +LEVEL = ../../../../../make + +CXX_SOURCES := main.cpp + +CFLAGS_EXTRAS += -O0 +USE_LIBSTDCPP := 1 + +include $(LEVEL)/Makefile.rules diff --git a/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/TestDataFormatterStdVBool.py b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/TestDataFormatterStdVBool.py new file mode 100644 index 000000000000..9e73009aba83 --- /dev/null +++ b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/TestDataFormatterStdVBool.py @@ -0,0 +1,58 @@ +""" +Test lldb data formatter subsystem. +""" + +from __future__ import print_function + + + +import os, time +import lldb +from lldbsuite.test.lldbtest import * +import lldbsuite.test.lldbutil as lldbutil + +class StdVBoolDataFormatterTestCase(TestBase): + +    mydir = TestBase.compute_mydir(__file__) + +    def setUp(self): +        # Call super's setUp(). +        TestBase.setUp(self) +        # Find the line number to break at. +        self.line = line_number('main.cpp', '// Set break point at this line.') + +    @expectedFailureFreeBSD("llvm.org/pr20548") # fails to build on lab.llvm.org buildbot +    @expectedFailureIcc # llvm.org/pr15301: lldb does not print the correct sizes of STL containers when building with ICC +    @skipIfWindows # libstdcpp not ported to Windows. +    @skipIfDarwin +    def test_with_run_command(self): +        """Test that that file and class static variables display correctly.""" +        self.build() +        self.runCmd("file a.out", CURRENT_EXECUTABLE_SET) + +        lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line, num_expected_locations=-1) + +        self.runCmd("run", RUN_SUCCEEDED) + +        # The stop reason of the thread should be breakpoint. +        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, +            substrs = ['stopped', +                       'stop reason = breakpoint']) + +        # This is the function to remove the custom formats in order to have a +        # clean slate for the next test case. +        def cleanup(): +            self.runCmd('type format clear', check=False) +            self.runCmd('type summary clear', check=False) +            self.runCmd('type filter clear', check=False) +            self.runCmd('type synth clear', check=False) +            self.runCmd("settings set target.max-children-count 256", check=False) + +        # Execute the cleanup function during test case tear down. +        self.addTearDownHook(cleanup) + +        self.expect("frame variable vBool", +            substrs = ['size=49','[0] = false','[1] = true','[18] = false','[27] = true','[36] = false','[47] = true','[48] = true']) + +        self.expect("expr vBool", +            substrs = ['size=49','[0] = false','[1] = true','[18] = false','[27] = true','[36] = false','[47] = true','[48] = true']) diff --git a/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/main.cpp b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/main.cpp new file mode 100644 index 000000000000..73956dd3fda3 --- /dev/null +++ b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/main.cpp @@ -0,0 +1,63 @@ +#include <vector> + +int main() +{ +    std::vector<bool> vBool; + +    vBool.push_back(false); +    vBool.push_back(true); +    vBool.push_back(false); +    vBool.push_back(true); +    vBool.push_back(false); +    vBool.push_back(true); +    vBool.push_back(false); +    vBool.push_back(true); +     +    vBool.push_back(false); +    vBool.push_back(true); +    vBool.push_back(false); +    vBool.push_back(true); +    vBool.push_back(false); +    vBool.push_back(true); +    vBool.push_back(false); +    vBool.push_back(true); + +    vBool.push_back(false); +    vBool.push_back(true); +    vBool.push_back(false); +    vBool.push_back(true); +    vBool.push_back(false); +    vBool.push_back(true); +    vBool.push_back(false); +    vBool.push_back(true); + +    vBool.push_back(false); +    vBool.push_back(true); +    vBool.push_back(false); +    vBool.push_back(true); +    vBool.push_back(false); +    vBool.push_back(true); +    vBool.push_back(false); +    vBool.push_back(true); + +    vBool.push_back(false); +    vBool.push_back(true); +    vBool.push_back(false); +    vBool.push_back(true); +    vBool.push_back(false); +    vBool.push_back(true); +    vBool.push_back(false); +    vBool.push_back(true); + +    vBool.push_back(false); +    vBool.push_back(true); +    vBool.push_back(false); +    vBool.push_back(true); +    vBool.push_back(false); +    vBool.push_back(true); +    vBool.push_back(false); +    vBool.push_back(true); +    vBool.push_back(true); + +    return 0; // Set break point at this line. +} diff --git a/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/Makefile b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/Makefile new file mode 100644 index 000000000000..88cb026aba1c --- /dev/null +++ b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/Makefile @@ -0,0 +1,15 @@ +LEVEL = ../../../../../make + +CXX_SOURCES := main.cpp + +CXXFLAGS := -O0 +USE_LIBSTDCPP := 1 + +# clang-3.5+ outputs FullDebugInfo by default for Darwin/FreeBSD +# targets.  Other targets do not, which causes this test to fail. +# This flag enables FullDebugInfo for all targets. +ifneq (,$(findstring clang,$(CC))) +  CFLAGS_EXTRAS += -fno-limit-debug-info +endif + +include $(LEVEL)/Makefile.rules diff --git a/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/TestDataFormatterStdVector.py b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/TestDataFormatterStdVector.py new file mode 100644 index 000000000000..ed4313657e93 --- /dev/null +++ b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/TestDataFormatterStdVector.py @@ -0,0 +1,207 @@ +""" +Test lldb data formatter subsystem. +""" + +from __future__ import print_function + + + +import os, time +import lldb +from lldbsuite.test.lldbtest import * +import lldbsuite.test.lldbutil as lldbutil + +class StdVectorDataFormatterTestCase(TestBase): + +    mydir = TestBase.compute_mydir(__file__) + +    def setUp(self): +        # Call super's setUp(). +        TestBase.setUp(self) +        # Find the line number to break at. +        self.line = line_number('main.cpp', '// Set break point at this line.') + +    @skipIfFreeBSD +    @expectedFailureIcc # llvm.org/pr15301 LLDB prints incorrect sizes of STL containers +    @skipIfWindows # libstdcpp not ported to Windows +    def test_with_run_command(self): +        """Test that that file and class static variables display correctly.""" +        self.build() +        self.runCmd("file a.out", CURRENT_EXECUTABLE_SET) + +        lldbutil.run_break_set_by_source_regexp (self, "Set break point at this line.") + +        self.runCmd("run", RUN_SUCCEEDED) + +        # The stop reason of the thread should be breakpoint. +        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, +            substrs = ['stopped', +                       'stop reason = breakpoint']) + +        # This is the function to remove the custom formats in order to have a +        # clean slate for the next test case. +        def cleanup(): +            self.runCmd('type format clear', check=False) +            self.runCmd('type summary clear', check=False) +            self.runCmd('type filter clear', check=False) +            self.runCmd('type synth clear', check=False) +            self.runCmd("settings set target.max-children-count 256", check=False) + +        # Execute the cleanup function during test case tear down. +        self.addTearDownHook(cleanup) + +        # empty vectors (and storage pointers SHOULD BOTH BE NULL..) +        self.expect("frame variable numbers", +            substrs = ['numbers = size=0']) + +        self.runCmd("c") +         +        # first value added +        self.expect("frame variable numbers", +                    substrs = ['numbers = size=1', +                               '[0] = 1', +                               '}']) + +        # add some more data +        self.runCmd("c"); +     +        self.expect("frame variable numbers", +                    substrs = ['numbers = size=4', +                               '[0] = 1', +                               '[1] = 12', +                               '[2] = 123', +                               '[3] = 1234', +                               '}']) + +        self.expect("p numbers", +                    substrs = ['$', 'size=4', +                               '[0] = 1', +                               '[1] = 12', +                               '[2] = 123', +                               '[3] = 1234', +                               '}']) + +         +        # check access to synthetic children +        self.runCmd("type summary add --summary-string \"item 0 is ${var[0]}\" std::int_vect int_vect") +        self.expect('frame variable numbers', +                    substrs = ['item 0 is 1']); +         +        self.runCmd("type summary add --summary-string \"item 0 is ${svar[0]}\" std::int_vect int_vect") +        #import time +        #time.sleep(19) +        self.expect('frame variable numbers', +                    substrs = ['item 0 is 1']); +        # move on with synths +        self.runCmd("type summary delete std::int_vect") +        self.runCmd("type summary delete int_vect") + +        # add some more data +        self.runCmd("c"); + +        self.expect("frame variable numbers", +                    substrs = ['numbers = size=7', +                               '[0] = 1', +                               '[1] = 12', +                               '[2] = 123', +                               '[3] = 1234', +                               '[4] = 12345', +                               '[5] = 123456', +                               '[6] = 1234567', +                               '}']) +             +        self.expect("p numbers", +                    substrs = ['$', 'size=7', +                               '[0] = 1', +                               '[1] = 12', +                               '[2] = 123', +                               '[3] = 1234', +                               '[4] = 12345', +                               '[5] = 123456', +                               '[6] = 1234567', +                               '}']) + +        # check access-by-index +        self.expect("frame variable numbers[0]", +                    substrs = ['1']); +        self.expect("frame variable numbers[1]", +                    substrs = ['12']); +        self.expect("frame variable numbers[2]", +                    substrs = ['123']); +        self.expect("frame variable numbers[3]", +                    substrs = ['1234']); +         +        # but check that expression does not rely on us +        # (when expression gets to call into STL code correctly, we will have to find +        # another way to check this) +        self.expect("expression numbers[6]", matching=False, error=True, +            substrs = ['1234567']) + +        # check that MightHaveChildren() gets it right +        self.assertTrue(self.frame().FindVariable("numbers").MightHaveChildren(), "numbers.MightHaveChildren() says False for non empty!") + +        # clear out the vector and see that we do the right thing once again +        self.runCmd("c") + +        self.expect("frame variable numbers", +            substrs = ['numbers = size=0']) + +        self.runCmd("c") + +        # first value added +        self.expect("frame variable numbers", +                    substrs = ['numbers = size=1', +                               '[0] = 7', +                               '}']) + +        # check if we can display strings +        self.runCmd("c") + +        self.expect("frame variable strings", +            substrs = ['goofy', +                       'is', +                       'smart']) + +        self.expect("p strings", +                    substrs = ['goofy', +                               'is', +                               'smart']) + +        # test summaries based on synthetic children +        self.runCmd("type summary add std::string_vect string_vect --summary-string \"vector has ${svar%#} items\" -e") +        self.expect("frame variable strings", +                    substrs = ['vector has 3 items', +                               'goofy', +                               'is', +                               'smart']) + +        self.expect("p strings", +                    substrs = ['vector has 3 items', +                               'goofy', +                               'is', +                               'smart']) + +        self.runCmd("c"); + +        self.expect("frame variable strings", +                    substrs = ['vector has 4 items']) +         +        # check access-by-index +        self.expect("frame variable strings[0]", +                    substrs = ['goofy']); +        self.expect("frame variable strings[1]", +                    substrs = ['is']); +         +        # but check that expression does not rely on us +        # (when expression gets to call into STL code correctly, we will have to find +        # another way to check this) +        self.expect("expression strings[0]", matching=False, error=True, +                    substrs = ['goofy']) + +        # check that MightHaveChildren() gets it right +        self.assertTrue(self.frame().FindVariable("strings").MightHaveChildren(), "strings.MightHaveChildren() says False for non empty!") + +        self.runCmd("c") + +        self.expect("frame variable strings", +            substrs = ['vector has 0 items']) diff --git a/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/main.cpp b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/main.cpp new file mode 100644 index 000000000000..010917995e40 --- /dev/null +++ b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/main.cpp @@ -0,0 +1,31 @@ +#include <string> +#include <vector> +typedef std::vector<int> int_vect; +typedef std::vector<std::string> string_vect; + +int main() +{ +    int_vect numbers; +    numbers.push_back(1);  // Set break point at this line. +    numbers.push_back(12);  // Set break point at this line. +    numbers.push_back(123); +    numbers.push_back(1234); +    numbers.push_back(12345);  // Set break point at this line. +    numbers.push_back(123456); +    numbers.push_back(1234567); +     +    numbers.clear();  // Set break point at this line. +     +    numbers.push_back(7);  // Set break point at this line. + +    string_vect strings;  // Set break point at this line. +    strings.push_back(std::string("goofy")); +    strings.push_back(std::string("is")); +    strings.push_back(std::string("smart")); +     +    strings.push_back(std::string("!!!"));  // Set break point at this line. +     +    strings.clear();  // Set break point at this line. +     +    return 0;// Set break point at this line. +}  | 
