1""" 2Test that objective-c expression parser continues to work for optimized build. 3 4Fixed a bug in the expression parser where the 'this' 5or 'self' variable was not properly read if the compiler 6optimized it into a register. 7""" 8 9 10 11import lldb 12import re 13 14from lldbsuite.test.decorators import * 15from lldbsuite.test.lldbtest import * 16from lldbsuite.test import lldbutil 17 18# rdar://problem/9087739 19# test failure: objc_optimized does not work for "-C clang -A i386" 20 21 22class ObjcOptimizedTestCase(TestBase): 23 24 mydir = TestBase.compute_mydir(__file__) 25 myclass = "MyClass" 26 mymethod = "description" 27 method_spec = "-[%s %s]" % (myclass, mymethod) 28 29 @expectedFailureAll(remote=True) 30 def test_break(self): 31 """Test 'expr member' continues to work for optimized build.""" 32 self.build() 33 exe = self.getBuildArtifact("a.out") 34 self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) 35 36 lldbutil.run_break_set_by_symbol( 37 self, 38 self.method_spec, 39 num_expected_locations=1, 40 sym_exact=True) 41 42 self.runCmd("run", RUN_SUCCEEDED) 43 self.expect( 44 "thread backtrace", 45 STOPPED_DUE_TO_BREAKPOINT, 46 substrs=["stop reason = breakpoint"], 47 patterns=[ 48 "frame.*0:.*%s %s" % 49 (self.myclass, 50 self.mymethod)]) 51 52 self.expect('expression member', 53 startstr="(int) $0 = 5") 54 55 # <rdar://problem/12693963> 56 interp = self.dbg.GetCommandInterpreter() 57 result = lldb.SBCommandReturnObject() 58 interp.HandleCommand('frame variable self', result) 59 output = result.GetOutput() 60 61 desired_pointer = "0x0" 62 63 mo = re.search("0x[0-9a-f]+", output) 64 65 if mo: 66 desired_pointer = mo.group(0) 67 68 self.expect('expression (self)', 69 substrs=[("(%s *) $1 = " % self.myclass), desired_pointer]) 70 71 self.expect('expression self->non_member', error=True, 72 substrs=["does not have a member named 'non_member'"]) 73