199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest lldb breakpoint ids. 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 599451b44SJordan Rupprechtimport lldb 699451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 799451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 899451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 999451b44SJordan Rupprecht 1099451b44SJordan Rupprecht 1199451b44SJordan Rupprechtclass TestCPPBreakpointLocations(TestBase): 1299451b44SJordan Rupprecht @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24764") 1399451b44SJordan Rupprecht def test(self): 143d83a577SArthur Eubanks self.do_test(dict()) 153d83a577SArthur Eubanks 163d83a577SArthur Eubanks @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24764") 173d83a577SArthur Eubanks @skipIf(compiler=no_match("clang")) 183d83a577SArthur Eubanks @skipIf(compiler_version=["<", "15.0"]) 193d83a577SArthur Eubanks def test_simple_template_names(self): 203d83a577SArthur Eubanks self.do_test(dict(CFLAGS_EXTRAS="-gsimple-template-names")) 213d83a577SArthur Eubanks 223d83a577SArthur Eubanks def do_test(self, debug_flags): 233d83a577SArthur Eubanks self.build(dictionary=debug_flags) 2499451b44SJordan Rupprecht self.breakpoint_id_tests() 2599451b44SJordan Rupprecht 2699451b44SJordan Rupprecht def verify_breakpoint_locations(self, target, bp_dict): 272238dcc3SJonas Devlieghere name = bp_dict["name"] 282238dcc3SJonas Devlieghere names = bp_dict["loc_names"] 2999451b44SJordan Rupprecht bp = target.BreakpointCreateByName(name) 30*80fcecb1SJonas Devlieghere self.assertEqual( 3199451b44SJordan Rupprecht bp.GetNumLocations(), 3299451b44SJordan Rupprecht len(names), 332238dcc3SJonas Devlieghere "Make sure we find the right number of breakpoint locations for {}".format( 342238dcc3SJonas Devlieghere name 352238dcc3SJonas Devlieghere ), 362238dcc3SJonas Devlieghere ) 3799451b44SJordan Rupprecht 3899451b44SJordan Rupprecht bp_loc_names = list() 3999451b44SJordan Rupprecht for bp_loc in bp: 4099451b44SJordan Rupprecht bp_loc_names.append(bp_loc.GetAddress().GetFunction().GetName()) 4199451b44SJordan Rupprecht 4299451b44SJordan Rupprecht for name in names: 4399451b44SJordan Rupprecht found = name in bp_loc_names 4499451b44SJordan Rupprecht if not found: 4599451b44SJordan Rupprecht print("Didn't find '%s' in: %s" % (name, bp_loc_names)) 4699451b44SJordan Rupprecht self.assertTrue(found, "Make sure we find all required locations") 4799451b44SJordan Rupprecht 4899451b44SJordan Rupprecht def breakpoint_id_tests(self): 4999451b44SJordan Rupprecht # Create a target by the debugger. 5099451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 5199451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 5299451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 5399451b44SJordan Rupprecht bp_dicts = [ 542238dcc3SJonas Devlieghere { 552238dcc3SJonas Devlieghere "name": "func1", 562238dcc3SJonas Devlieghere "loc_names": ["a::c::func1()", "aa::cc::func1()", "b::c::func1()"], 572238dcc3SJonas Devlieghere }, 582238dcc3SJonas Devlieghere { 592238dcc3SJonas Devlieghere "name": "func2", 602238dcc3SJonas Devlieghere "loc_names": ["a::c::func2()", "aa::cc::func2()", "c::d::func2()"], 612238dcc3SJonas Devlieghere }, 622238dcc3SJonas Devlieghere { 632238dcc3SJonas Devlieghere "name": "func3", 642238dcc3SJonas Devlieghere "loc_names": [ 652238dcc3SJonas Devlieghere "a::c::func3()", 662238dcc3SJonas Devlieghere "aa::cc::func3()", 672238dcc3SJonas Devlieghere "b::c::func3()", 682238dcc3SJonas Devlieghere "c::d::func3()", 692238dcc3SJonas Devlieghere ], 702238dcc3SJonas Devlieghere }, 712238dcc3SJonas Devlieghere {"name": "c::func1", "loc_names": ["a::c::func1()", "b::c::func1()"]}, 722238dcc3SJonas Devlieghere {"name": "c::func2", "loc_names": ["a::c::func2()"]}, 732238dcc3SJonas Devlieghere {"name": "c::func3", "loc_names": ["a::c::func3()", "b::c::func3()"]}, 742238dcc3SJonas Devlieghere {"name": "a::c::func1", "loc_names": ["a::c::func1()"]}, 752238dcc3SJonas Devlieghere {"name": "b::c::func1", "loc_names": ["b::c::func1()"]}, 762238dcc3SJonas Devlieghere {"name": "c::d::func2", "loc_names": ["c::d::func2()"]}, 772238dcc3SJonas Devlieghere {"name": "a::c::func1()", "loc_names": ["a::c::func1()"]}, 782238dcc3SJonas Devlieghere {"name": "b::c::func1()", "loc_names": ["b::c::func1()"]}, 792238dcc3SJonas Devlieghere {"name": "c::d::func2()", "loc_names": ["c::d::func2()"]}, 80d4a55ad3SMichael Buch # Template cases 812238dcc3SJonas Devlieghere {"name": "func<float>", "loc_names": []}, 822238dcc3SJonas Devlieghere {"name": "Foo::func<float>", "loc_names": []}, 832238dcc3SJonas Devlieghere {"name": "ns::Foo::func<float>", "loc_names": []}, 842238dcc3SJonas Devlieghere {"name": "func<int>", "loc_names": ["auto ns::Foo<double>::func<int>()"]}, 852238dcc3SJonas Devlieghere { 862238dcc3SJonas Devlieghere "name": "Foo<double>::func<int>", 872238dcc3SJonas Devlieghere "loc_names": ["auto ns::Foo<double>::func<int>()"], 882238dcc3SJonas Devlieghere }, 892238dcc3SJonas Devlieghere { 902238dcc3SJonas Devlieghere "name": "ns::Foo<double>::func<int>", 912238dcc3SJonas Devlieghere "loc_names": ["auto ns::Foo<double>::func<int>()"], 922238dcc3SJonas Devlieghere }, 932238dcc3SJonas Devlieghere { 942238dcc3SJonas Devlieghere "name": "func", 952238dcc3SJonas Devlieghere "loc_names": [ 962238dcc3SJonas Devlieghere "auto ns::Foo<double>::func<int>()", 972238dcc3SJonas Devlieghere "auto ns::Foo<double>::func<ns::Foo<int>>()", 982238dcc3SJonas Devlieghere ], 992238dcc3SJonas Devlieghere }, 1002238dcc3SJonas Devlieghere {"name": "operator", "loc_names": []}, 1012238dcc3SJonas Devlieghere { 1022238dcc3SJonas Devlieghere "name": "ns::Foo<double>::operator bool", 1032238dcc3SJonas Devlieghere "loc_names": ["ns::Foo<double>::operator bool()"], 1042238dcc3SJonas Devlieghere }, 1052238dcc3SJonas Devlieghere { 1062238dcc3SJonas Devlieghere "name": "operator a::c", 1072238dcc3SJonas Devlieghere "loc_names": ["ns::Foo<double>::operator a::c<a::c>()"], 1082238dcc3SJonas Devlieghere }, 1092238dcc3SJonas Devlieghere { 1102238dcc3SJonas Devlieghere "name": "operator ns::Foo<int>", 1112238dcc3SJonas Devlieghere "loc_names": ["ns::Foo<double>::operator ns::Foo<int><ns::Foo<int>>()"], 1122238dcc3SJonas Devlieghere }, 1132238dcc3SJonas Devlieghere {"name": "operator<<<a::c>", "loc_names": []}, 1142238dcc3SJonas Devlieghere { 1152238dcc3SJonas Devlieghere "name": "operator<<<int>", 1162238dcc3SJonas Devlieghere "loc_names": ["void ns::Foo<double>::operator<<<int>(int)"], 1172238dcc3SJonas Devlieghere }, 1182238dcc3SJonas Devlieghere { 1192238dcc3SJonas Devlieghere "name": "ns::Foo<double>::operator<<", 1202238dcc3SJonas Devlieghere "loc_names": [ 1212238dcc3SJonas Devlieghere "void ns::Foo<double>::operator<<<int>(int)", 1222238dcc3SJonas Devlieghere "void ns::Foo<double>::operator<<<ns::Foo<int>>(ns::Foo<int>)", 1232238dcc3SJonas Devlieghere ], 1242238dcc3SJonas Devlieghere }, 1252238dcc3SJonas Devlieghere {"name": "g<float>", "loc_names": []}, 1262238dcc3SJonas Devlieghere {"name": "g<int>", "loc_names": ["void ns::g<int>()"]}, 1272238dcc3SJonas Devlieghere {"name": "g<char>", "loc_names": ["void ns::g<char>()"]}, 1282238dcc3SJonas Devlieghere {"name": "g", "loc_names": ["void ns::g<int>()", "void ns::g<char>()"]}, 1292238dcc3SJonas Devlieghere {"name": "ns::g<float>", "loc_names": []}, 1302238dcc3SJonas Devlieghere {"name": "ns::g<int>", "loc_names": ["void ns::g<int>()"]}, 1312238dcc3SJonas Devlieghere {"name": "ns::g<char>", "loc_names": ["void ns::g<char>()"]}, 1322238dcc3SJonas Devlieghere {"name": "ns::g", "loc_names": ["void ns::g<int>()", "void ns::g<char>()"]}, 13399451b44SJordan Rupprecht ] 13499451b44SJordan Rupprecht 13599451b44SJordan Rupprecht for bp_dict in bp_dicts: 13699451b44SJordan Rupprecht self.verify_breakpoint_locations(target, bp_dict) 13799451b44SJordan Rupprecht 13899451b44SJordan Rupprecht @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24764") 13999451b44SJordan Rupprecht def test_destructors(self): 14099451b44SJordan Rupprecht self.build() 14199451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 14299451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 14399451b44SJordan Rupprecht 14499451b44SJordan Rupprecht # Don't skip prologue, so we can check the breakpoint address more 14599451b44SJordan Rupprecht # easily 14699451b44SJordan Rupprecht self.runCmd("settings set target.skip-prologue false") 14799451b44SJordan Rupprecht try: 1482238dcc3SJonas Devlieghere names = ["~c", "c::~c", "c::~c()"] 1492238dcc3SJonas Devlieghere loc_names = {"a::c::~c()", "b::c::~c()"} 15099451b44SJordan Rupprecht # TODO: For windows targets we should put windows mangled names 15199451b44SJordan Rupprecht # here 1522238dcc3SJonas Devlieghere symbols = ["_ZN1a1cD1Ev", "_ZN1a1cD2Ev", "_ZN1b1cD1Ev", "_ZN1b1cD2Ev"] 15399451b44SJordan Rupprecht 15499451b44SJordan Rupprecht for name in names: 15599451b44SJordan Rupprecht bp = target.BreakpointCreateByName(name) 15699451b44SJordan Rupprecht 1572238dcc3SJonas Devlieghere bp_loc_names = { 1582238dcc3SJonas Devlieghere bp_loc.GetAddress().GetFunction().GetName() for bp_loc in bp 1592238dcc3SJonas Devlieghere } 160*80fcecb1SJonas Devlieghere self.assertEqual( 1612238dcc3SJonas Devlieghere bp_loc_names, loc_names, "Breakpoint set on the correct symbol" 1622238dcc3SJonas Devlieghere ) 16399451b44SJordan Rupprecht 16499451b44SJordan Rupprecht bp_addresses = {bp_loc.GetLoadAddress() for bp_loc in bp} 16599451b44SJordan Rupprecht symbol_addresses = set() 16699451b44SJordan Rupprecht for symbol in symbols: 16799451b44SJordan Rupprecht sc_list = target.FindSymbols(symbol, lldb.eSymbolTypeCode) 168*80fcecb1SJonas Devlieghere self.assertEqual(sc_list.GetSize(), 1, "Found symbol " + symbol) 16999451b44SJordan Rupprecht symbol = sc_list.GetContextAtIndex(0).GetSymbol() 17099451b44SJordan Rupprecht symbol_addresses.add( 1712238dcc3SJonas Devlieghere symbol.GetStartAddress().GetLoadAddress(target) 1722238dcc3SJonas Devlieghere ) 17399451b44SJordan Rupprecht 174*80fcecb1SJonas Devlieghere self.assertEqual( 1752238dcc3SJonas Devlieghere symbol_addresses, bp_addresses, "Breakpoint set on correct address" 1762238dcc3SJonas Devlieghere ) 17799451b44SJordan Rupprecht finally: 17899451b44SJordan Rupprecht self.runCmd("settings clear target.skip-prologue") 179