1931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan"""Test that hidden ivars in a shared library are visible from the main executable.""" 2931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 3931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callananimport os, time 4931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callananimport unittest2 5931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callananimport lldb 6931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callananfrom lldbtest import * 7431d839a33e9a274e705f7a268a1c9de2ffc2da2Jim Inghamimport lldbutil 8931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 9931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callananclass HiddenIvarsTestCase(TestBase): 10931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 11931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan mydir = os.path.join("lang", "objc", "hidden-ivars") 12931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 1377fa1b7af02cc539723f837f421f6f5a0d920d15Johnny Chen @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin") 1421b1984e161b0cadee331d32bfd721eccfdf4b1fJohnny Chen @dsym_test 15931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan def test_expr_with_dsym(self): 1677fa1b7af02cc539723f837f421f6f5a0d920d15Johnny Chen if self.getArchitecture() == 'i386': 1777fa1b7af02cc539723f837f421f6f5a0d920d15Johnny Chen self.skipTest("requires modern objc runtime") 18931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan self.buildDsym() 19931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan self.expr() 20931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 2177fa1b7af02cc539723f837f421f6f5a0d920d15Johnny Chen @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin") 2221b1984e161b0cadee331d32bfd721eccfdf4b1fJohnny Chen @dwarf_test 23931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan def test_expr_with_dwarf(self): 2477fa1b7af02cc539723f837f421f6f5a0d920d15Johnny Chen if self.getArchitecture() == 'i386': 2577fa1b7af02cc539723f837f421f6f5a0d920d15Johnny Chen self.skipTest("requires modern objc runtime") 26931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan self.buildDwarf() 27931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan self.expr() 28931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 29f2d324c7d795b2c71e867ef0fc93703e94769933Sean Callanan @unittest2.expectedFailure 3077fa1b7af02cc539723f837f421f6f5a0d920d15Johnny Chen @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin") 3121b1984e161b0cadee331d32bfd721eccfdf4b1fJohnny Chen @dsym_test 32931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan def test_frame_variable_with_dsym(self): 3377fa1b7af02cc539723f837f421f6f5a0d920d15Johnny Chen if self.getArchitecture() == 'i386': 3477fa1b7af02cc539723f837f421f6f5a0d920d15Johnny Chen self.skipTest("requires modern objc runtime") 35931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan self.buildDsym() 36931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan self.frame_var() 37931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 38f2d324c7d795b2c71e867ef0fc93703e94769933Sean Callanan @unittest2.expectedFailure 3977fa1b7af02cc539723f837f421f6f5a0d920d15Johnny Chen @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin") 4021b1984e161b0cadee331d32bfd721eccfdf4b1fJohnny Chen @dwarf_test 41931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan def test_frame_variable_with_dwarf(self): 4277fa1b7af02cc539723f837f421f6f5a0d920d15Johnny Chen if self.getArchitecture() == 'i386': 4377fa1b7af02cc539723f837f421f6f5a0d920d15Johnny Chen self.skipTest("requires modern objc runtime") 44931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan self.buildDwarf() 45931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan self.frame_var() 46931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 47931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan def setUp(self): 48931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan # Call super's setUp(). 49931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan TestBase.setUp(self) 50931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan # Find the line number to break inside main(). 51931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan self.line = line_number('main.m', '// Set breakpoint 0 here.') 52931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 53931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan def common_setup(self): 54931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan exe = os.path.join(os.getcwd(), "a.out") 55931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) 56931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 57931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan # Break inside the foo function which takes a bar_ptr argument. 58431d839a33e9a274e705f7a268a1c9de2ffc2da2Jim Ingham lldbutil.run_break_set_by_file_and_line (self, "main.m", self.line, num_expected_locations=1, loc_exact=True) 59931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 60931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan self.runCmd("run", RUN_SUCCEEDED) 61931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 62931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan # The stop reason of the thread should be breakpoint. 63931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, 64931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan substrs = ['stopped', 65931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 'stop reason = breakpoint']) 66931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 67931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan # The breakpoint should have a hit count of 1. 68931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE, 69931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan substrs = [' resolved, hit count = 1']) 70931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 71931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan def expr(self): 72931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan self.common_setup() 73931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 74931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan # This should display correctly. 75ad4b16961d4e32c7243f29f33ab85b4c07bd4503Greg Clayton self.expect("expression (j->_definer->foo)", VARIABLES_DISPLAYED_CORRECTLY, 76ad4b16961d4e32c7243f29f33ab85b4c07bd4503Greg Clayton substrs = ["= 4"]) 77ad4b16961d4e32c7243f29f33ab85b4c07bd4503Greg Clayton 7878fa6c9532efbfa344093320f5c85b17d46d0327Sean Callanan self.expect("expression (j->_definer->bar)", VARIABLES_DISPLAYED_CORRECTLY, 7978fa6c9532efbfa344093320f5c85b17d46d0327Sean Callanan substrs = ["= 5"]) 80931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 8178fa6c9532efbfa344093320f5c85b17d46d0327Sean Callanan self.expect("expression *(j->_definer)", VARIABLES_DISPLAYED_CORRECTLY, 82ad4b16961d4e32c7243f29f33ab85b4c07bd4503Greg Clayton substrs = ["foo = 4", "bar = 5"]) 83ad4b16961d4e32c7243f29f33ab85b4c07bd4503Greg Clayton 84ad4b16961d4e32c7243f29f33ab85b4c07bd4503Greg Clayton self.expect("expression (k->foo)", VARIABLES_DISPLAYED_CORRECTLY, 85ad4b16961d4e32c7243f29f33ab85b4c07bd4503Greg Clayton substrs = ["= 2"]) 86ad4b16961d4e32c7243f29f33ab85b4c07bd4503Greg Clayton 87ad4b16961d4e32c7243f29f33ab85b4c07bd4503Greg Clayton self.expect("expression (k->bar)", VARIABLES_DISPLAYED_CORRECTLY, 88ad4b16961d4e32c7243f29f33ab85b4c07bd4503Greg Clayton substrs = ["= 3"]) 89ad4b16961d4e32c7243f29f33ab85b4c07bd4503Greg Clayton 90ad4b16961d4e32c7243f29f33ab85b4c07bd4503Greg Clayton self.expect("expression *(k)", VARIABLES_DISPLAYED_CORRECTLY, 91ad4b16961d4e32c7243f29f33ab85b4c07bd4503Greg Clayton substrs = ["foo = 2", "bar = 3"]) 92931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 93931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan def frame_var(self): 94931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan self.common_setup() 95931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 96931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan # This should display correctly. 97ad4b16961d4e32c7243f29f33ab85b4c07bd4503Greg Clayton self.expect("frame variable j->_definer->foo", VARIABLES_DISPLAYED_CORRECTLY, 98ad4b16961d4e32c7243f29f33ab85b4c07bd4503Greg Clayton substrs = ["= 4"]) 99ad4b16961d4e32c7243f29f33ab85b4c07bd4503Greg Clayton 10078fa6c9532efbfa344093320f5c85b17d46d0327Sean Callanan self.expect("frame variable j->_definer->bar", VARIABLES_DISPLAYED_CORRECTLY, 10178fa6c9532efbfa344093320f5c85b17d46d0327Sean Callanan substrs = ["= 5"]) 102931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 10378fa6c9532efbfa344093320f5c85b17d46d0327Sean Callanan self.expect("frame variable *j->_definer", VARIABLES_DISPLAYED_CORRECTLY, 104ad4b16961d4e32c7243f29f33ab85b4c07bd4503Greg Clayton substrs = ["foo = 4", "bar = 5"]) 105ad4b16961d4e32c7243f29f33ab85b4c07bd4503Greg Clayton 106ad4b16961d4e32c7243f29f33ab85b4c07bd4503Greg Clayton self.expect("frame variable k->foo", VARIABLES_DISPLAYED_CORRECTLY, 107ad4b16961d4e32c7243f29f33ab85b4c07bd4503Greg Clayton substrs = ["= 2"]) 108ad4b16961d4e32c7243f29f33ab85b4c07bd4503Greg Clayton 109ad4b16961d4e32c7243f29f33ab85b4c07bd4503Greg Clayton self.expect("frame variable k->bar", VARIABLES_DISPLAYED_CORRECTLY, 110ad4b16961d4e32c7243f29f33ab85b4c07bd4503Greg Clayton substrs = ["= 3"]) 111ad4b16961d4e32c7243f29f33ab85b4c07bd4503Greg Clayton 112ad4b16961d4e32c7243f29f33ab85b4c07bd4503Greg Clayton self.expect("frame variable *k", VARIABLES_DISPLAYED_CORRECTLY, 113ad4b16961d4e32c7243f29f33ab85b4c07bd4503Greg Clayton substrs = ["foo = 2", "bar = 3"]) 114931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 115931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callananif __name__ == '__main__': 116931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan import atexit 117931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan lldb.SBDebugger.Initialize() 118931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan atexit.register(lambda: lldb.SBDebugger.Terminate()) 119931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan unittest2.main() 120