xref: /llvm-project/lldb/test/API/functionalities/breakpoint/breakpoint_language/TestBreakpointLanguage.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
1"""
2Test that the language option for breakpoints works correctly
3parser.
4"""
5
6
7import lldb
8from lldbsuite.test.lldbtest import *
9import lldbsuite.test.lldbutil as lldbutil
10
11
12class TestBreakpointLanguage(TestBase):
13    def check_location_file(self, bp, loc, test_name):
14        bp_loc = bp.GetLocationAtIndex(loc)
15        addr = bp_loc.GetAddress()
16        comp_unit = addr.GetCompileUnit()
17        comp_name = comp_unit.GetFileSpec().GetFilename()
18        return comp_name == test_name
19
20    def test_regex_breakpoint_language(self):
21        """Test that the name regex breakpoint commands obey the language filter."""
22
23        self.build()
24        # Create a target by the debugger.
25        exe = self.getBuildArtifact("a.out")
26        error = lldb.SBError()
27        # Don't read in dependencies so we don't come across false matches that
28        # add unwanted breakpoint hits.
29        self.target = self.dbg.CreateTarget(exe, None, None, False, error)
30        self.assertTrue(self.target, VALID_TARGET)
31
32        cpp_bp = self.target.BreakpointCreateByRegex(
33            "func_from",
34            lldb.eLanguageTypeC_plus_plus,
35            lldb.SBFileSpecList(),
36            lldb.SBFileSpecList(),
37        )
38        self.assertEqual(cpp_bp.GetNumLocations(), 1, "Only one C++ symbol matches")
39        self.assertTrue(self.check_location_file(cpp_bp, 0, "b.cpp"))
40
41        c_bp = self.target.BreakpointCreateByRegex(
42            "func_from",
43            lldb.eLanguageTypeC,
44            lldb.SBFileSpecList(),
45            lldb.SBFileSpecList(),
46        )
47        self.assertEqual(c_bp.GetNumLocations(), 1, "Only one C symbol matches")
48        self.assertTrue(self.check_location_file(c_bp, 0, "a.c"))
49
50        objc_bp = self.target.BreakpointCreateByRegex(
51            "func_from",
52            lldb.eLanguageTypeObjC,
53            lldb.SBFileSpecList(),
54            lldb.SBFileSpecList(),
55        )
56        self.assertEqual(objc_bp.GetNumLocations(), 0, "No ObjC symbol matches")
57
58    def test_by_name_breakpoint_language(self):
59        """Test that the name regex breakpoint commands obey the language filter."""
60
61        self.build()
62        # Create a target by the debugger.
63        exe = self.getBuildArtifact("a.out")
64        error = lldb.SBError()
65        # Don't read in dependencies so we don't come across false matches that
66        # add unwanted breakpoint hits.
67        self.target = self.dbg.CreateTarget(exe, None, None, False, error)
68        self.assertTrue(self.target, VALID_TARGET)
69
70        cpp_bp = self.target.BreakpointCreateByName(
71            "func_from_cpp",
72            lldb.eFunctionNameTypeAuto,
73            lldb.eLanguageTypeC_plus_plus,
74            lldb.SBFileSpecList(),
75            lldb.SBFileSpecList(),
76        )
77        self.assertEqual(cpp_bp.GetNumLocations(), 1, "Only one C++ symbol matches")
78        self.assertTrue(self.check_location_file(cpp_bp, 0, "b.cpp"))
79
80        no_cpp_bp = self.target.BreakpointCreateByName(
81            "func_from_c",
82            lldb.eFunctionNameTypeAuto,
83            lldb.eLanguageTypeC_plus_plus,
84            lldb.SBFileSpecList(),
85            lldb.SBFileSpecList(),
86        )
87        self.assertEqual(no_cpp_bp.GetNumLocations(), 0, "And the C one doesn't match")
88
89        c_bp = self.target.BreakpointCreateByName(
90            "func_from_c",
91            lldb.eFunctionNameTypeAuto,
92            lldb.eLanguageTypeC,
93            lldb.SBFileSpecList(),
94            lldb.SBFileSpecList(),
95        )
96        self.assertEqual(c_bp.GetNumLocations(), 1, "Only one C symbol matches")
97        self.assertTrue(self.check_location_file(c_bp, 0, "a.c"))
98
99        no_c_bp = self.target.BreakpointCreateByName(
100            "func_from_cpp",
101            lldb.eFunctionNameTypeAuto,
102            lldb.eLanguageTypeC,
103            lldb.SBFileSpecList(),
104            lldb.SBFileSpecList(),
105        )
106        self.assertEqual(no_c_bp.GetNumLocations(), 0, "And the C++ one doesn't match")
107
108        objc_bp = self.target.BreakpointCreateByName(
109            "func_from_cpp",
110            lldb.eFunctionNameTypeAuto,
111            lldb.eLanguageTypeObjC,
112            lldb.SBFileSpecList(),
113            lldb.SBFileSpecList(),
114        )
115        self.assertEqual(objc_bp.GetNumLocations(), 0, "No ObjC symbol matches")
116