199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest SBTarget APIs. 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 599451b44SJordan Rupprecht 699451b44SJordan Rupprecht 799451b44SJordan Rupprechtimport unittest2 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 TestNameLookup(TestBase): 1599451b44SJordan Rupprecht 1699451b44SJordan Rupprecht @expectedFailureAll(oslist=["windows"], bugnumber='llvm.org/pr21765') 1799451b44SJordan Rupprecht def test_target(self): 1899451b44SJordan Rupprecht """Exercise SBTarget.FindFunctions() with various name masks. 1999451b44SJordan Rupprecht 2099451b44SJordan Rupprecht A previous regression caused mangled names to not be able to be looked up. 2199451b44SJordan Rupprecht This test verifies that using a mangled name with eFunctionNameTypeFull works 2299451b44SJordan Rupprecht and that using a function basename with eFunctionNameTypeFull works for all 2399451b44SJordan Rupprecht C++ functions that are at the global namespace level.""" 2499451b44SJordan Rupprecht self.build(); 2599451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 2699451b44SJordan Rupprecht 2799451b44SJordan Rupprecht # Create a target by the debugger. 2899451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 2999451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 3099451b44SJordan Rupprecht 3199451b44SJordan Rupprecht exe_module = target.FindModule(target.GetExecutable()) 3299451b44SJordan Rupprecht 3399451b44SJordan Rupprecht c_name_to_symbol = {} 3499451b44SJordan Rupprecht cpp_name_to_symbol = {} 3599451b44SJordan Rupprecht mangled_to_symbol = {} 3699451b44SJordan Rupprecht num_symbols = exe_module.GetNumSymbols(); 3799451b44SJordan Rupprecht for i in range(num_symbols): 3899451b44SJordan Rupprecht symbol = exe_module.GetSymbolAtIndex(i); 3999451b44SJordan Rupprecht name = symbol.GetName() 4099451b44SJordan Rupprecht if name and 'unique_function_name' in name and '__PRETTY_FUNCTION__' not in name: 4199451b44SJordan Rupprecht mangled = symbol.GetMangledName() 4299451b44SJordan Rupprecht if mangled: 4399451b44SJordan Rupprecht mangled_to_symbol[mangled] = symbol 4499451b44SJordan Rupprecht if name: 4599451b44SJordan Rupprecht cpp_name_to_symbol[name] = symbol 4699451b44SJordan Rupprecht elif name: 4799451b44SJordan Rupprecht c_name_to_symbol[name] = symbol 4899451b44SJordan Rupprecht 4999451b44SJordan Rupprecht # Make sure each mangled name turns up exactly one match when looking up 5099451b44SJordan Rupprecht # functions by full name and using the mangled name as the name in the 5199451b44SJordan Rupprecht # lookup 5299451b44SJordan Rupprecht self.assertGreaterEqual(len(mangled_to_symbol), 6) 5399451b44SJordan Rupprecht for mangled in mangled_to_symbol.keys(): 5499451b44SJordan Rupprecht symbol_contexts = target.FindFunctions(mangled, lldb.eFunctionNameTypeFull) 55*b3a0c4d7SRaphael Isemann self.assertEquals(symbol_contexts.GetSize(), 1) 5699451b44SJordan Rupprecht for symbol_context in symbol_contexts: 5799451b44SJordan Rupprecht self.assertTrue(symbol_context.GetFunction().IsValid()) 5899451b44SJordan Rupprecht self.assertTrue(symbol_context.GetSymbol().IsValid()) 5999451b44SJordan Rupprecht 6099451b44SJordan Rupprecht 61