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