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