xref: /llvm-project/lldb/test/API/lang/objc/hidden-ivars/TestHiddenIvars.py (revision 5b386158aacac4b41126983a5379d36ed413d0ea)
199451b44SJordan Rupprecht"""Test that hidden ivars in a shared library are visible from the main executable."""
299451b44SJordan Rupprecht
399451b44SJordan Rupprecht
499451b44SJordan Rupprechtimport subprocess
599451b44SJordan Rupprecht
6*5b386158SJordan Rupprechtimport unittest
799451b44SJordan Rupprechtimport lldb
899451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
999451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
1099451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
1199451b44SJordan Rupprecht
1299451b44SJordan Rupprecht
1399451b44SJordan Rupprechtclass HiddenIvarsTestCase(TestBase):
1499451b44SJordan Rupprecht    def setUp(self):
1599451b44SJordan Rupprecht        # Call super's setUp().
1699451b44SJordan Rupprecht        TestBase.setUp(self)
1799451b44SJordan Rupprecht        # Find the line number to break inside main().
182238dcc3SJonas Devlieghere        self.source = "main.m"
192238dcc3SJonas Devlieghere        self.line = line_number(self.source, "// breakpoint1")
2099451b44SJordan Rupprecht        # The makefile names of the shared libraries as they appear in DYLIB_NAME.
2199451b44SJordan Rupprecht        # The names should have no loading "lib" or extension as they will be
2299451b44SJordan Rupprecht        # localized
2399451b44SJordan Rupprecht        self.shlib_names = ["InternalDefiner"]
2499451b44SJordan Rupprecht
2599451b44SJordan Rupprecht    @skipIf(
2699451b44SJordan Rupprecht        debug_info=no_match("dsym"),
272238dcc3SJonas Devlieghere        bugnumber="This test requires a stripped binary and a dSYM",
282238dcc3SJonas Devlieghere    )
2999451b44SJordan Rupprecht    def test_expr_stripped(self):
302238dcc3SJonas Devlieghere        if self.getArchitecture() == "i386":
3199451b44SJordan Rupprecht            self.skipTest("requires modern objc runtime")
3299451b44SJordan Rupprecht        else:
3399451b44SJordan Rupprecht            self.build()
3499451b44SJordan Rupprecht            self.expr(True)
3599451b44SJordan Rupprecht
3699451b44SJordan Rupprecht    def test_expr(self):
372238dcc3SJonas Devlieghere        if self.getArchitecture() == "i386":
3899451b44SJordan Rupprecht            self.skipTest("requires modern objc runtime")
3999451b44SJordan Rupprecht        else:
4099451b44SJordan Rupprecht            self.build()
4199451b44SJordan Rupprecht            self.expr(False)
4299451b44SJordan Rupprecht
4399451b44SJordan Rupprecht    @skipIf(
4499451b44SJordan Rupprecht        debug_info=no_match("dsym"),
452238dcc3SJonas Devlieghere        bugnumber="This test requires a stripped binary and a dSYM",
462238dcc3SJonas Devlieghere    )
4799451b44SJordan Rupprecht    def test_frame_variable_stripped(self):
482238dcc3SJonas Devlieghere        if self.getArchitecture() == "i386":
4999451b44SJordan Rupprecht            self.skipTest("requires modern objc runtime")
5099451b44SJordan Rupprecht        else:
5199451b44SJordan Rupprecht            self.build()
5299451b44SJordan Rupprecht            self.frame_var(True)
5399451b44SJordan Rupprecht
5499451b44SJordan Rupprecht    def test_frame_variable(self):
552238dcc3SJonas Devlieghere        if self.getArchitecture() == "i386":
5699451b44SJordan Rupprecht            self.skipTest("requires modern objc runtime")
5799451b44SJordan Rupprecht        else:
5899451b44SJordan Rupprecht            self.build()
5999451b44SJordan Rupprecht            self.frame_var(False)
6099451b44SJordan Rupprecht
61*5b386158SJordan Rupprecht    @unittest.expectedFailure  # rdar://18683637
6299451b44SJordan Rupprecht    def test_frame_variable_across_modules(self):
632238dcc3SJonas Devlieghere        if self.getArchitecture() == "i386":
6499451b44SJordan Rupprecht            self.skipTest("requires modern objc runtime")
6599451b44SJordan Rupprecht        else:
6699451b44SJordan Rupprecht            self.build()
6799451b44SJordan Rupprecht            self.common_setup(False)
6899451b44SJordan Rupprecht            self.expect(
692238dcc3SJonas Devlieghere                "frame variable k->bar", VARIABLES_DISPLAYED_CORRECTLY, substrs=["= 3"]
702238dcc3SJonas Devlieghere            )
7199451b44SJordan Rupprecht
7299451b44SJordan Rupprecht    def common_setup(self, strip):
7399451b44SJordan Rupprecht        if strip:
74acd641c1SFred Riss            exe = self.getBuildArtifact("stripped/a.out")
75acd641c1SFred Riss        else:
76acd641c1SFred Riss            exe = self.getBuildArtifact("a.out")
7799451b44SJordan Rupprecht        # Create a target by the debugger.
78acd641c1SFred Riss        target = self.dbg.CreateTarget(exe)
7999451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
8099451b44SJordan Rupprecht
8199451b44SJordan Rupprecht        # Create the breakpoint inside function 'main'.
8299451b44SJordan Rupprecht        breakpoint = target.BreakpointCreateByLocation(self.source, self.line)
8399451b44SJordan Rupprecht        self.assertTrue(breakpoint, VALID_BREAKPOINT)
8499451b44SJordan Rupprecht
8599451b44SJordan Rupprecht        # Register our shared libraries for remote targets so they get
8699451b44SJordan Rupprecht        # automatically uploaded
872238dcc3SJonas Devlieghere        environment = self.registerSharedLibrariesWithTarget(target, self.shlib_names)
8899451b44SJordan Rupprecht
8999451b44SJordan Rupprecht        # Now launch the process, and do not stop at entry point.
9099451b44SJordan Rupprecht        process = target.LaunchSimple(
912238dcc3SJonas Devlieghere            None, environment, self.get_process_working_directory()
922238dcc3SJonas Devlieghere        )
9399451b44SJordan Rupprecht        self.assertTrue(process, PROCESS_IS_VALID)
9499451b44SJordan Rupprecht
9599451b44SJordan Rupprecht        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
9699451b44SJordan Rupprecht
9799451b44SJordan Rupprecht        # Break inside the foo function which takes a bar_ptr argument.
9899451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
992238dcc3SJonas Devlieghere            self, "main.m", self.line, num_expected_locations=1, loc_exact=True
1002238dcc3SJonas Devlieghere        )
10199451b44SJordan Rupprecht
10299451b44SJordan Rupprecht        self.runCmd("run", RUN_SUCCEEDED)
10399451b44SJordan Rupprecht
10499451b44SJordan Rupprecht        # The stop reason of the thread should be breakpoint.
1052238dcc3SJonas Devlieghere        self.expect(
1062238dcc3SJonas Devlieghere            "thread list",
1072238dcc3SJonas Devlieghere            STOPPED_DUE_TO_BREAKPOINT,
1082238dcc3SJonas Devlieghere            substrs=["stopped", "stop reason = breakpoint"],
1092238dcc3SJonas Devlieghere        )
11099451b44SJordan Rupprecht
11199451b44SJordan Rupprecht        # The breakpoint should have a hit count of 1.
1129f0b5f9aSSYNOPSYS\georgiev        lldbutil.check_breakpoint(self, bpno=1, expected_hit_count=1)
11399451b44SJordan Rupprecht
11499451b44SJordan Rupprecht    def expr(self, strip):
11599451b44SJordan Rupprecht        self.common_setup(strip)
11699451b44SJordan Rupprecht
11799451b44SJordan Rupprecht        # This should display correctly.
11899451b44SJordan Rupprecht        self.expect(
11999451b44SJordan Rupprecht            "expression (j->_definer->foo)",
12099451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
1212238dcc3SJonas Devlieghere            substrs=["= 4"],
1222238dcc3SJonas Devlieghere        )
12399451b44SJordan Rupprecht
12499451b44SJordan Rupprecht        self.expect(
12599451b44SJordan Rupprecht            "expression (j->_definer->bar)",
12699451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
1272238dcc3SJonas Devlieghere            substrs=["= 5"],
1282238dcc3SJonas Devlieghere        )
12999451b44SJordan Rupprecht
13099451b44SJordan Rupprecht        if strip:
13199451b44SJordan Rupprecht            self.expect(
13299451b44SJordan Rupprecht                "expression *(j->_definer)",
13399451b44SJordan Rupprecht                VARIABLES_DISPLAYED_CORRECTLY,
1342238dcc3SJonas Devlieghere                substrs=["foo = 4"],
1352238dcc3SJonas Devlieghere            )
13699451b44SJordan Rupprecht        else:
13799451b44SJordan Rupprecht            self.expect(
13899451b44SJordan Rupprecht                "expression *(j->_definer)",
13999451b44SJordan Rupprecht                VARIABLES_DISPLAYED_CORRECTLY,
1402238dcc3SJonas Devlieghere                substrs=["foo = 4", "bar = 5"],
1412238dcc3SJonas Devlieghere            )
14299451b44SJordan Rupprecht
1432238dcc3SJonas Devlieghere        self.expect(
1442238dcc3SJonas Devlieghere            "expression (k->foo)", VARIABLES_DISPLAYED_CORRECTLY, substrs=["= 2"]
1452238dcc3SJonas Devlieghere        )
14699451b44SJordan Rupprecht
1472238dcc3SJonas Devlieghere        self.expect(
1482238dcc3SJonas Devlieghere            "expression (k->bar)", VARIABLES_DISPLAYED_CORRECTLY, substrs=["= 3"]
1492238dcc3SJonas Devlieghere        )
15099451b44SJordan Rupprecht
15199451b44SJordan Rupprecht        self.expect(
15299451b44SJordan Rupprecht            "expression k.filteredDataSource",
15399451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
1542238dcc3SJonas Devlieghere            substrs=[" = 0x", '"2 elements"'],
1552238dcc3SJonas Devlieghere        )
15699451b44SJordan Rupprecht
15799451b44SJordan Rupprecht        if strip:
1582238dcc3SJonas Devlieghere            self.expect(
1592238dcc3SJonas Devlieghere                "expression *(k)",
1602238dcc3SJonas Devlieghere                VARIABLES_DISPLAYED_CORRECTLY,
1612238dcc3SJonas Devlieghere                substrs=["foo = 2", " = 0x", '"2 elements"'],
1622238dcc3SJonas Devlieghere            )
16399451b44SJordan Rupprecht        else:
16499451b44SJordan Rupprecht            self.expect(
16599451b44SJordan Rupprecht                "expression *(k)",
16699451b44SJordan Rupprecht                VARIABLES_DISPLAYED_CORRECTLY,
16799451b44SJordan Rupprecht                substrs=[
16899451b44SJordan Rupprecht                    "foo = 2",
16999451b44SJordan Rupprecht                    "bar = 3",
1702238dcc3SJonas Devlieghere                    "_filteredDataSource = 0x",
1712238dcc3SJonas Devlieghere                    '"2 elements"',
1722238dcc3SJonas Devlieghere                ],
1732238dcc3SJonas Devlieghere            )
17499451b44SJordan Rupprecht
17599451b44SJordan Rupprecht    def frame_var(self, strip):
17699451b44SJordan Rupprecht        self.common_setup(strip)
17799451b44SJordan Rupprecht
17899451b44SJordan Rupprecht        # This should display correctly.
17999451b44SJordan Rupprecht        self.expect(
18099451b44SJordan Rupprecht            "frame variable j->_definer->foo",
18199451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
1822238dcc3SJonas Devlieghere            substrs=["= 4"],
1832238dcc3SJonas Devlieghere        )
18499451b44SJordan Rupprecht
18599451b44SJordan Rupprecht        if not strip:
18699451b44SJordan Rupprecht            self.expect(
18799451b44SJordan Rupprecht                "frame variable j->_definer->bar",
18899451b44SJordan Rupprecht                VARIABLES_DISPLAYED_CORRECTLY,
1892238dcc3SJonas Devlieghere                substrs=["= 5"],
1902238dcc3SJonas Devlieghere            )
19199451b44SJordan Rupprecht
19299451b44SJordan Rupprecht        if strip:
19399451b44SJordan Rupprecht            self.expect(
19499451b44SJordan Rupprecht                "frame variable *j->_definer",
19599451b44SJordan Rupprecht                VARIABLES_DISPLAYED_CORRECTLY,
1962238dcc3SJonas Devlieghere                substrs=["foo = 4"],
1972238dcc3SJonas Devlieghere            )
19899451b44SJordan Rupprecht        else:
19999451b44SJordan Rupprecht            self.expect(
20099451b44SJordan Rupprecht                "frame variable *j->_definer",
20199451b44SJordan Rupprecht                VARIABLES_DISPLAYED_CORRECTLY,
2022238dcc3SJonas Devlieghere                substrs=["foo = 4", "bar = 5"],
2032238dcc3SJonas Devlieghere            )
20499451b44SJordan Rupprecht
2052238dcc3SJonas Devlieghere        self.expect(
2062238dcc3SJonas Devlieghere            "frame variable k->foo", VARIABLES_DISPLAYED_CORRECTLY, substrs=["= 2"]
2072238dcc3SJonas Devlieghere        )
20899451b44SJordan Rupprecht
20999451b44SJordan Rupprecht        self.expect(
21099451b44SJordan Rupprecht            "frame variable k->_filteredDataSource",
21199451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
2122238dcc3SJonas Devlieghere            substrs=[" = 0x", '"2 elements"'],
2132238dcc3SJonas Devlieghere        )
21499451b44SJordan Rupprecht
21599451b44SJordan Rupprecht        if strip:
21699451b44SJordan Rupprecht            self.expect(
21799451b44SJordan Rupprecht                "frame variable *k",
21899451b44SJordan Rupprecht                VARIABLES_DISPLAYED_CORRECTLY,
2192238dcc3SJonas Devlieghere                substrs=["foo = 2", "_filteredDataSource = 0x", '"2 elements"'],
2202238dcc3SJonas Devlieghere            )
22199451b44SJordan Rupprecht        else:
22299451b44SJordan Rupprecht            self.expect(
22399451b44SJordan Rupprecht                "frame variable *k",
22499451b44SJordan Rupprecht                VARIABLES_DISPLAYED_CORRECTLY,
22599451b44SJordan Rupprecht                substrs=[
22699451b44SJordan Rupprecht                    "foo = 2",
22799451b44SJordan Rupprecht                    "bar = 3",
2282238dcc3SJonas Devlieghere                    "_filteredDataSource = 0x",
2292238dcc3SJonas Devlieghere                    '"2 elements"',
2302238dcc3SJonas Devlieghere                ],
2312238dcc3SJonas Devlieghere            )
232