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