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