199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest some SBModule and SBSection APIs. 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 Rupprechtfrom lldbsuite.test.lldbutil import symbol_type_to_str 1099451b44SJordan Rupprecht 1199451b44SJordan Rupprecht 1299451b44SJordan Rupprechtclass ModuleAndSectionAPIsTestCase(TestBase): 1399451b44SJordan Rupprecht def test_module_and_section(self): 1499451b44SJordan Rupprecht """Test module and section APIs.""" 1599451b44SJordan Rupprecht self.build() 1699451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 1799451b44SJordan Rupprecht 1899451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 1999451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 20*9c246882SJordan Rupprecht self.assertGreater(target.GetNumModules(), 0) 2199451b44SJordan Rupprecht 2299451b44SJordan Rupprecht # Hide stdout if not running with '-t' option. 2399451b44SJordan Rupprecht if not self.TraceOn(): 2499451b44SJordan Rupprecht self.HideStdout() 2599451b44SJordan Rupprecht 2699451b44SJordan Rupprecht print("Number of modules for the target: %d" % target.GetNumModules()) 2799451b44SJordan Rupprecht for module in target.module_iter(): 2899451b44SJordan Rupprecht print(module) 2999451b44SJordan Rupprecht 3099451b44SJordan Rupprecht # Get the executable module at index 0. 3199451b44SJordan Rupprecht exe_module = target.GetModuleAtIndex(0) 3299451b44SJordan Rupprecht 3399451b44SJordan Rupprecht print("Exe module: %s" % str(exe_module)) 3499451b44SJordan Rupprecht print("Number of sections: %d" % exe_module.GetNumSections()) 3599451b44SJordan Rupprecht print("Number of symbols: %d" % len(exe_module)) 362238dcc3SJonas Devlieghere INDENT = " " * 4 3799451b44SJordan Rupprecht INDENT2 = INDENT * 2 3899451b44SJordan Rupprecht for sec in exe_module.section_iter(): 3999451b44SJordan Rupprecht print(sec) 402238dcc3SJonas Devlieghere print(INDENT + "Number of subsections: %d" % sec.GetNumSubSections()) 4199451b44SJordan Rupprecht if sec.GetNumSubSections() == 0: 4299451b44SJordan Rupprecht for sym in exe_module.symbol_in_section_iter(sec): 4399451b44SJordan Rupprecht print(INDENT + str(sym)) 4499451b44SJordan Rupprecht print( 452238dcc3SJonas Devlieghere INDENT + "symbol type: %s" % symbol_type_to_str(sym.GetType()) 462238dcc3SJonas Devlieghere ) 4799451b44SJordan Rupprecht else: 4899451b44SJordan Rupprecht for subsec in sec: 4999451b44SJordan Rupprecht print(INDENT + str(subsec)) 5099451b44SJordan Rupprecht # Now print the symbols belonging to the subsection.... 5199451b44SJordan Rupprecht for sym in exe_module.symbol_in_section_iter(subsec): 5299451b44SJordan Rupprecht print(INDENT2 + str(sym)) 5399451b44SJordan Rupprecht print( 542238dcc3SJonas Devlieghere INDENT2 552238dcc3SJonas Devlieghere + "symbol type: %s" % symbol_type_to_str(sym.GetType()) 562238dcc3SJonas Devlieghere ) 5799451b44SJordan Rupprecht 5899451b44SJordan Rupprecht def test_module_and_section_boundary_condition(self): 5999451b44SJordan Rupprecht """Test module and section APIs by passing None when it expects a Python string.""" 6099451b44SJordan Rupprecht self.build() 6199451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 6299451b44SJordan Rupprecht 6399451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 6499451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 65*9c246882SJordan Rupprecht self.assertGreater(target.GetNumModules(), 0) 6699451b44SJordan Rupprecht 6799451b44SJordan Rupprecht # Hide stdout if not running with '-t' option. 6899451b44SJordan Rupprecht if not self.TraceOn(): 6999451b44SJordan Rupprecht self.HideStdout() 7099451b44SJordan Rupprecht 7199451b44SJordan Rupprecht print("Number of modules for the target: %d" % target.GetNumModules()) 7299451b44SJordan Rupprecht for module in target.module_iter(): 7399451b44SJordan Rupprecht print(module) 7499451b44SJordan Rupprecht 7599451b44SJordan Rupprecht # Get the executable module at index 0. 7699451b44SJordan Rupprecht exe_module = target.GetModuleAtIndex(0) 7799451b44SJordan Rupprecht 7899451b44SJordan Rupprecht print("Exe module: %s" % str(exe_module)) 7999451b44SJordan Rupprecht print("Number of sections: %d" % exe_module.GetNumSections()) 8099451b44SJordan Rupprecht 8199451b44SJordan Rupprecht # Boundary condition testings. Should not crash lldb! 8299451b44SJordan Rupprecht exe_module.FindFirstType(None) 8399451b44SJordan Rupprecht exe_module.FindTypes(None) 8499451b44SJordan Rupprecht exe_module.FindGlobalVariables(target, None, 1) 8599451b44SJordan Rupprecht exe_module.FindFunctions(None, 0) 8699451b44SJordan Rupprecht exe_module.FindSection(None) 8799451b44SJordan Rupprecht 8899451b44SJordan Rupprecht # Get the section at index 1. 8999451b44SJordan Rupprecht if exe_module.GetNumSections() > 1: 9099451b44SJordan Rupprecht sec1 = exe_module.GetSectionAtIndex(1) 9199451b44SJordan Rupprecht print(sec1) 9299451b44SJordan Rupprecht else: 9399451b44SJordan Rupprecht sec1 = None 9499451b44SJordan Rupprecht 9599451b44SJordan Rupprecht if sec1: 9699451b44SJordan Rupprecht sec1.FindSubSection(None) 9799451b44SJordan Rupprecht 9899451b44SJordan Rupprecht def test_module_compile_unit_iter(self): 9999451b44SJordan Rupprecht """Test module's compile unit iterator APIs.""" 10099451b44SJordan Rupprecht self.build() 10199451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 10299451b44SJordan Rupprecht 10399451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 10499451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 105*9c246882SJordan Rupprecht self.assertGreater(target.GetNumModules(), 0) 10699451b44SJordan Rupprecht 10799451b44SJordan Rupprecht # Hide stdout if not running with '-t' option. 10899451b44SJordan Rupprecht if not self.TraceOn(): 10999451b44SJordan Rupprecht self.HideStdout() 11099451b44SJordan Rupprecht 11199451b44SJordan Rupprecht print("Number of modules for the target: %d" % target.GetNumModules()) 11299451b44SJordan Rupprecht for module in target.module_iter(): 11399451b44SJordan Rupprecht print(module) 11499451b44SJordan Rupprecht 11599451b44SJordan Rupprecht # Get the executable module at index 0. 11699451b44SJordan Rupprecht exe_module = target.GetModuleAtIndex(0) 11799451b44SJordan Rupprecht 11899451b44SJordan Rupprecht print("Exe module: %s" % str(exe_module)) 11999451b44SJordan Rupprecht print("Number of compile units: %d" % exe_module.GetNumCompileUnits()) 1202238dcc3SJonas Devlieghere INDENT = " " * 4 12199451b44SJordan Rupprecht INDENT2 = INDENT * 2 12299451b44SJordan Rupprecht for cu in exe_module.compile_unit_iter(): 12399451b44SJordan Rupprecht print(cu) 12499451b44SJordan Rupprecht 12599451b44SJordan Rupprecht def test_find_compile_units(self): 12699451b44SJordan Rupprecht """Exercise SBModule.FindCompileUnits() API.""" 1272238dcc3SJonas Devlieghere d = {"EXE": "b.out"} 12899451b44SJordan Rupprecht self.build(dictionary=d) 12999451b44SJordan Rupprecht self.setTearDownCleanup(dictionary=d) 1302238dcc3SJonas Devlieghere self.find_compile_units(self.getBuildArtifact("b.out")) 13199451b44SJordan Rupprecht 13299451b44SJordan Rupprecht def find_compile_units(self, exe): 13399451b44SJordan Rupprecht """Exercise SBModule.FindCompileUnits() API.""" 13499451b44SJordan Rupprecht source_name_list = ["main.cpp", "b.cpp", "c.cpp"] 13599451b44SJordan Rupprecht 13699451b44SJordan Rupprecht # Create a target by the debugger. 13799451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 13899451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 13999451b44SJordan Rupprecht 14099451b44SJordan Rupprecht num_modules = target.GetNumModules() 14199451b44SJordan Rupprecht for i in range(num_modules): 14299451b44SJordan Rupprecht module = target.GetModuleAtIndex(i) 14399451b44SJordan Rupprecht for source_name in source_name_list: 14499451b44SJordan Rupprecht list = module.FindCompileUnits(lldb.SBFileSpec(source_name, False)) 14599451b44SJordan Rupprecht for sc in list: 1461fb5c7a2SDave Lee self.assertEqual( 1472238dcc3SJonas Devlieghere sc.GetCompileUnit().GetFileSpec().GetFilename(), source_name 1482238dcc3SJonas Devlieghere ) 149