xref: /llvm-project/lldb/test/API/functionalities/breakpoint/cpp/TestCPPBreakpointLocations.py (revision 80fcecb13c388ff087a27a4b0e7ca3dd8c98eaa4)
199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest lldb breakpoint ids.
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprechtimport lldb
699451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
799451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
899451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
999451b44SJordan Rupprecht
1099451b44SJordan Rupprecht
1199451b44SJordan Rupprechtclass TestCPPBreakpointLocations(TestBase):
1299451b44SJordan Rupprecht    @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24764")
1399451b44SJordan Rupprecht    def test(self):
143d83a577SArthur Eubanks        self.do_test(dict())
153d83a577SArthur Eubanks
163d83a577SArthur Eubanks    @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24764")
173d83a577SArthur Eubanks    @skipIf(compiler=no_match("clang"))
183d83a577SArthur Eubanks    @skipIf(compiler_version=["<", "15.0"])
193d83a577SArthur Eubanks    def test_simple_template_names(self):
203d83a577SArthur Eubanks        self.do_test(dict(CFLAGS_EXTRAS="-gsimple-template-names"))
213d83a577SArthur Eubanks
223d83a577SArthur Eubanks    def do_test(self, debug_flags):
233d83a577SArthur Eubanks        self.build(dictionary=debug_flags)
2499451b44SJordan Rupprecht        self.breakpoint_id_tests()
2599451b44SJordan Rupprecht
2699451b44SJordan Rupprecht    def verify_breakpoint_locations(self, target, bp_dict):
272238dcc3SJonas Devlieghere        name = bp_dict["name"]
282238dcc3SJonas Devlieghere        names = bp_dict["loc_names"]
2999451b44SJordan Rupprecht        bp = target.BreakpointCreateByName(name)
30*80fcecb1SJonas Devlieghere        self.assertEqual(
3199451b44SJordan Rupprecht            bp.GetNumLocations(),
3299451b44SJordan Rupprecht            len(names),
332238dcc3SJonas Devlieghere            "Make sure we find the right number of breakpoint locations for {}".format(
342238dcc3SJonas Devlieghere                name
352238dcc3SJonas Devlieghere            ),
362238dcc3SJonas Devlieghere        )
3799451b44SJordan Rupprecht
3899451b44SJordan Rupprecht        bp_loc_names = list()
3999451b44SJordan Rupprecht        for bp_loc in bp:
4099451b44SJordan Rupprecht            bp_loc_names.append(bp_loc.GetAddress().GetFunction().GetName())
4199451b44SJordan Rupprecht
4299451b44SJordan Rupprecht        for name in names:
4399451b44SJordan Rupprecht            found = name in bp_loc_names
4499451b44SJordan Rupprecht            if not found:
4599451b44SJordan Rupprecht                print("Didn't find '%s' in: %s" % (name, bp_loc_names))
4699451b44SJordan Rupprecht            self.assertTrue(found, "Make sure we find all required locations")
4799451b44SJordan Rupprecht
4899451b44SJordan Rupprecht    def breakpoint_id_tests(self):
4999451b44SJordan Rupprecht        # Create a target by the debugger.
5099451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
5199451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
5299451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
5399451b44SJordan Rupprecht        bp_dicts = [
542238dcc3SJonas Devlieghere            {
552238dcc3SJonas Devlieghere                "name": "func1",
562238dcc3SJonas Devlieghere                "loc_names": ["a::c::func1()", "aa::cc::func1()", "b::c::func1()"],
572238dcc3SJonas Devlieghere            },
582238dcc3SJonas Devlieghere            {
592238dcc3SJonas Devlieghere                "name": "func2",
602238dcc3SJonas Devlieghere                "loc_names": ["a::c::func2()", "aa::cc::func2()", "c::d::func2()"],
612238dcc3SJonas Devlieghere            },
622238dcc3SJonas Devlieghere            {
632238dcc3SJonas Devlieghere                "name": "func3",
642238dcc3SJonas Devlieghere                "loc_names": [
652238dcc3SJonas Devlieghere                    "a::c::func3()",
662238dcc3SJonas Devlieghere                    "aa::cc::func3()",
672238dcc3SJonas Devlieghere                    "b::c::func3()",
682238dcc3SJonas Devlieghere                    "c::d::func3()",
692238dcc3SJonas Devlieghere                ],
702238dcc3SJonas Devlieghere            },
712238dcc3SJonas Devlieghere            {"name": "c::func1", "loc_names": ["a::c::func1()", "b::c::func1()"]},
722238dcc3SJonas Devlieghere            {"name": "c::func2", "loc_names": ["a::c::func2()"]},
732238dcc3SJonas Devlieghere            {"name": "c::func3", "loc_names": ["a::c::func3()", "b::c::func3()"]},
742238dcc3SJonas Devlieghere            {"name": "a::c::func1", "loc_names": ["a::c::func1()"]},
752238dcc3SJonas Devlieghere            {"name": "b::c::func1", "loc_names": ["b::c::func1()"]},
762238dcc3SJonas Devlieghere            {"name": "c::d::func2", "loc_names": ["c::d::func2()"]},
772238dcc3SJonas Devlieghere            {"name": "a::c::func1()", "loc_names": ["a::c::func1()"]},
782238dcc3SJonas Devlieghere            {"name": "b::c::func1()", "loc_names": ["b::c::func1()"]},
792238dcc3SJonas Devlieghere            {"name": "c::d::func2()", "loc_names": ["c::d::func2()"]},
80d4a55ad3SMichael Buch            # Template cases
812238dcc3SJonas Devlieghere            {"name": "func<float>", "loc_names": []},
822238dcc3SJonas Devlieghere            {"name": "Foo::func<float>", "loc_names": []},
832238dcc3SJonas Devlieghere            {"name": "ns::Foo::func<float>", "loc_names": []},
842238dcc3SJonas Devlieghere            {"name": "func<int>", "loc_names": ["auto ns::Foo<double>::func<int>()"]},
852238dcc3SJonas Devlieghere            {
862238dcc3SJonas Devlieghere                "name": "Foo<double>::func<int>",
872238dcc3SJonas Devlieghere                "loc_names": ["auto ns::Foo<double>::func<int>()"],
882238dcc3SJonas Devlieghere            },
892238dcc3SJonas Devlieghere            {
902238dcc3SJonas Devlieghere                "name": "ns::Foo<double>::func<int>",
912238dcc3SJonas Devlieghere                "loc_names": ["auto ns::Foo<double>::func<int>()"],
922238dcc3SJonas Devlieghere            },
932238dcc3SJonas Devlieghere            {
942238dcc3SJonas Devlieghere                "name": "func",
952238dcc3SJonas Devlieghere                "loc_names": [
962238dcc3SJonas Devlieghere                    "auto ns::Foo<double>::func<int>()",
972238dcc3SJonas Devlieghere                    "auto ns::Foo<double>::func<ns::Foo<int>>()",
982238dcc3SJonas Devlieghere                ],
992238dcc3SJonas Devlieghere            },
1002238dcc3SJonas Devlieghere            {"name": "operator", "loc_names": []},
1012238dcc3SJonas Devlieghere            {
1022238dcc3SJonas Devlieghere                "name": "ns::Foo<double>::operator bool",
1032238dcc3SJonas Devlieghere                "loc_names": ["ns::Foo<double>::operator bool()"],
1042238dcc3SJonas Devlieghere            },
1052238dcc3SJonas Devlieghere            {
1062238dcc3SJonas Devlieghere                "name": "operator a::c",
1072238dcc3SJonas Devlieghere                "loc_names": ["ns::Foo<double>::operator a::c<a::c>()"],
1082238dcc3SJonas Devlieghere            },
1092238dcc3SJonas Devlieghere            {
1102238dcc3SJonas Devlieghere                "name": "operator ns::Foo<int>",
1112238dcc3SJonas Devlieghere                "loc_names": ["ns::Foo<double>::operator ns::Foo<int><ns::Foo<int>>()"],
1122238dcc3SJonas Devlieghere            },
1132238dcc3SJonas Devlieghere            {"name": "operator<<<a::c>", "loc_names": []},
1142238dcc3SJonas Devlieghere            {
1152238dcc3SJonas Devlieghere                "name": "operator<<<int>",
1162238dcc3SJonas Devlieghere                "loc_names": ["void ns::Foo<double>::operator<<<int>(int)"],
1172238dcc3SJonas Devlieghere            },
1182238dcc3SJonas Devlieghere            {
1192238dcc3SJonas Devlieghere                "name": "ns::Foo<double>::operator<<",
1202238dcc3SJonas Devlieghere                "loc_names": [
1212238dcc3SJonas Devlieghere                    "void ns::Foo<double>::operator<<<int>(int)",
1222238dcc3SJonas Devlieghere                    "void ns::Foo<double>::operator<<<ns::Foo<int>>(ns::Foo<int>)",
1232238dcc3SJonas Devlieghere                ],
1242238dcc3SJonas Devlieghere            },
1252238dcc3SJonas Devlieghere            {"name": "g<float>", "loc_names": []},
1262238dcc3SJonas Devlieghere            {"name": "g<int>", "loc_names": ["void ns::g<int>()"]},
1272238dcc3SJonas Devlieghere            {"name": "g<char>", "loc_names": ["void ns::g<char>()"]},
1282238dcc3SJonas Devlieghere            {"name": "g", "loc_names": ["void ns::g<int>()", "void ns::g<char>()"]},
1292238dcc3SJonas Devlieghere            {"name": "ns::g<float>", "loc_names": []},
1302238dcc3SJonas Devlieghere            {"name": "ns::g<int>", "loc_names": ["void ns::g<int>()"]},
1312238dcc3SJonas Devlieghere            {"name": "ns::g<char>", "loc_names": ["void ns::g<char>()"]},
1322238dcc3SJonas Devlieghere            {"name": "ns::g", "loc_names": ["void ns::g<int>()", "void ns::g<char>()"]},
13399451b44SJordan Rupprecht        ]
13499451b44SJordan Rupprecht
13599451b44SJordan Rupprecht        for bp_dict in bp_dicts:
13699451b44SJordan Rupprecht            self.verify_breakpoint_locations(target, bp_dict)
13799451b44SJordan Rupprecht
13899451b44SJordan Rupprecht    @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24764")
13999451b44SJordan Rupprecht    def test_destructors(self):
14099451b44SJordan Rupprecht        self.build()
14199451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
14299451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
14399451b44SJordan Rupprecht
14499451b44SJordan Rupprecht        # Don't skip prologue, so we can check the breakpoint address more
14599451b44SJordan Rupprecht        # easily
14699451b44SJordan Rupprecht        self.runCmd("settings set target.skip-prologue false")
14799451b44SJordan Rupprecht        try:
1482238dcc3SJonas Devlieghere            names = ["~c", "c::~c", "c::~c()"]
1492238dcc3SJonas Devlieghere            loc_names = {"a::c::~c()", "b::c::~c()"}
15099451b44SJordan Rupprecht            # TODO: For windows targets we should put windows mangled names
15199451b44SJordan Rupprecht            # here
1522238dcc3SJonas Devlieghere            symbols = ["_ZN1a1cD1Ev", "_ZN1a1cD2Ev", "_ZN1b1cD1Ev", "_ZN1b1cD2Ev"]
15399451b44SJordan Rupprecht
15499451b44SJordan Rupprecht            for name in names:
15599451b44SJordan Rupprecht                bp = target.BreakpointCreateByName(name)
15699451b44SJordan Rupprecht
1572238dcc3SJonas Devlieghere                bp_loc_names = {
1582238dcc3SJonas Devlieghere                    bp_loc.GetAddress().GetFunction().GetName() for bp_loc in bp
1592238dcc3SJonas Devlieghere                }
160*80fcecb1SJonas Devlieghere                self.assertEqual(
1612238dcc3SJonas Devlieghere                    bp_loc_names, loc_names, "Breakpoint set on the correct symbol"
1622238dcc3SJonas Devlieghere                )
16399451b44SJordan Rupprecht
16499451b44SJordan Rupprecht                bp_addresses = {bp_loc.GetLoadAddress() for bp_loc in bp}
16599451b44SJordan Rupprecht                symbol_addresses = set()
16699451b44SJordan Rupprecht                for symbol in symbols:
16799451b44SJordan Rupprecht                    sc_list = target.FindSymbols(symbol, lldb.eSymbolTypeCode)
168*80fcecb1SJonas Devlieghere                    self.assertEqual(sc_list.GetSize(), 1, "Found symbol " + symbol)
16999451b44SJordan Rupprecht                    symbol = sc_list.GetContextAtIndex(0).GetSymbol()
17099451b44SJordan Rupprecht                    symbol_addresses.add(
1712238dcc3SJonas Devlieghere                        symbol.GetStartAddress().GetLoadAddress(target)
1722238dcc3SJonas Devlieghere                    )
17399451b44SJordan Rupprecht
174*80fcecb1SJonas Devlieghere                self.assertEqual(
1752238dcc3SJonas Devlieghere                    symbol_addresses, bp_addresses, "Breakpoint set on correct address"
1762238dcc3SJonas Devlieghere                )
17799451b44SJordan Rupprecht        finally:
17899451b44SJordan Rupprecht            self.runCmd("settings clear target.skip-prologue")
179