1e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen"""
2e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny ChenTest that objective-c expression parser continues to work for optimized build.
3e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen
4e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chenhttp://llvm.org/viewvc/llvm-project?rev=126973&view=rev
5e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny ChenFixed a bug in the expression parser where the 'this'
6e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chenor 'self' variable was not properly read if the compiler
7e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chenoptimized it into a register.
8e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen"""
9e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen
10e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chenimport os, time
11e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chenimport unittest2
12e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chenimport lldb
13e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chenfrom lldbtest import *
14431d839a33e9a274e705f7a268a1c9de2ffc2da2Jim Inghamimport lldbutil
15b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callananimport re
16e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen
17e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen# rdar://problem/9087739
18e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen# test failure: objc_optimized does not work for "-C clang -A i386"
19e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen@unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
20e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chenclass ObjcOptimizedTestCase(TestBase):
21e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen
22f9c6f90ff6193b283259863b7ca3a047199789a3Johnny Chen    mydir = os.path.join("lang", "objc", "objc-optimized")
23e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen    myclass = "MyClass"
24e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen    mymethod = "description"
25e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen    method_spec = "-[%s %s]" % (myclass, mymethod)
26e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen
2721b1984e161b0cadee331d32bfd721eccfdf4b1fJohnny Chen    @dsym_test
28e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen    def test_break_with_dsym(self):
29e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen        """Test 'expr member' continues to work for optimized build."""
30e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen        self.buildDsym()
31e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen        self.objc_optimized()
32e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen
3321b1984e161b0cadee331d32bfd721eccfdf4b1fJohnny Chen    @dwarf_test
34e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen    def test_break_with_dwarf(self):
35e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen        """Test 'expr member' continues to work for optimized build."""
36e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen        self.buildDwarf()
37e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen        self.objc_optimized()
38e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen
39e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen    def objc_optimized(self):
40e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen        """Test 'expr member' continues to work for optimized build."""
41e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen        exe = os.path.join(os.getcwd(), "a.out")
42e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
43e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen
44431d839a33e9a274e705f7a268a1c9de2ffc2da2Jim Ingham        lldbutil.run_break_set_by_symbol (self, self.method_spec, num_expected_locations=1, sym_exact=True)
45e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen
46e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen        self.runCmd("run", RUN_SUCCEEDED)
47e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen        self.expect("thread backtrace", STOPPED_DUE_TO_BREAKPOINT,
48e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen            substrs = ["stop reason = breakpoint"],
49e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen            patterns = ["frame.*0:.*%s %s" % (self.myclass, self.mymethod)])
50e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen
51e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen        self.expect('expression member',
52e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen            startstr = "(int) $0 = 5")
53e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen
54b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan        # <rdar://problem/12693963>
55b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan        interp = self.dbg.GetCommandInterpreter()
56b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan        result = lldb.SBCommandReturnObject()
57b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan        interp.HandleCommand('frame variable self', result)
58b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan        output = result.GetOutput()
59b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan
60b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan        desired_pointer = "0x0"
61b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan
62b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan        mo = re.search("0x[0-9a-f]+", output)
63b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan
64b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan        if mo:
65b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan            desired_pointer = mo.group(0)
66b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan
67b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan        self.expect('expression (self)',
68b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan            substrs = [("(%s *) $1 = " % self.myclass), desired_pointer])
69e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen
70e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen        self.expect('expression self->non_member', error=True,
71e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen            substrs = ["does not have a member named 'non_member'"])
72e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen
73e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen
74e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chenif __name__ == '__main__':
75e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen    import atexit
76e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen    lldb.SBDebugger.Initialize()
77e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen    atexit.register(lambda: lldb.SBDebugger.Terminate())
78e96c72bd9d91e39494f3aa4e42eb047cce11fe38Johnny Chen    unittest2.main()
79