1*99451b44SJordan Rupprecht""" 2*99451b44SJordan RupprechtTest some SBModule and SBSection APIs. 3*99451b44SJordan Rupprecht""" 4*99451b44SJordan Rupprecht 5*99451b44SJordan Rupprechtfrom __future__ import print_function 6*99451b44SJordan Rupprecht 7*99451b44SJordan Rupprecht 8*99451b44SJordan Rupprechtimport lldb 9*99451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 10*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 11*99451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 12*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbutil import symbol_type_to_str 13*99451b44SJordan Rupprecht 14*99451b44SJordan Rupprecht 15*99451b44SJordan Rupprechtclass ModuleAndSectionAPIsTestCase(TestBase): 16*99451b44SJordan Rupprecht 17*99451b44SJordan Rupprecht # Py3 asserts due to a bug in SWIG. A fix for this was upstreamed into 18*99451b44SJordan Rupprecht # SWIG 3.0.8. 19*99451b44SJordan Rupprecht @skipIf(py_version=['>=', (3, 0)], swig_version=['<', (3, 0, 8)]) 20*99451b44SJordan Rupprecht def test_module_and_section(self): 21*99451b44SJordan Rupprecht """Test module and section APIs.""" 22*99451b44SJordan Rupprecht self.build() 23*99451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 24*99451b44SJordan Rupprecht 25*99451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 26*99451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 27*99451b44SJordan Rupprecht self.assertTrue(target.GetNumModules() > 0) 28*99451b44SJordan Rupprecht 29*99451b44SJordan Rupprecht # Hide stdout if not running with '-t' option. 30*99451b44SJordan Rupprecht if not self.TraceOn(): 31*99451b44SJordan Rupprecht self.HideStdout() 32*99451b44SJordan Rupprecht 33*99451b44SJordan Rupprecht print("Number of modules for the target: %d" % target.GetNumModules()) 34*99451b44SJordan Rupprecht for module in target.module_iter(): 35*99451b44SJordan Rupprecht print(module) 36*99451b44SJordan Rupprecht 37*99451b44SJordan Rupprecht # Get the executable module at index 0. 38*99451b44SJordan Rupprecht exe_module = target.GetModuleAtIndex(0) 39*99451b44SJordan Rupprecht 40*99451b44SJordan Rupprecht print("Exe module: %s" % str(exe_module)) 41*99451b44SJordan Rupprecht print("Number of sections: %d" % exe_module.GetNumSections()) 42*99451b44SJordan Rupprecht print("Number of symbols: %d" % len(exe_module)) 43*99451b44SJordan Rupprecht INDENT = ' ' * 4 44*99451b44SJordan Rupprecht INDENT2 = INDENT * 2 45*99451b44SJordan Rupprecht for sec in exe_module.section_iter(): 46*99451b44SJordan Rupprecht print(sec) 47*99451b44SJordan Rupprecht print( 48*99451b44SJordan Rupprecht INDENT + 49*99451b44SJordan Rupprecht "Number of subsections: %d" % 50*99451b44SJordan Rupprecht sec.GetNumSubSections()) 51*99451b44SJordan Rupprecht if sec.GetNumSubSections() == 0: 52*99451b44SJordan Rupprecht for sym in exe_module.symbol_in_section_iter(sec): 53*99451b44SJordan Rupprecht print(INDENT + str(sym)) 54*99451b44SJordan Rupprecht print( 55*99451b44SJordan Rupprecht INDENT + 56*99451b44SJordan Rupprecht "symbol type: %s" % 57*99451b44SJordan Rupprecht symbol_type_to_str( 58*99451b44SJordan Rupprecht sym.GetType())) 59*99451b44SJordan Rupprecht else: 60*99451b44SJordan Rupprecht for subsec in sec: 61*99451b44SJordan Rupprecht print(INDENT + str(subsec)) 62*99451b44SJordan Rupprecht # Now print the symbols belonging to the subsection.... 63*99451b44SJordan Rupprecht for sym in exe_module.symbol_in_section_iter(subsec): 64*99451b44SJordan Rupprecht print(INDENT2 + str(sym)) 65*99451b44SJordan Rupprecht print( 66*99451b44SJordan Rupprecht INDENT2 + 67*99451b44SJordan Rupprecht "symbol type: %s" % 68*99451b44SJordan Rupprecht symbol_type_to_str( 69*99451b44SJordan Rupprecht sym.GetType())) 70*99451b44SJordan Rupprecht 71*99451b44SJordan Rupprecht def test_module_and_section_boundary_condition(self): 72*99451b44SJordan Rupprecht """Test module and section APIs by passing None when it expects a Python string.""" 73*99451b44SJordan Rupprecht self.build() 74*99451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 75*99451b44SJordan Rupprecht 76*99451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 77*99451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 78*99451b44SJordan Rupprecht self.assertTrue(target.GetNumModules() > 0) 79*99451b44SJordan Rupprecht 80*99451b44SJordan Rupprecht # Hide stdout if not running with '-t' option. 81*99451b44SJordan Rupprecht if not self.TraceOn(): 82*99451b44SJordan Rupprecht self.HideStdout() 83*99451b44SJordan Rupprecht 84*99451b44SJordan Rupprecht print("Number of modules for the target: %d" % target.GetNumModules()) 85*99451b44SJordan Rupprecht for module in target.module_iter(): 86*99451b44SJordan Rupprecht print(module) 87*99451b44SJordan Rupprecht 88*99451b44SJordan Rupprecht # Get the executable module at index 0. 89*99451b44SJordan Rupprecht exe_module = target.GetModuleAtIndex(0) 90*99451b44SJordan Rupprecht 91*99451b44SJordan Rupprecht print("Exe module: %s" % str(exe_module)) 92*99451b44SJordan Rupprecht print("Number of sections: %d" % exe_module.GetNumSections()) 93*99451b44SJordan Rupprecht 94*99451b44SJordan Rupprecht # Boundary condition testings. Should not crash lldb! 95*99451b44SJordan Rupprecht exe_module.FindFirstType(None) 96*99451b44SJordan Rupprecht exe_module.FindTypes(None) 97*99451b44SJordan Rupprecht exe_module.FindGlobalVariables(target, None, 1) 98*99451b44SJordan Rupprecht exe_module.FindFunctions(None, 0) 99*99451b44SJordan Rupprecht exe_module.FindSection(None) 100*99451b44SJordan Rupprecht 101*99451b44SJordan Rupprecht # Get the section at index 1. 102*99451b44SJordan Rupprecht if exe_module.GetNumSections() > 1: 103*99451b44SJordan Rupprecht sec1 = exe_module.GetSectionAtIndex(1) 104*99451b44SJordan Rupprecht print(sec1) 105*99451b44SJordan Rupprecht else: 106*99451b44SJordan Rupprecht sec1 = None 107*99451b44SJordan Rupprecht 108*99451b44SJordan Rupprecht if sec1: 109*99451b44SJordan Rupprecht sec1.FindSubSection(None) 110*99451b44SJordan Rupprecht 111*99451b44SJordan Rupprecht def test_module_compile_unit_iter(self): 112*99451b44SJordan Rupprecht """Test module's compile unit iterator APIs.""" 113*99451b44SJordan Rupprecht self.build() 114*99451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 115*99451b44SJordan Rupprecht 116*99451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 117*99451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 118*99451b44SJordan Rupprecht self.assertTrue(target.GetNumModules() > 0) 119*99451b44SJordan Rupprecht 120*99451b44SJordan Rupprecht # Hide stdout if not running with '-t' option. 121*99451b44SJordan Rupprecht if not self.TraceOn(): 122*99451b44SJordan Rupprecht self.HideStdout() 123*99451b44SJordan Rupprecht 124*99451b44SJordan Rupprecht print("Number of modules for the target: %d" % target.GetNumModules()) 125*99451b44SJordan Rupprecht for module in target.module_iter(): 126*99451b44SJordan Rupprecht print(module) 127*99451b44SJordan Rupprecht 128*99451b44SJordan Rupprecht # Get the executable module at index 0. 129*99451b44SJordan Rupprecht exe_module = target.GetModuleAtIndex(0) 130*99451b44SJordan Rupprecht 131*99451b44SJordan Rupprecht print("Exe module: %s" % str(exe_module)) 132*99451b44SJordan Rupprecht print("Number of compile units: %d" % exe_module.GetNumCompileUnits()) 133*99451b44SJordan Rupprecht INDENT = ' ' * 4 134*99451b44SJordan Rupprecht INDENT2 = INDENT * 2 135*99451b44SJordan Rupprecht for cu in exe_module.compile_unit_iter(): 136*99451b44SJordan Rupprecht print(cu) 137*99451b44SJordan Rupprecht 138*99451b44SJordan Rupprecht def test_find_compile_units(self): 139*99451b44SJordan Rupprecht """Exercise SBModule.FindCompileUnits() API.""" 140*99451b44SJordan Rupprecht d = {'EXE': 'b.out'} 141*99451b44SJordan Rupprecht self.build(dictionary=d) 142*99451b44SJordan Rupprecht self.setTearDownCleanup(dictionary=d) 143*99451b44SJordan Rupprecht self.find_compile_units(self.getBuildArtifact('b.out')) 144*99451b44SJordan Rupprecht 145*99451b44SJordan Rupprecht def find_compile_units(self, exe): 146*99451b44SJordan Rupprecht """Exercise SBModule.FindCompileUnits() API.""" 147*99451b44SJordan Rupprecht source_name_list = ["main.cpp", "b.cpp", "c.cpp"] 148*99451b44SJordan Rupprecht 149*99451b44SJordan Rupprecht # Create a target by the debugger. 150*99451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 151*99451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 152*99451b44SJordan Rupprecht 153*99451b44SJordan Rupprecht num_modules = target.GetNumModules() 154*99451b44SJordan Rupprecht for i in range(num_modules): 155*99451b44SJordan Rupprecht module = target.GetModuleAtIndex(i) 156*99451b44SJordan Rupprecht for source_name in source_name_list: 157*99451b44SJordan Rupprecht list = module.FindCompileUnits(lldb.SBFileSpec(source_name, False)) 158*99451b44SJordan Rupprecht for sc in list: 159*99451b44SJordan Rupprecht self.assertTrue( 160*99451b44SJordan Rupprecht sc.GetCompileUnit().GetFileSpec().GetFilename() == 161*99451b44SJordan Rupprecht source_name) 162