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