1 """ 2 Tests that C++ member and static variables are available where they should be. 3 """ 4 import lldb 5 from lldbtest import * 6 import lldbutil 7 8 class CPPThisTestCase(TestBase): 9 10 mydir = os.path.join("lang", "cpp", "this") 11 12 @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin") 13 #rdar://problem/9962849 14 #@expectedFailureClang 15 @dsym_test 16 def test_with_dsym_and_run_command(self): 17 """Test that the appropriate member variables are available when stopped in C++ static, inline, and const methods""" 18 self.buildDsym() 19 self.static_method_commands() 20 21 #rdar://problem/9962849 22 @expectedFailureFreeBSD('llvm.org/pr16697') # Expression fails with 'there is no JIT compiled function' 23 @expectedFailureGcc # llvm.org/pr15439 The 'this' pointer isn't available during expression evaluation when stopped in an inlined member function. 24 @expectedFailureIcc # ICC doesn't emit correct DWARF inline debug info for inlined member functions 25 @dwarf_test 26 def test_with_dwarf_and_run_command(self): 27 """Test that the appropriate member variables are available when stopped in C++ static, inline, and const methods""" 28 self.buildDwarf() 29 self.static_method_commands() 30 31 def setUp(self): 32 TestBase.setUp(self) 33 34 def set_breakpoint(self, line): 35 lldbutil.run_break_set_by_file_and_line (self, "main.cpp", line, num_expected_locations=1, loc_exact=False) 36 37 def static_method_commands(self): 38 """Test that the appropriate member variables are available when stopped in C++ static, inline, and const methods""" 39 self.runCmd("file a.out", CURRENT_EXECUTABLE_SET) 40 41 self.set_breakpoint(line_number('main.cpp', '// breakpoint 1')) 42 self.set_breakpoint(line_number('main.cpp', '// breakpoint 2')) 43 self.set_breakpoint(line_number('main.cpp', '// breakpoint 3')) 44 self.set_breakpoint(line_number('main.cpp', '// breakpoint 4')) 45 46 self.runCmd("process launch", RUN_SUCCEEDED) 47 48 self.expect("expression -- m_a = 2", 49 startstr = "(int) $0 = 2") 50 51 self.runCmd("process continue") 52 53 # This would be disallowed if we enforced const. But we don't. 54 self.expect("expression -- m_a = 2", 55 startstr = "(int) $1 = 2") 56 57 self.expect("expression -- (int)getpid(); m_a", 58 startstr = "(int) $2 = 2") 59 60 self.runCmd("process continue") 61 62 self.expect("expression -- s_a", 63 startstr = "(int) $3 = 5") 64 65 self.runCmd("process continue") 66 67 self.expect("expression -- m_a", 68 startstr = "(int) $4 = 2") 69 70 if __name__ == '__main__': 71 import atexit 72 lldb.SBDebugger.Initialize() 73 atexit.register(lambda: lldb.SBDebugger.Terminate()) 74 unittest2.main() 75