xref: /llvm-project/lldb/test/API/symbol_ondemand/breakpoint_language/TestBreakpointLanguageOnDemand.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
17b81192dSJeffrey Tan"""
27b81192dSJeffrey TanTest that the language option for breakpoints works correctly
37b81192dSJeffrey Tanwith symbol load on-demand.
47b81192dSJeffrey Tan"""
57b81192dSJeffrey Tan
67b81192dSJeffrey Tan
77b81192dSJeffrey Tanimport lldb
80ffcec41SJeffrey Tanfrom lldbsuite.test.decorators import *
97b81192dSJeffrey Tanfrom lldbsuite.test.lldbtest import *
107b81192dSJeffrey Tanimport lldbsuite.test.lldbutil as lldbutil
117b81192dSJeffrey Tan
127b81192dSJeffrey Tan
137b81192dSJeffrey Tanclass TestBreakpointLanguage(TestBase):
147b81192dSJeffrey Tan    def check_location_file(self, bp, loc, test_name):
157b81192dSJeffrey Tan        bp_loc = bp.GetLocationAtIndex(loc)
167b81192dSJeffrey Tan        addr = bp_loc.GetAddress()
177b81192dSJeffrey Tan        comp_unit = addr.GetCompileUnit()
187b81192dSJeffrey Tan        comp_name = comp_unit.GetFileSpec().GetFilename()
197b81192dSJeffrey Tan        return comp_name == test_name
207b81192dSJeffrey Tan
21d738d471SJeffrey Tan    @skipIfWindows
227b81192dSJeffrey Tan    def test_regex_breakpoint_language(self):
237b81192dSJeffrey Tan        """Test that the name regex breakpoint commands obey the language filter."""
247b81192dSJeffrey Tan
257b81192dSJeffrey Tan        self.build()
267b81192dSJeffrey Tan
277b81192dSJeffrey Tan        # Load symbols on-demand
287b81192dSJeffrey Tan        self.runCmd("settings set symbols.load-on-demand true")
297b81192dSJeffrey Tan
307b81192dSJeffrey Tan        # Create a target by the debugger.
317b81192dSJeffrey Tan        exe = self.getBuildArtifact("a.out")
327b81192dSJeffrey Tan        error = lldb.SBError()
337b81192dSJeffrey Tan        # Don't read in dependencies so we don't come across false matches that
347b81192dSJeffrey Tan        # add unwanted breakpoint hits.
357b81192dSJeffrey Tan        self.target = self.dbg.CreateTarget(exe, None, None, False, error)
367b81192dSJeffrey Tan        self.assertTrue(self.target, VALID_TARGET)
377b81192dSJeffrey Tan
387b81192dSJeffrey Tan        cpp_bp = self.target.BreakpointCreateByRegex(
397b81192dSJeffrey Tan            "func_from",
407b81192dSJeffrey Tan            lldb.eLanguageTypeC_plus_plus,
417b81192dSJeffrey Tan            lldb.SBFileSpecList(),
42*2238dcc3SJonas Devlieghere            lldb.SBFileSpecList(),
43*2238dcc3SJonas Devlieghere        )
44*2238dcc3SJonas Devlieghere        self.assertEqual(cpp_bp.GetNumLocations(), 1, "Only one C++ symbol matches")
457b81192dSJeffrey Tan        self.assertTrue(self.check_location_file(cpp_bp, 0, "cpp_lang.cpp"))
467b81192dSJeffrey Tan
477b81192dSJeffrey Tan        c_bp = self.target.BreakpointCreateByRegex(
487b81192dSJeffrey Tan            "func_from",
497b81192dSJeffrey Tan            lldb.eLanguageTypeC,
507b81192dSJeffrey Tan            lldb.SBFileSpecList(),
51*2238dcc3SJonas Devlieghere            lldb.SBFileSpecList(),
52*2238dcc3SJonas Devlieghere        )
53*2238dcc3SJonas Devlieghere        self.assertEqual(c_bp.GetNumLocations(), 1, "Only one C symbol matches")
547b81192dSJeffrey Tan        self.assertTrue(self.check_location_file(c_bp, 0, "c_lang.c"))
557b81192dSJeffrey Tan
567b81192dSJeffrey Tan        objc_bp = self.target.BreakpointCreateByRegex(
577b81192dSJeffrey Tan            "func_from",
587b81192dSJeffrey Tan            lldb.eLanguageTypeObjC,
597b81192dSJeffrey Tan            lldb.SBFileSpecList(),
60*2238dcc3SJonas Devlieghere            lldb.SBFileSpecList(),
61*2238dcc3SJonas Devlieghere        )
62*2238dcc3SJonas Devlieghere        self.assertEqual(objc_bp.GetNumLocations(), 0, "No ObjC symbol matches")
637b81192dSJeffrey Tan
64d738d471SJeffrey Tan    @skipIfWindows
657b81192dSJeffrey Tan    def test_by_name_breakpoint_language(self):
667b81192dSJeffrey Tan        """Test that the name regex breakpoint commands obey the language filter."""
677b81192dSJeffrey Tan
687b81192dSJeffrey Tan        self.build()
697b81192dSJeffrey Tan
707b81192dSJeffrey Tan        # Load symbols on-demand
717b81192dSJeffrey Tan        self.runCmd("settings set symbols.load-on-demand true")
727b81192dSJeffrey Tan
737b81192dSJeffrey Tan        # Create a target by the debugger.
747b81192dSJeffrey Tan        exe = self.getBuildArtifact("a.out")
757b81192dSJeffrey Tan        error = lldb.SBError()
767b81192dSJeffrey Tan        # Don't read in dependencies so we don't come across false matches that
777b81192dSJeffrey Tan        # add unwanted breakpoint hits.
787b81192dSJeffrey Tan        self.target = self.dbg.CreateTarget(exe, None, None, False, error)
797b81192dSJeffrey Tan        self.assertTrue(self.target, VALID_TARGET)
807b81192dSJeffrey Tan
817b81192dSJeffrey Tan        cpp_bp = self.target.BreakpointCreateByName(
827b81192dSJeffrey Tan            "func_from_cpp",
837b81192dSJeffrey Tan            lldb.eFunctionNameTypeAuto,
847b81192dSJeffrey Tan            lldb.eLanguageTypeC_plus_plus,
857b81192dSJeffrey Tan            lldb.SBFileSpecList(),
86*2238dcc3SJonas Devlieghere            lldb.SBFileSpecList(),
87*2238dcc3SJonas Devlieghere        )
88*2238dcc3SJonas Devlieghere        self.assertEqual(cpp_bp.GetNumLocations(), 1, "Only one C++ symbol matches")
897b81192dSJeffrey Tan        self.assertTrue(self.check_location_file(cpp_bp, 0, "cpp_lang.cpp"))
907b81192dSJeffrey Tan
917b81192dSJeffrey Tan        no_cpp_bp = self.target.BreakpointCreateByName(
927b81192dSJeffrey Tan            "func_from_c",
937b81192dSJeffrey Tan            lldb.eFunctionNameTypeAuto,
947b81192dSJeffrey Tan            lldb.eLanguageTypeC_plus_plus,
957b81192dSJeffrey Tan            lldb.SBFileSpecList(),
96*2238dcc3SJonas Devlieghere            lldb.SBFileSpecList(),
97*2238dcc3SJonas Devlieghere        )
98*2238dcc3SJonas Devlieghere        self.assertEqual(no_cpp_bp.GetNumLocations(), 0, "And the C one doesn't match")
997b81192dSJeffrey Tan
1007b81192dSJeffrey Tan        c_bp = self.target.BreakpointCreateByName(
1017b81192dSJeffrey Tan            "func_from_c",
1027b81192dSJeffrey Tan            lldb.eFunctionNameTypeAuto,
1037b81192dSJeffrey Tan            lldb.eLanguageTypeC,
1047b81192dSJeffrey Tan            lldb.SBFileSpecList(),
105*2238dcc3SJonas Devlieghere            lldb.SBFileSpecList(),
106*2238dcc3SJonas Devlieghere        )
107*2238dcc3SJonas Devlieghere        self.assertEqual(c_bp.GetNumLocations(), 1, "Only one C symbol matches")
1087b81192dSJeffrey Tan        self.assertTrue(self.check_location_file(c_bp, 0, "c_lang.c"))
1097b81192dSJeffrey Tan
1107b81192dSJeffrey Tan        no_c_bp = self.target.BreakpointCreateByName(
1117b81192dSJeffrey Tan            "func_from_cpp",
1127b81192dSJeffrey Tan            lldb.eFunctionNameTypeAuto,
1137b81192dSJeffrey Tan            lldb.eLanguageTypeC,
1147b81192dSJeffrey Tan            lldb.SBFileSpecList(),
115*2238dcc3SJonas Devlieghere            lldb.SBFileSpecList(),
116*2238dcc3SJonas Devlieghere        )
117*2238dcc3SJonas Devlieghere        self.assertEqual(no_c_bp.GetNumLocations(), 0, "And the C++ one doesn't match")
1187b81192dSJeffrey Tan
1197b81192dSJeffrey Tan        objc_bp = self.target.BreakpointCreateByName(
1207b81192dSJeffrey Tan            "func_from_cpp",
1217b81192dSJeffrey Tan            lldb.eFunctionNameTypeAuto,
1227b81192dSJeffrey Tan            lldb.eLanguageTypeObjC,
1237b81192dSJeffrey Tan            lldb.SBFileSpecList(),
124*2238dcc3SJonas Devlieghere            lldb.SBFileSpecList(),
125*2238dcc3SJonas Devlieghere        )
126*2238dcc3SJonas Devlieghere        self.assertEqual(objc_bp.GetNumLocations(), 0, "No ObjC symbol matches")
127