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