xref: /llvm-project/lldb/test/API/functionalities/breakpoint/breakpoint_language/TestBreakpointLanguage.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest that the language option for breakpoints works correctly
399451b44SJordan Rupprechtparser.
499451b44SJordan Rupprecht"""
599451b44SJordan Rupprecht
699451b44SJordan Rupprecht
799451b44SJordan Rupprechtimport lldb
899451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
999451b44SJordan Rupprechtimport lldbsuite.test.lldbutil as lldbutil
1099451b44SJordan Rupprecht
1199451b44SJordan Rupprecht
1299451b44SJordan Rupprechtclass TestBreakpointLanguage(TestBase):
1399451b44SJordan Rupprecht    def check_location_file(self, bp, loc, test_name):
1499451b44SJordan Rupprecht        bp_loc = bp.GetLocationAtIndex(loc)
1599451b44SJordan Rupprecht        addr = bp_loc.GetAddress()
1699451b44SJordan Rupprecht        comp_unit = addr.GetCompileUnit()
1799451b44SJordan Rupprecht        comp_name = comp_unit.GetFileSpec().GetFilename()
1899451b44SJordan Rupprecht        return comp_name == test_name
1999451b44SJordan Rupprecht
2099451b44SJordan Rupprecht    def test_regex_breakpoint_language(self):
2199451b44SJordan Rupprecht        """Test that the name regex breakpoint commands obey the language filter."""
2299451b44SJordan Rupprecht
2399451b44SJordan Rupprecht        self.build()
2499451b44SJordan Rupprecht        # Create a target by the debugger.
2599451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
2699451b44SJordan Rupprecht        error = lldb.SBError()
2799451b44SJordan Rupprecht        # Don't read in dependencies so we don't come across false matches that
2899451b44SJordan Rupprecht        # add unwanted breakpoint hits.
2999451b44SJordan Rupprecht        self.target = self.dbg.CreateTarget(exe, None, None, False, error)
3099451b44SJordan Rupprecht        self.assertTrue(self.target, VALID_TARGET)
3199451b44SJordan Rupprecht
3299451b44SJordan Rupprecht        cpp_bp = self.target.BreakpointCreateByRegex(
3399451b44SJordan Rupprecht            "func_from",
3499451b44SJordan Rupprecht            lldb.eLanguageTypeC_plus_plus,
3599451b44SJordan Rupprecht            lldb.SBFileSpecList(),
36*2238dcc3SJonas Devlieghere            lldb.SBFileSpecList(),
37*2238dcc3SJonas Devlieghere        )
38*2238dcc3SJonas Devlieghere        self.assertEqual(cpp_bp.GetNumLocations(), 1, "Only one C++ symbol matches")
3999451b44SJordan Rupprecht        self.assertTrue(self.check_location_file(cpp_bp, 0, "b.cpp"))
4099451b44SJordan Rupprecht
4199451b44SJordan Rupprecht        c_bp = self.target.BreakpointCreateByRegex(
4299451b44SJordan Rupprecht            "func_from",
4399451b44SJordan Rupprecht            lldb.eLanguageTypeC,
4499451b44SJordan Rupprecht            lldb.SBFileSpecList(),
45*2238dcc3SJonas Devlieghere            lldb.SBFileSpecList(),
46*2238dcc3SJonas Devlieghere        )
47*2238dcc3SJonas Devlieghere        self.assertEqual(c_bp.GetNumLocations(), 1, "Only one C symbol matches")
4899451b44SJordan Rupprecht        self.assertTrue(self.check_location_file(c_bp, 0, "a.c"))
4999451b44SJordan Rupprecht
5099451b44SJordan Rupprecht        objc_bp = self.target.BreakpointCreateByRegex(
5199451b44SJordan Rupprecht            "func_from",
5299451b44SJordan Rupprecht            lldb.eLanguageTypeObjC,
5399451b44SJordan Rupprecht            lldb.SBFileSpecList(),
54*2238dcc3SJonas Devlieghere            lldb.SBFileSpecList(),
55*2238dcc3SJonas Devlieghere        )
56*2238dcc3SJonas Devlieghere        self.assertEqual(objc_bp.GetNumLocations(), 0, "No ObjC symbol matches")
5799451b44SJordan Rupprecht
5899451b44SJordan Rupprecht    def test_by_name_breakpoint_language(self):
5999451b44SJordan Rupprecht        """Test that the name regex breakpoint commands obey the language filter."""
6099451b44SJordan Rupprecht
6199451b44SJordan Rupprecht        self.build()
6299451b44SJordan Rupprecht        # Create a target by the debugger.
6399451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
6499451b44SJordan Rupprecht        error = lldb.SBError()
6599451b44SJordan Rupprecht        # Don't read in dependencies so we don't come across false matches that
6699451b44SJordan Rupprecht        # add unwanted breakpoint hits.
6799451b44SJordan Rupprecht        self.target = self.dbg.CreateTarget(exe, None, None, False, error)
6899451b44SJordan Rupprecht        self.assertTrue(self.target, VALID_TARGET)
6999451b44SJordan Rupprecht
7099451b44SJordan Rupprecht        cpp_bp = self.target.BreakpointCreateByName(
7199451b44SJordan Rupprecht            "func_from_cpp",
7299451b44SJordan Rupprecht            lldb.eFunctionNameTypeAuto,
7399451b44SJordan Rupprecht            lldb.eLanguageTypeC_plus_plus,
7499451b44SJordan Rupprecht            lldb.SBFileSpecList(),
75*2238dcc3SJonas Devlieghere            lldb.SBFileSpecList(),
76*2238dcc3SJonas Devlieghere        )
77*2238dcc3SJonas Devlieghere        self.assertEqual(cpp_bp.GetNumLocations(), 1, "Only one C++ symbol matches")
7899451b44SJordan Rupprecht        self.assertTrue(self.check_location_file(cpp_bp, 0, "b.cpp"))
7999451b44SJordan Rupprecht
8099451b44SJordan Rupprecht        no_cpp_bp = self.target.BreakpointCreateByName(
8199451b44SJordan Rupprecht            "func_from_c",
8299451b44SJordan Rupprecht            lldb.eFunctionNameTypeAuto,
8399451b44SJordan Rupprecht            lldb.eLanguageTypeC_plus_plus,
8499451b44SJordan Rupprecht            lldb.SBFileSpecList(),
85*2238dcc3SJonas Devlieghere            lldb.SBFileSpecList(),
86*2238dcc3SJonas Devlieghere        )
87*2238dcc3SJonas Devlieghere        self.assertEqual(no_cpp_bp.GetNumLocations(), 0, "And the C one doesn't match")
8899451b44SJordan Rupprecht
8999451b44SJordan Rupprecht        c_bp = self.target.BreakpointCreateByName(
9099451b44SJordan Rupprecht            "func_from_c",
9199451b44SJordan Rupprecht            lldb.eFunctionNameTypeAuto,
9299451b44SJordan Rupprecht            lldb.eLanguageTypeC,
9399451b44SJordan Rupprecht            lldb.SBFileSpecList(),
94*2238dcc3SJonas Devlieghere            lldb.SBFileSpecList(),
95*2238dcc3SJonas Devlieghere        )
96*2238dcc3SJonas Devlieghere        self.assertEqual(c_bp.GetNumLocations(), 1, "Only one C symbol matches")
9799451b44SJordan Rupprecht        self.assertTrue(self.check_location_file(c_bp, 0, "a.c"))
9899451b44SJordan Rupprecht
9999451b44SJordan Rupprecht        no_c_bp = self.target.BreakpointCreateByName(
10099451b44SJordan Rupprecht            "func_from_cpp",
10199451b44SJordan Rupprecht            lldb.eFunctionNameTypeAuto,
10299451b44SJordan Rupprecht            lldb.eLanguageTypeC,
10399451b44SJordan Rupprecht            lldb.SBFileSpecList(),
104*2238dcc3SJonas Devlieghere            lldb.SBFileSpecList(),
105*2238dcc3SJonas Devlieghere        )
106*2238dcc3SJonas Devlieghere        self.assertEqual(no_c_bp.GetNumLocations(), 0, "And the C++ one doesn't match")
10799451b44SJordan Rupprecht
10899451b44SJordan Rupprecht        objc_bp = self.target.BreakpointCreateByName(
10999451b44SJordan Rupprecht            "func_from_cpp",
11099451b44SJordan Rupprecht            lldb.eFunctionNameTypeAuto,
11199451b44SJordan Rupprecht            lldb.eLanguageTypeObjC,
11299451b44SJordan Rupprecht            lldb.SBFileSpecList(),
113*2238dcc3SJonas Devlieghere            lldb.SBFileSpecList(),
114*2238dcc3SJonas Devlieghere        )
115*2238dcc3SJonas Devlieghere        self.assertEqual(objc_bp.GetNumLocations(), 0, "No ObjC symbol matches")
116