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