199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest SBTarget APIs. 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 599451b44SJordan Rupprecht 699451b44SJordan Rupprechtimport lldb 799451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 899451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 999451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 1099451b44SJordan Rupprecht 1199451b44SJordan Rupprecht 1299451b44SJordan Rupprechtclass TestNameLookup(TestBase): 132238dcc3SJonas Devlieghere @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr21765") 1499451b44SJordan Rupprecht def test_target(self): 1599451b44SJordan Rupprecht """Exercise SBTarget.FindFunctions() with various name masks. 1699451b44SJordan Rupprecht 1799451b44SJordan Rupprecht A previous regression caused mangled names to not be able to be looked up. 1899451b44SJordan Rupprecht This test verifies that using a mangled name with eFunctionNameTypeFull works 1999451b44SJordan Rupprecht and that using a function basename with eFunctionNameTypeFull works for all 2099451b44SJordan Rupprecht C++ functions that are at the global namespace level.""" 212238dcc3SJonas Devlieghere self.build() 2299451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 2399451b44SJordan Rupprecht 2499451b44SJordan Rupprecht # Create a target by the debugger. 2599451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 2699451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 2799451b44SJordan Rupprecht 2899451b44SJordan Rupprecht exe_module = target.FindModule(target.GetExecutable()) 2999451b44SJordan Rupprecht 3099451b44SJordan Rupprecht c_name_to_symbol = {} 3199451b44SJordan Rupprecht cpp_name_to_symbol = {} 3299451b44SJordan Rupprecht mangled_to_symbol = {} 332238dcc3SJonas Devlieghere num_symbols = exe_module.GetNumSymbols() 3499451b44SJordan Rupprecht for i in range(num_symbols): 352238dcc3SJonas Devlieghere symbol = exe_module.GetSymbolAtIndex(i) 3699451b44SJordan Rupprecht name = symbol.GetName() 372238dcc3SJonas Devlieghere if ( 382238dcc3SJonas Devlieghere name 392238dcc3SJonas Devlieghere and "unique_function_name" in name 402238dcc3SJonas Devlieghere and "__PRETTY_FUNCTION__" not in name 412238dcc3SJonas Devlieghere ): 4299451b44SJordan Rupprecht mangled = symbol.GetMangledName() 4399451b44SJordan Rupprecht if mangled: 4499451b44SJordan Rupprecht mangled_to_symbol[mangled] = symbol 4599451b44SJordan Rupprecht if name: 4699451b44SJordan Rupprecht cpp_name_to_symbol[name] = symbol 4799451b44SJordan Rupprecht elif name: 4899451b44SJordan Rupprecht c_name_to_symbol[name] = symbol 4999451b44SJordan Rupprecht 5099451b44SJordan Rupprecht # Make sure each mangled name turns up exactly one match when looking up 5199451b44SJordan Rupprecht # functions by full name and using the mangled name as the name in the 5299451b44SJordan Rupprecht # lookup 5399451b44SJordan Rupprecht self.assertGreaterEqual(len(mangled_to_symbol), 6) 5499451b44SJordan Rupprecht for mangled in mangled_to_symbol.keys(): 5599451b44SJordan Rupprecht symbol_contexts = target.FindFunctions(mangled, lldb.eFunctionNameTypeFull) 56*80fcecb1SJonas Devlieghere self.assertEqual(symbol_contexts.GetSize(), 1) 5799451b44SJordan Rupprecht for symbol_context in symbol_contexts: 5899451b44SJordan Rupprecht self.assertTrue(symbol_context.GetFunction().IsValid()) 5999451b44SJordan Rupprecht self.assertTrue(symbol_context.GetSymbol().IsValid()) 60