199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest lldb breakpoint ids. 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 599451b44SJordan Rupprechtfrom __future__ import print_function 699451b44SJordan Rupprecht 799451b44SJordan Rupprecht 899451b44SJordan Rupprechtimport lldb 999451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 1099451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 1199451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 1299451b44SJordan Rupprecht 1399451b44SJordan Rupprecht 1499451b44SJordan Rupprechtclass TestCPPBreakpointLocations(TestBase): 1599451b44SJordan Rupprecht 1699451b44SJordan Rupprecht @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24764") 1799451b44SJordan Rupprecht def test(self): 1899451b44SJordan Rupprecht self.build() 1999451b44SJordan Rupprecht self.breakpoint_id_tests() 2099451b44SJordan Rupprecht 2199451b44SJordan Rupprecht def verify_breakpoint_locations(self, target, bp_dict): 2299451b44SJordan Rupprecht 2399451b44SJordan Rupprecht name = bp_dict['name'] 2499451b44SJordan Rupprecht names = bp_dict['loc_names'] 2599451b44SJordan Rupprecht bp = target.BreakpointCreateByName(name) 2699451b44SJordan Rupprecht self.assertEquals( 2799451b44SJordan Rupprecht bp.GetNumLocations(), 2899451b44SJordan Rupprecht len(names), 29*3339000eSJim Ingham "Make sure we find the right number of breakpoint locations for {}".format(name)) 3099451b44SJordan Rupprecht 3199451b44SJordan Rupprecht bp_loc_names = list() 3299451b44SJordan Rupprecht for bp_loc in bp: 3399451b44SJordan Rupprecht bp_loc_names.append(bp_loc.GetAddress().GetFunction().GetName()) 3499451b44SJordan Rupprecht 3599451b44SJordan Rupprecht for name in names: 3699451b44SJordan Rupprecht found = name in bp_loc_names 3799451b44SJordan Rupprecht if not found: 3899451b44SJordan Rupprecht print("Didn't find '%s' in: %s" % (name, bp_loc_names)) 3999451b44SJordan Rupprecht self.assertTrue(found, "Make sure we find all required locations") 4099451b44SJordan Rupprecht 4199451b44SJordan Rupprecht def breakpoint_id_tests(self): 4299451b44SJordan Rupprecht 4399451b44SJordan Rupprecht # Create a target by the debugger. 4499451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 4599451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 4699451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 4799451b44SJordan Rupprecht bp_dicts = [ 48*3339000eSJim Ingham {'name': 'func1', 'loc_names': ['a::c::func1()', 'aa::cc::func1()', 'b::c::func1()']}, 49*3339000eSJim Ingham {'name': 'func2', 'loc_names': ['a::c::func2()', 'aa::cc::func2()', 'c::d::func2()']}, 50*3339000eSJim Ingham {'name': 'func3', 'loc_names': ['a::c::func3()', 'aa::cc::func3()', 'b::c::func3()', 'c::d::func3()']}, 5199451b44SJordan Rupprecht {'name': 'c::func1', 'loc_names': ['a::c::func1()', 'b::c::func1()']}, 5299451b44SJordan Rupprecht {'name': 'c::func2', 'loc_names': ['a::c::func2()']}, 5399451b44SJordan Rupprecht {'name': 'c::func3', 'loc_names': ['a::c::func3()', 'b::c::func3()']}, 5499451b44SJordan Rupprecht {'name': 'a::c::func1', 'loc_names': ['a::c::func1()']}, 5599451b44SJordan Rupprecht {'name': 'b::c::func1', 'loc_names': ['b::c::func1()']}, 5699451b44SJordan Rupprecht {'name': 'c::d::func2', 'loc_names': ['c::d::func2()']}, 5799451b44SJordan Rupprecht {'name': 'a::c::func1()', 'loc_names': ['a::c::func1()']}, 5899451b44SJordan Rupprecht {'name': 'b::c::func1()', 'loc_names': ['b::c::func1()']}, 5999451b44SJordan Rupprecht {'name': 'c::d::func2()', 'loc_names': ['c::d::func2()']}, 6099451b44SJordan Rupprecht ] 6199451b44SJordan Rupprecht 6299451b44SJordan Rupprecht for bp_dict in bp_dicts: 6399451b44SJordan Rupprecht self.verify_breakpoint_locations(target, bp_dict) 6499451b44SJordan Rupprecht 6599451b44SJordan Rupprecht @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24764") 6699451b44SJordan Rupprecht def test_destructors(self): 6799451b44SJordan Rupprecht self.build() 6899451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 6999451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 7099451b44SJordan Rupprecht 7199451b44SJordan Rupprecht # Don't skip prologue, so we can check the breakpoint address more 7299451b44SJordan Rupprecht # easily 7399451b44SJordan Rupprecht self.runCmd("settings set target.skip-prologue false") 7499451b44SJordan Rupprecht try: 7599451b44SJordan Rupprecht names = ['~c', 'c::~c', 'c::~c()'] 7699451b44SJordan Rupprecht loc_names = {'a::c::~c()', 'b::c::~c()'} 7799451b44SJordan Rupprecht # TODO: For windows targets we should put windows mangled names 7899451b44SJordan Rupprecht # here 7999451b44SJordan Rupprecht symbols = [ 8099451b44SJordan Rupprecht '_ZN1a1cD1Ev', 8199451b44SJordan Rupprecht '_ZN1a1cD2Ev', 8299451b44SJordan Rupprecht '_ZN1b1cD1Ev', 8399451b44SJordan Rupprecht '_ZN1b1cD2Ev'] 8499451b44SJordan Rupprecht 8599451b44SJordan Rupprecht for name in names: 8699451b44SJordan Rupprecht bp = target.BreakpointCreateByName(name) 8799451b44SJordan Rupprecht 8899451b44SJordan Rupprecht bp_loc_names = {bp_loc.GetAddress().GetFunction().GetName() 8999451b44SJordan Rupprecht for bp_loc in bp} 9099451b44SJordan Rupprecht self.assertEquals( 9199451b44SJordan Rupprecht bp_loc_names, 9299451b44SJordan Rupprecht loc_names, 9399451b44SJordan Rupprecht "Breakpoint set on the correct symbol") 9499451b44SJordan Rupprecht 9599451b44SJordan Rupprecht bp_addresses = {bp_loc.GetLoadAddress() for bp_loc in bp} 9699451b44SJordan Rupprecht symbol_addresses = set() 9799451b44SJordan Rupprecht for symbol in symbols: 9899451b44SJordan Rupprecht sc_list = target.FindSymbols(symbol, lldb.eSymbolTypeCode) 9999451b44SJordan Rupprecht self.assertEquals( 10099451b44SJordan Rupprecht sc_list.GetSize(), 1, "Found symbol " + symbol) 10199451b44SJordan Rupprecht symbol = sc_list.GetContextAtIndex(0).GetSymbol() 10299451b44SJordan Rupprecht symbol_addresses.add( 10399451b44SJordan Rupprecht symbol.GetStartAddress().GetLoadAddress(target)) 10499451b44SJordan Rupprecht 10599451b44SJordan Rupprecht self.assertEquals( 10699451b44SJordan Rupprecht symbol_addresses, 10799451b44SJordan Rupprecht bp_addresses, 10899451b44SJordan Rupprecht "Breakpoint set on correct address") 10999451b44SJordan Rupprecht finally: 11099451b44SJordan Rupprecht self.runCmd("settings clear target.skip-prologue") 111