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 myclass = "MyClass" 24 mymethod = "description" 25 method_spec = "-[%s %s]" % (myclass, mymethod) 26 27 @expectedFailureAll(remote=True) 28 def test_break(self): 29 """Test 'expr member' continues to work for optimized build.""" 30 self.build() 31 exe = self.getBuildArtifact("a.out") 32 self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) 33 34 lldbutil.run_break_set_by_symbol( 35 self, 36 self.method_spec, 37 num_expected_locations=1, 38 sym_exact=True) 39 40 self.runCmd("run", RUN_SUCCEEDED) 41 self.expect( 42 "thread backtrace", 43 STOPPED_DUE_TO_BREAKPOINT, 44 substrs=["stop reason = breakpoint"], 45 patterns=[ 46 "frame.*0:.*%s %s" % 47 (self.myclass, 48 self.mymethod)]) 49 50 self.expect('expression member', 51 startstr="(int) $0 = 5") 52 53 # <rdar://problem/12693963> 54 interp = self.dbg.GetCommandInterpreter() 55 result = lldb.SBCommandReturnObject() 56 interp.HandleCommand('frame variable self', result) 57 output = result.GetOutput() 58 59 desired_pointer = "0x0" 60 61 mo = re.search("0x[0-9a-f]+", output) 62 63 if mo: 64 desired_pointer = mo.group(0) 65 66 self.expect('expression (self)', 67 substrs=[("(%s *) $1 = " % self.myclass), desired_pointer]) 68 69 self.expect('expression self->non_member', error=True, 70 substrs=["does not have a member named 'non_member'"]) 71