199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest that the language option for breakpoints works correctly
399451b44SJordan Rupprechtparser.
499451b44SJordan Rupprecht"""
599451b44SJordan Rupprecht
699451b44SJordan Rupprecht
799451b44SJordan Rupprecht
899451b44SJordan Rupprechtimport lldb
999451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
1099451b44SJordan Rupprechtimport lldbsuite.test.lldbutil as lldbutil
1199451b44SJordan Rupprecht
1299451b44SJordan Rupprecht
1399451b44SJordan Rupprechtclass TestBreakpointLanguage(TestBase):
1499451b44SJordan Rupprecht
1599451b44SJordan Rupprecht    def check_location_file(self, bp, loc, test_name):
1699451b44SJordan Rupprecht        bp_loc = bp.GetLocationAtIndex(loc)
1799451b44SJordan Rupprecht        addr = bp_loc.GetAddress()
1899451b44SJordan Rupprecht        comp_unit = addr.GetCompileUnit()
1999451b44SJordan Rupprecht        comp_name = comp_unit.GetFileSpec().GetFilename()
2099451b44SJordan Rupprecht        return comp_name == test_name
2199451b44SJordan Rupprecht
2299451b44SJordan Rupprecht    def test_regex_breakpoint_language(self):
2399451b44SJordan Rupprecht        """Test that the name regex breakpoint commands obey the language filter."""
2499451b44SJordan Rupprecht
2599451b44SJordan Rupprecht        self.build()
2699451b44SJordan Rupprecht        # Create a target by the debugger.
2799451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
2899451b44SJordan Rupprecht        error = lldb.SBError()
2999451b44SJordan Rupprecht        # Don't read in dependencies so we don't come across false matches that
3099451b44SJordan Rupprecht        # add unwanted breakpoint hits.
3199451b44SJordan Rupprecht        self.target = self.dbg.CreateTarget(exe, None, None, False, error)
3299451b44SJordan Rupprecht        self.assertTrue(self.target, VALID_TARGET)
3399451b44SJordan Rupprecht
3499451b44SJordan Rupprecht        cpp_bp = self.target.BreakpointCreateByRegex(
3599451b44SJordan Rupprecht            "func_from",
3699451b44SJordan Rupprecht            lldb.eLanguageTypeC_plus_plus,
3799451b44SJordan Rupprecht            lldb.SBFileSpecList(),
3899451b44SJordan Rupprecht            lldb.SBFileSpecList())
39*0ed758b2SDave Lee        self.assertEqual(
40*0ed758b2SDave Lee            cpp_bp.GetNumLocations(), 1,
4199451b44SJordan Rupprecht            "Only one C++ symbol matches")
4299451b44SJordan Rupprecht        self.assertTrue(self.check_location_file(cpp_bp, 0, "b.cpp"))
4399451b44SJordan Rupprecht
4499451b44SJordan Rupprecht        c_bp = self.target.BreakpointCreateByRegex(
4599451b44SJordan Rupprecht            "func_from",
4699451b44SJordan Rupprecht            lldb.eLanguageTypeC,
4799451b44SJordan Rupprecht            lldb.SBFileSpecList(),
4899451b44SJordan Rupprecht            lldb.SBFileSpecList())
49*0ed758b2SDave Lee        self.assertEqual(
50*0ed758b2SDave Lee            c_bp.GetNumLocations(), 1,
5199451b44SJordan Rupprecht            "Only one C symbol matches")
5299451b44SJordan Rupprecht        self.assertTrue(self.check_location_file(c_bp, 0, "a.c"))
5399451b44SJordan Rupprecht
5499451b44SJordan Rupprecht        objc_bp = self.target.BreakpointCreateByRegex(
5599451b44SJordan Rupprecht            "func_from",
5699451b44SJordan Rupprecht            lldb.eLanguageTypeObjC,
5799451b44SJordan Rupprecht            lldb.SBFileSpecList(),
5899451b44SJordan Rupprecht            lldb.SBFileSpecList())
59*0ed758b2SDave Lee        self.assertEqual(
60*0ed758b2SDave Lee            objc_bp.GetNumLocations(), 0,
6199451b44SJordan Rupprecht            "No ObjC symbol matches")
6299451b44SJordan Rupprecht
6399451b44SJordan Rupprecht    def test_by_name_breakpoint_language(self):
6499451b44SJordan Rupprecht        """Test that the name regex breakpoint commands obey the language filter."""
6599451b44SJordan Rupprecht
6699451b44SJordan Rupprecht        self.build()
6799451b44SJordan Rupprecht        # Create a target by the debugger.
6899451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
6999451b44SJordan Rupprecht        error = lldb.SBError()
7099451b44SJordan Rupprecht        # Don't read in dependencies so we don't come across false matches that
7199451b44SJordan Rupprecht        # add unwanted breakpoint hits.
7299451b44SJordan Rupprecht        self.target = self.dbg.CreateTarget(exe, None, None, False, error)
7399451b44SJordan Rupprecht        self.assertTrue(self.target, VALID_TARGET)
7499451b44SJordan Rupprecht
7599451b44SJordan Rupprecht        cpp_bp = self.target.BreakpointCreateByName(
7699451b44SJordan Rupprecht            "func_from_cpp",
7799451b44SJordan Rupprecht            lldb.eFunctionNameTypeAuto,
7899451b44SJordan Rupprecht            lldb.eLanguageTypeC_plus_plus,
7999451b44SJordan Rupprecht            lldb.SBFileSpecList(),
8099451b44SJordan Rupprecht            lldb.SBFileSpecList())
81*0ed758b2SDave Lee        self.assertEqual(
82*0ed758b2SDave Lee            cpp_bp.GetNumLocations(), 1,
8399451b44SJordan Rupprecht            "Only one C++ symbol matches")
8499451b44SJordan Rupprecht        self.assertTrue(self.check_location_file(cpp_bp, 0, "b.cpp"))
8599451b44SJordan Rupprecht
8699451b44SJordan Rupprecht        no_cpp_bp = self.target.BreakpointCreateByName(
8799451b44SJordan Rupprecht            "func_from_c",
8899451b44SJordan Rupprecht            lldb.eFunctionNameTypeAuto,
8999451b44SJordan Rupprecht            lldb.eLanguageTypeC_plus_plus,
9099451b44SJordan Rupprecht            lldb.SBFileSpecList(),
9199451b44SJordan Rupprecht            lldb.SBFileSpecList())
92*0ed758b2SDave Lee        self.assertEqual(
93*0ed758b2SDave Lee            no_cpp_bp.GetNumLocations(), 0,
9499451b44SJordan Rupprecht            "And the C one doesn't match")
9599451b44SJordan Rupprecht
9699451b44SJordan Rupprecht        c_bp = self.target.BreakpointCreateByName(
9799451b44SJordan Rupprecht            "func_from_c",
9899451b44SJordan Rupprecht            lldb.eFunctionNameTypeAuto,
9999451b44SJordan Rupprecht            lldb.eLanguageTypeC,
10099451b44SJordan Rupprecht            lldb.SBFileSpecList(),
10199451b44SJordan Rupprecht            lldb.SBFileSpecList())
102*0ed758b2SDave Lee        self.assertEqual(
103*0ed758b2SDave Lee            c_bp.GetNumLocations(), 1,
10499451b44SJordan Rupprecht            "Only one C symbol matches")
10599451b44SJordan Rupprecht        self.assertTrue(self.check_location_file(c_bp, 0, "a.c"))
10699451b44SJordan Rupprecht
10799451b44SJordan Rupprecht        no_c_bp = self.target.BreakpointCreateByName(
10899451b44SJordan Rupprecht            "func_from_cpp",
10999451b44SJordan Rupprecht            lldb.eFunctionNameTypeAuto,
11099451b44SJordan Rupprecht            lldb.eLanguageTypeC,
11199451b44SJordan Rupprecht            lldb.SBFileSpecList(),
11299451b44SJordan Rupprecht            lldb.SBFileSpecList())
113*0ed758b2SDave Lee        self.assertEqual(
114*0ed758b2SDave Lee            no_c_bp.GetNumLocations(), 0,
11599451b44SJordan Rupprecht            "And the C++ one doesn't match")
11699451b44SJordan Rupprecht
11799451b44SJordan Rupprecht        objc_bp = self.target.BreakpointCreateByName(
11899451b44SJordan Rupprecht            "func_from_cpp",
11999451b44SJordan Rupprecht            lldb.eFunctionNameTypeAuto,
12099451b44SJordan Rupprecht            lldb.eLanguageTypeObjC,
12199451b44SJordan Rupprecht            lldb.SBFileSpecList(),
12299451b44SJordan Rupprecht            lldb.SBFileSpecList())
123*0ed758b2SDave Lee        self.assertEqual(
124*0ed758b2SDave Lee            objc_bp.GetNumLocations(), 0,
12599451b44SJordan Rupprecht            "No ObjC symbol matches")
126