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