Index: test/tools/lldb-mi/Makefile =================================================================== --- test/tools/lldb-mi/Makefile +++ test/tools/lldb-mi/Makefile @@ -1,5 +1,5 @@ LEVEL = ../../make -C_SOURCES := main.c a.c b.c loop.c locals.c +C_SOURCES := main.c a.c b.c loop.c include $(LEVEL)/Makefile.rules Index: test/tools/lldb-mi/TestMiBreakpoint.py =================================================================== --- test/tools/lldb-mi/TestMiBreakpoint.py +++ test/tools/lldb-mi/TestMiBreakpoint.py @@ -1,113 +0,0 @@ -""" -Test that the lldb-mi driver understands an MI breakpoint command. -""" - -import lldbmi_testcase -from lldbtest import * -import unittest2 - -class MiBreakpointTestCase(lldbmi_testcase.MiTestCaseBase): - - @lldbmi_test - @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") - @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races - @skipIfLinux # llvm.org/pr22411: Failure presumably due to known thread races - def test_lldbmi_pendbreakonsym(self): - """Test that 'lldb-mi --interpreter' works for pending symbol breakpoints.""" - - self.spawnLldbMi(args = None) - - self.runCmd("-file-exec-and-symbols %s" % self.myexe) - self.expect("\^done") - - self.runCmd("-break-insert -f b_MyFunction") - self.expect("\^done,bkpt={number=\"1\"") - - self.runCmd("-exec-run") - self.expect("\^running") - self.expect("\*stopped,reason=\"breakpoint-hit\"") - - self.runCmd("-exec-continue") - self.expect("\^running") - self.expect("\*stopped,reason=\"exited-normally\"") - - @lldbmi_test - @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") - @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races - @skipIfLinux # llvm.org/pr22411: Failure presumably due to known thread races - def test_lldbmi_pendbreakonsrc(self): - """Test that 'lldb-mi --interpreter' works for pending source breakpoints.""" - - self.spawnLldbMi(args = None) - - self.runCmd("-file-exec-and-symbols %s" % self.myexe) - self.expect("\^done") - - # Find the line number to break inside main() and set - # pending BP - line = line_number('main.c', '//BP_source') - self.runCmd("-break-insert -f main.c:%d" % line) - self.expect("\^done,bkpt={number=\"1\"") - - self.runCmd("-exec-run") - self.expect("\^running") - self.expect("\*stopped,reason=\"breakpoint-hit\"") - - self.runCmd("-exec-continue") - self.expect("\^running") - self.expect("\*stopped,reason=\"exited-normally\"") - - @lldbmi_test - @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") - @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races - @skipIfLinux # llvm.org/pr22411: Failure presumably due to known thread races - def test_lldbmi_breakpoints(self): - """Test that 'lldb-mi --interpreter' works for breakpoints.""" - - self.spawnLldbMi(args = None) - - self.runCmd("-file-exec-and-symbols %s" % self.myexe) - self.expect("\^done") - - self.runCmd("-break-insert -f main") - self.expect("\^done,bkpt={number=\"1\"") - - self.runCmd("-exec-run") - self.expect("\^running") - self.expect("\*stopped,reason=\"breakpoint-hit\"") - - # Break on symbol - self.runCmd("-break-insert b_MyFunction") - self.expect("\^done,bkpt={number=\"2\"") - - self.runCmd("-exec-continue") - self.expect("\^running") - self.expect("\*stopped,reason=\"breakpoint-hit\"") - - # Break on source - line = line_number('main.c', '//BP_source') - self.runCmd("-break-insert main.c:%d" % line) - self.expect("\^done,bkpt={number=\"3\"") - - # Check with full path. TODO, figure out why this commands fails - # if -f is not given - line = line_number('main.c', '// BP_doloop') - full_path = os.path.join(os.getcwd(), "main.c") - self.runCmd("-break-insert -f %s:%d" % (full_path, line)) - self.expect("\^done,bkpt={number=\"4\"") - - self.runCmd("-exec-continue") - self.expect("\^running") - self.expect("\*stopped,reason=\"breakpoint-hit\"") - - self.runCmd("-exec-continue") - self.expect("\^running") - self.expect("\*stopped,reason=\"breakpoint-hit\"") - - # Run to exit - self.runCmd("-exec-continue") - self.expect("\^running") - self.expect("\*stopped,reason=\"exited-normally\"") - -if __name__ == '__main__': - unittest2.main() Index: test/tools/lldb-mi/TestMiData.py =================================================================== --- test/tools/lldb-mi/TestMiData.py +++ test/tools/lldb-mi/TestMiData.py @@ -1,127 +0,0 @@ -""" -Test that the lldb-mi driver works with -data-xxx commands -""" - -import lldbmi_testcase -from lldbtest import * -import unittest2 - -class MiDataTestCase(lldbmi_testcase.MiTestCaseBase): - - @lldbmi_test - @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") - @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races - @skipIfLinux # llvm.org/pr22411: Failure presumably due to known thread races - def test_lldbmi_data_disassemble(self): - """Test that 'lldb-mi --interpreter' works for -data-disassemble.""" - - self.spawnLldbMi(args = None) - - # Load executable - self.runCmd("-file-exec-and-symbols %s" % self.myexe) - self.expect("\^done") - - # Run to main - self.runCmd("-break-insert -f main") - self.expect("\^done,bkpt={number=\"1\"") - self.runCmd("-exec-run") - self.expect("\^running") - self.expect("\*stopped,reason=\"breakpoint-hit\"") - - # Get an address for disassembling: use main - self.runCmd("-data-evaluate-expression main") - self.expect("\^done,value=\"0x[0-9a-f]+\"") - addr = int(self.child.after.split("\"")[1], 16) - - # Test -data-disassemble: try to disassemble some address - self.runCmd("-data-disassemble -s %#x -e %#x -- 0" % (addr, addr + 0x10)) - self.expect("\^done,asm_insns=\[{address=\"0x%08x\",func-name=\"main\",offset=\"0\",size=\"[1-9]+\",inst=\".+\"}," % addr) - - @lldbmi_test - @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") - @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races - @skipIfLinux # llvm.org/pr22411: Failure presumably due to known thread races - def test_lldbmi_data_read_memory_bytes(self): - """Test that 'lldb-mi --interpreter' works for -data-read-memory-bytes.""" - - self.spawnLldbMi(args = None) - - # Load executable - self.runCmd("-file-exec-and-symbols %s" % self.myexe) - self.expect("\^done") - - # Run to main - self.runCmd("-break-insert -f main") - self.expect("\^done,bkpt={number=\"1\"") - self.runCmd("-exec-run") - self.expect("\^running") - self.expect("\*stopped,reason=\"breakpoint-hit\"") - - # Get address of s_RawData - self.runCmd("-data-evaluate-expression &s_RawData") - self.expect("\^done,value=\"0x[0-9a-f]+\"",timeout=1) - addr = int(self.child.after.split("\"")[1], 16) - size = 5 - - # Test -data-read-memory-bytes: try to read data of s_RawData - self.runCmd("-data-read-memory-bytes %#x %d" % (addr, size)) - self.expect("\^done,memory=\[{begin=\"0x0*%x\",offset=\"0x0+\",end=\"0x0*%x\",contents=\"1234567800\"}\]" % (addr, addr + size)) - - @lldbmi_test - @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") - @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races - @skipIfLinux # llvm.org/pr22411: Failure presumably due to known thread races - def test_lldbmi_data_list_register_names(self): - """Test that 'lldb-mi --interpreter' works for -data-list-register-names.""" - - self.spawnLldbMi(args = None) - - # Load executable - self.runCmd("-file-exec-and-symbols %s" % self.myexe) - self.expect("\^done") - - # Run to main - self.runCmd("-break-insert -f main") - self.expect("\^done,bkpt={number=\"1\"") - self.runCmd("-exec-run") - self.expect("\^running") - self.expect("\*stopped,reason=\"breakpoint-hit\"") - - # Test -data-list-register-names: try to get all registers - self.runCmd("-data-list-register-names") - self.expect("\^done,register-names=\[\".+\",") - - # Test -data-list-register-names: try to get specified registers - self.runCmd("-data-list-register-names 0") - self.expect("\^done,register-names=\[\".+\"\]") - - @lldbmi_test - @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") - @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races - @skipIfLinux # llvm.org/pr22411: Failure presumably due to known thread races - def test_lldbmi_data_list_register_values(self): - """Test that 'lldb-mi --interpreter' works for -data-list-register-values.""" - - self.spawnLldbMi(args = None) - - # Load executable - self.runCmd("-file-exec-and-symbols %s" % self.myexe) - self.expect("\^done") - - # Run to main - self.runCmd("-break-insert -f main") - self.expect("\^done,bkpt={number=\"1\"") - self.runCmd("-exec-run") - self.expect("\^running") - self.expect("\*stopped,reason=\"breakpoint-hit\"") - - # Test -data-list-register-values: try to get all registers - self.runCmd("-data-list-register-values x") - self.expect("\^done,register-values=\[{number=\"0\",value=\"0x[0-9a-f]+\"") - - # Test -data-list-register-values: try to get specified registers - self.runCmd("-data-list-register-values x 0") - self.expect("\^done,register-values=\[{number=\"0\",value=\"0x[0-9a-f]+\"}\]") - -if __name__ == '__main__': - unittest2.main() Index: test/tools/lldb-mi/TestMiEvaluate.py =================================================================== --- test/tools/lldb-mi/TestMiEvaluate.py +++ test/tools/lldb-mi/TestMiEvaluate.py @@ -1,113 +0,0 @@ -""" -Test that the lldb-mi driver can evaluate expressions. -""" - -import lldbmi_testcase -from lldbtest import * -import unittest2 - -class MiEvaluateTestCase(lldbmi_testcase.MiTestCaseBase): - - @lldbmi_test - @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") - @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races - @skipIfLinux # llvm.org/pr22411: Failure presumably due to known thread races - def test_lldbmi_eval(self): - """Test that 'lldb-mi --interpreter' works for evaluating.""" - - self.spawnLldbMi(args = None) - - # Load executable - self.runCmd("-file-exec-and-symbols %s" % self.myexe) - self.expect("\^done") - - # Run to program return (marked BP_source) - line = line_number('main.c', '//BP_source') - self.runCmd("-break-insert main.c:%d" % line) - self.expect("\^done,bkpt={number=\"1\"") - self.runCmd("-exec-run") - self.expect("\^running") - self.expect("\*stopped,reason=\"breakpoint-hit\"") - - # Print non-existant variable - self.runCmd("-var-create var1 * undef") - #self.expect("\^error") #FIXME: shows undef as {...} - self.runCmd("-data-evaluate-expression undef") - self.expect("\^error,msg=\"Could not evaluate expression\"") - - # Print global "g_MyVar", modify, delete and create again - self.runCmd("-data-evaluate-expression g_MyVar") - self.expect("\^done,value=\"3\"") - self.runCmd("-var-create var2 * g_MyVar") - self.expect("\^done,name=\"var2\",numchild=\"0\",value=\"3\",type=\"int\",thread-id=\"1\",has_more=\"0\"") - self.runCmd("-var-evaluate-expression var2") - self.expect("\^done,value=\"3\"") - self.runCmd("-var-show-attributes var2") - self.expect("\^done,status=\"editable\"") - self.runCmd("-data-evaluate-expression \"g_MyVar=30\"") - self.expect("\^done,value=\"30\"") - self.runCmd("-var-update var2") - #self.expect("name=\"var2\",value=\"30\"") #FIXME -var-update doesn't work - self.runCmd("-var-delete var2") - self.expect("\^done") - self.runCmd("-var-create var2 * g_MyVar") - self.expect("\^done,name=\"var2\",numchild=\"0\",value=\"30\",type=\"int\",thread-id=\"1\",has_more=\"0\"") - - # Print static "s_MyVar", modify, delete and create again - self.runCmd("-data-evaluate-expression s_MyVar") - self.expect("\^done,value=\"30\"") - self.runCmd("-var-create var3 * s_MyVar") - self.expect("\^done,name=\"var3\",numchild=\"0\",value=\"30\",type=\"int\",thread-id=\"1\",has_more=\"0\"") - self.runCmd("-var-evaluate-expression var3") - self.expect("\^done,value=\"30\"") - self.runCmd("-var-show-attributes var3") - self.expect("\^done,status=\"editable\"") - self.runCmd("-data-evaluate-expression \"s_MyVar=3\"") - self.expect("\^done,value=\"3\"") - self.runCmd("-var-update var3") - #self.expect("name=\"var3\",value=\"3\"") #FIXME -var-update doesn't work - self.runCmd("-var-delete var3") - self.expect("\^done") - self.runCmd("-var-create var3 * s_MyVar") - self.expect("\^done,name=\"var3\",numchild=\"0\",value=\"3\",type=\"int\",thread-id=\"1\",has_more=\"0\"") - - # Print local "b", modify, delete and create again - self.runCmd("-data-evaluate-expression b") - self.expect("\^done,value=\"20\"") - self.runCmd("-var-create var4 * b") - self.expect("\^done,name=\"var4\",numchild=\"0\",value=\"20\",type=\"int\",thread-id=\"1\",has_more=\"0\"") - self.runCmd("-var-evaluate-expression var4") - self.expect("\^done,value=\"20\"") - self.runCmd("-var-show-attributes var4") - self.expect("\^done,status=\"editable\"") - self.runCmd("-data-evaluate-expression \"b=2\"") - self.expect("\^done,value=\"2\"") - self.runCmd("-var-update var4") - #self.expect("name=\"var4\",value=\"2\"") #FIXME -var-update doesn't work - self.runCmd("-var-delete var4") - self.expect("\^done") - self.runCmd("-var-create var4 * b") - self.expect("\^done,name=\"var4\",numchild=\"0\",value=\"2\",type=\"int\",thread-id=\"1\",has_more=\"0\"") - - # Print temp "a + b" - self.runCmd("-data-evaluate-expression \"a + b\"") - self.expect("\^done,value=\"12\"") - self.runCmd("-var-create var5 * \"a + b\"") - self.expect("\^done,name=\"var5\",numchild=\"0\",value=\"12\",type=\"int\",thread-id=\"1\",has_more=\"0\"") - self.runCmd("-var-evaluate-expression var5") - self.expect("\^done,value=\"12\"") - self.runCmd("-var-show-attributes var5") - self.expect("\^done,status=\"editable\"") #FIXME editable or not? - - # Print argument "argv[0]" - self.runCmd("-data-evaluate-expression \"argv[0]\"") - self.expect("\^done,value=\"0x[0-9a-f]+\"") - self.runCmd("-var-create var6 * \"argv[0]\"") - self.expect("\^done,name=\"var6\",numchild=\"1\",value=\"0x[0-9a-f]+\",type=\"const char \*\",thread-id=\"1\",has_more=\"0\"") - self.runCmd("-var-evaluate-expression var6") - self.expect("\^done,value=\"0x[0-9a-f]+\"") - self.runCmd("-var-show-attributes var6") - self.expect("\^done,status=\"editable\"") - -if __name__ == '__main__': - unittest2.main() Index: test/tools/lldb-mi/TestMiExit.py =================================================================== --- test/tools/lldb-mi/TestMiExit.py +++ test/tools/lldb-mi/TestMiExit.py @@ -1,5 +1,5 @@ """ -Test that the lldb-mi driver works properly with "-gdb-exit". +Test that the lldb-mi driver exits properly. """ import lldbmi_testcase @@ -8,12 +8,14 @@ class MiExitTestCase(lldbmi_testcase.MiTestCaseBase): + mydir = TestBase.compute_mydir(__file__) + @lldbmi_test @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races @skipIfLinux # llvm.org/pr22411: Failure presumably due to known thread races - def test_lldbmi_gdbexit(self): - """Test that '-gdb-exit' terminates debug session and exits.""" + def test_lldbmi_gdb_exit(self): + """Test that '-gdb-exit' terminates local debug session and exits.""" self.spawnLldbMi(args = None) Index: test/tools/lldb-mi/TestMiFile.py =================================================================== --- test/tools/lldb-mi/TestMiFile.py +++ test/tools/lldb-mi/TestMiFile.py @@ -1,23 +1,25 @@ """ -Test various ways the lldb-mi driver can launch a program. +Test lldb-mi -file-xxx commands. """ import lldbmi_testcase from lldbtest import * import unittest2 -class MiLaunchTestCase(lldbmi_testcase.MiTestCaseBase): +class MiFileTestCase(lldbmi_testcase.MiTestCaseBase): + + mydir = TestBase.compute_mydir(__file__) @lldbmi_test @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races @skipIfLinux # llvm.org/pr22411: Failure presumably due to known thread races - def test_lldbmi_exe(self): + def test_lldbmi_file_exec_and_symbols_file(self): """Test that 'lldb-mi --interpreter' works for -file-exec-and-symbols exe.""" self.spawnLldbMi(args = None) - # Use no path + # Test that -file-exec-and-symbols works for filename self.runCmd("-file-exec-and-symbols %s" % self.myexe) self.expect("\^done") @@ -29,15 +31,15 @@ @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races @skipIfLinux # llvm.org/pr22411: Failure presumably due to known thread races - def test_lldbmi_abspathexe(self): + def test_lldbmi_file_exec_and_symbols_absolute_path(self): """Test that 'lldb-mi --interpreter' works for -file-exec-and-symbols fullpath/exe.""" self.spawnLldbMi(args = None) - # Use full path + # Test that -file-exec-and-symbols works for absolute path import os - exe = os.path.join(os.getcwd(), self.myexe) - self.runCmd("-file-exec-and-symbols %s" % exe) + path = os.path.join(os.getcwd(), self.myexe) + self.runCmd("-file-exec-and-symbols \"%s\"" % path) self.expect("\^done") self.runCmd("-exec-run") @@ -48,14 +50,14 @@ @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races @skipIfLinux # llvm.org/pr22411: Failure presumably due to known thread races - def test_lldbmi_relpathexe(self): + def test_lldbmi_file_exec_and_symbols_relative_path(self): """Test that 'lldb-mi --interpreter' works for -file-exec-and-symbols relpath/exe.""" self.spawnLldbMi(args = None) - # Use relative path - exe = "../../" + self.mydir + "/" + self.myexe - self.runCmd("-file-exec-and-symbols %s" % exe) + # Test that -file-exec-and-symbols works for relative path + path = "./%s" % self.myexe + self.runCmd("-file-exec-and-symbols %s" % path) self.expect("\^done") self.runCmd("-exec-run") @@ -66,13 +68,13 @@ @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races @skipIfLinux # llvm.org/pr22411: Failure presumably due to known thread races - def test_lldbmi_badpathexe(self): + def test_lldbmi_file_exec_and_symbols_unknown_path(self): """Test that 'lldb-mi --interpreter' works for -file-exec-and-symbols badpath/exe.""" self.spawnLldbMi(args = None) - # Use non-existant path - exe = "badpath/" + self.myexe + # Test that -file-exec-and-symbols fails on unknown path + exe = "unknown_dir/%s" % self.myexe self.runCmd("-file-exec-and-symbols %s" % exe) self.expect("\^error") Index: test/tools/lldb-mi/TestMiLaunch.py =================================================================== --- test/tools/lldb-mi/TestMiLaunch.py +++ test/tools/lldb-mi/TestMiLaunch.py @@ -1,80 +0,0 @@ -""" -Test various ways the lldb-mi driver can launch a program. -""" - -import lldbmi_testcase -from lldbtest import * -import unittest2 - -class MiLaunchTestCase(lldbmi_testcase.MiTestCaseBase): - - @lldbmi_test - @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") - @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races - @skipIfLinux # llvm.org/pr22411: Failure presumably due to known thread races - def test_lldbmi_exe(self): - """Test that 'lldb-mi --interpreter' works for -file-exec-and-symbols exe.""" - - self.spawnLldbMi(args = None) - - # Use no path - self.runCmd("-file-exec-and-symbols %s" % self.myexe) - self.expect("\^done") - - self.runCmd("-exec-run") - self.expect("\^running") - self.expect("\*stopped,reason=\"exited-normally\"") - - @lldbmi_test - @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") - @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races - @skipIfLinux # llvm.org/pr22411: Failure presumably due to known thread races - def test_lldbmi_abspathexe(self): - """Test that 'lldb-mi --interpreter' works for -file-exec-and-symbols fullpath/exe.""" - - self.spawnLldbMi(args = None) - - # Use full path - import os - exe = os.path.join(os.getcwd(), self.myexe) - self.runCmd("-file-exec-and-symbols %s" % exe) - self.expect("\^done") - - self.runCmd("-exec-run") - self.expect("\^running") - self.expect("\*stopped,reason=\"exited-normally\"") - - @lldbmi_test - @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") - @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races - @skipIfLinux # llvm.org/pr22411: Failure presumably due to known thread races - def test_lldbmi_relpathexe(self): - """Test that 'lldb-mi --interpreter' works for -file-exec-and-symbols relpath/exe.""" - - self.spawnLldbMi(args = None) - - # Use relative path - exe = "../../" + self.mydir + "/" + self.myexe - self.runCmd("-file-exec-and-symbols %s" % exe) - self.expect("\^done") - - self.runCmd("-exec-run") - self.expect("\^running") - self.expect("\*stopped,reason=\"exited-normally\"") - - @lldbmi_test - @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") - @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races - @skipIfLinux # llvm.org/pr22411: Failure presumably due to known thread races - def test_lldbmi_badpathexe(self): - """Test that 'lldb-mi --interpreter' works for -file-exec-and-symbols badpath/exe.""" - - self.spawnLldbMi(args = None) - - # Use non-existant path - exe = "badpath/" + self.myexe - self.runCmd("-file-exec-and-symbols %s" % exe) - self.expect("\^error") - -if __name__ == '__main__': - unittest2.main() Index: test/tools/lldb-mi/TestMiStack.py =================================================================== --- test/tools/lldb-mi/TestMiStack.py +++ test/tools/lldb-mi/TestMiStack.py @@ -1,302 +0,0 @@ -""" -Test that the lldb-mi driver works with -stack-xxx commands -""" - -import lldbmi_testcase -from lldbtest import * -import unittest2 - -class MiStackTestCase(lldbmi_testcase.MiTestCaseBase): - - @lldbmi_test - @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") - @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races - @skipIfLinux # llvm.org/pr22411: Failure presumably due to known thread races - def test_lldbmi_stack_list_arguments(self): - """Test that 'lldb-mi --interpreter' can shows arguments.""" - - self.spawnLldbMi(args = None) - - # Load executable - self.runCmd("-file-exec-and-symbols %s" % self.myexe) - self.expect("\^done") - - # Run to main - self.runCmd("-break-insert -f main") - self.expect("\^done,bkpt={number=\"1\"") - self.runCmd("-exec-run") - self.expect("\^running") - self.expect("\*stopped,reason=\"breakpoint-hit\"") - - # Test -stack-list-arguments: use 0 or --no-values - self.runCmd("-stack-list-arguments 0") - self.expect("\^done,stack-args=\[frame={level=\"0\",args=\[name=\"argc\",name=\"argv\"\]}") - self.runCmd("-stack-list-arguments --no-values") - self.expect("\^done,stack-args=\[frame={level=\"0\",args=\[name=\"argc\",name=\"argv\"\]}") - - # Test -stack-list-arguments: use 1 or --all-values - self.runCmd("-stack-list-arguments 1") - self.expect("\^done,stack-args=\[frame={level=\"0\",args=\[{name=\"argc\",value=\"1\"},{name=\"argv\",value=\".*\"}\]}") - self.runCmd("-stack-list-arguments --all-values") - self.expect("\^done,stack-args=\[frame={level=\"0\",args=\[{name=\"argc\",value=\"1\"},{name=\"argv\",value=\".*\"}\]}") - - # Test -stack-list-arguments: use 2 or --simple-values - self.runCmd("-stack-list-arguments 2") - self.expect("\^done,stack-args=\[frame={level=\"0\",args=\[{name=\"argc\",value=\"1\"},{name=\"argv\",value=\".*\"}\]}") - self.runCmd("-stack-list-arguments --simple-values") - self.expect("\^done,stack-args=\[frame={level=\"0\",args=\[{name=\"argc\",value=\"1\"},{name=\"argv\",value=\".*\"}\]}") - - @lldbmi_test - @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") - @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races - @skipIfLinux # llvm.org/pr22411: Failure presumably due to known thread races - def test_lldbmi_stack_list_locals(self): - """Test that 'lldb-mi --interpreter' can shows local variables.""" - - self.spawnLldbMi(args = None) - - # Load executable - self.runCmd("-file-exec-and-symbols %s" % self.myexe) - self.expect("\^done") - - # Run to main - line = line_number('main.c', '//BP_localstest') - self.runCmd("-break-insert --file main.c:%d" % line) - self.expect("\^done,bkpt={number=\"1\"") - self.runCmd("-exec-run") - self.expect("\^running") - self.expect("\*stopped,reason=\"breakpoint-hit\"") - - # Test -stack-list-locals: use 0 or --no-values - self.runCmd("-stack-list-locals 0") - self.expect("\^done,locals=\[name=\"a\",name=\"b\"\]") - self.runCmd("-stack-list-locals --no-values") - self.expect("\^done,locals=\[name=\"a\",name=\"b\"\]") - - # Test -stack-list-locals: use 1 or --all-values - self.runCmd("-stack-list-locals 1") - self.expect("\^done,locals=\[{name=\"a\",value=\"10\"},{name=\"b\",value=\"20\"}\]") - self.runCmd("-stack-list-locals --all-values") - self.expect("\^done,locals=\[{name=\"a\",value=\"10\"},{name=\"b\",value=\"20\"}\]") - - # Test -stack-list-locals: use 2 or --simple-values - self.runCmd("-stack-list-locals 2") - self.expect("\^done,locals=\[{name=\"a\",value=\"10\"},{name=\"b\",value=\"20\"}\]") - self.runCmd("-stack-list-locals --simple-values") - self.expect("\^done,locals=\[{name=\"a\",value=\"10\"},{name=\"b\",value=\"20\"}\]") - - # Test struct local variable - line = line_number('locals.c', '// BP_LOCAL_STRUCT') - self.runCmd("-break-insert --file locals.c:%d" % line) - self.expect("\^done,bkpt={number=\"2\"") - - self.runCmd("-exec-continue") - self.expect("\^running") - self.expect("\*stopped,reason=\"breakpoint-hit\"") - - # Test -stack-list-locals: use 0 or --no-values - self.runCmd("-stack-list-locals 0") - self.expect("\^done,locals=\[name=\"var_c\"\]") - self.runCmd("-stack-list-locals --no-values") - self.expect("\^done,locals=\[name=\"var_c\"\]") - - # Test -stack-list-locals: use 1 or --all-values - self.runCmd("-stack-list-locals 1") - self.expect("\^done,locals=\[{name=\"var_c\",value=\"{var_a = 10,var_b = 97 'a',inner_ = { var_d = 30 }}\"}\]") - self.runCmd("-stack-list-locals --all-values") - self.expect("\^done,locals=\[{name=\"var_c\",value=\"{var_a = 10,var_b = 97 'a',inner_ = { var_d = 30 }}\"}\]") - - # Test -stack-list-locals: use 2 or --simple-values - self.runCmd("-stack-list-locals 2") - self.expect("\^done,locals=\[name=\"var_c\"\]") - self.runCmd("-stack-list-locals --simple-values") - self.expect("\^done,locals=\[name=\"var_c\"\]") - - # Test array local variable - line = line_number('locals.c', '// BP_LOCAL_ARRAY') - self.runCmd("-break-insert --file locals.c:%d" % line) - self.expect("\^done,bkpt={number=\"3\"") - - self.runCmd("-exec-continue") - self.expect("\^running") - self.expect("\*stopped,reason=\"breakpoint-hit\"") - - # Test -stack-list-locals: use 0 or --no-values - self.runCmd("-stack-list-locals 0") - self.expect("\^done,locals=\[name=\"array\"\]") - self.runCmd("-stack-list-locals --no-values") - self.expect("\^done,locals=\[name=\"array\"\]") - - # Test -stack-list-locals: use 1 or --all-values - self.runCmd("-stack-list-locals 1") - self.expect("\^done,locals=\[{name=\"array\",value=\"{\[0\] = 100,\[1\] = 200,\[2\] = 300}\"}\]") - self.runCmd("-stack-list-locals --all-values") - self.expect("\^done,locals=\[{name=\"array\",value=\"{\[0\] = 100,\[1\] = 200,\[2\] = 300}\"}\]") - - # Test -stack-list-locals: use 2 or --simple-values - self.runCmd("-stack-list-locals 2") - self.expect("\^done,locals=\[name=\"array\"\]") - self.runCmd("-stack-list-locals --simple-values") - self.expect("\^done,locals=\[name=\"array\"\]") - - # Test pointers as local variable - line = line_number('locals.c', '// BP_LOCAL_PTR') - self.runCmd("-break-insert --file locals.c:%d" % line) - self.expect("\^done,bkpt={number=\"4\"") - - self.runCmd("-exec-continue") - self.expect("\^running") - self.expect("\*stopped,reason=\"breakpoint-hit\"") - - # Test -stack-list-locals: use 0 or --no-values - self.runCmd("-stack-list-locals 0") - self.expect("\^done,locals=\[name=\"test_str\",name=\"var_e\",name=\"ptr\"\]") - self.runCmd("-stack-list-locals --no-values") - self.expect("\^done,locals=\[name=\"test_str\",name=\"var_e\",name=\"ptr\"\]") - - # Test -stack-list-locals: use 1 or --all-values - self.runCmd("-stack-list-locals 1") - self.expect("\^done,locals=\[{name=\"test_str\",value=\".*Rakaposhi.*\"},{name=\"var_e\",value=\"24\"},{name=\"ptr\",value=\".*\"}\]") - self.runCmd("-stack-list-locals --all-values") - self.expect("\^done,locals=\[{name=\"test_str\",value=\".*Rakaposhi.*\"},{name=\"var_e\",value=\"24\"},{name=\"ptr\",value=\".*\"}\]") - - # Test -stack-list-locals: use 2 or --simple-values - self.runCmd("-stack-list-locals 2") - self.expect("\^done,locals=\[{name=\"test_str\",value=\".*Rakaposhi.*\"},{name=\"var_e\",value=\"24\"},{name=\"ptr\",value=\".*\"}\]") - self.runCmd("-stack-list-locals --simple-values") - self.expect("\^done,locals=\[{name=\"test_str\",value=\".*Rakaposhi.*\"},{name=\"var_e\",value=\"24\"},{name=\"ptr\",value=\".*\"}\]") - - @lldbmi_test - @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") - @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races - @skipIfLinux # llvm.org/pr22411: Failure presumably due to known thread races - def test_lldbmi_stack_info_depth(self): - """Test that 'lldb-mi --interpreter' can shows depth of the stack.""" - - self.spawnLldbMi(args = None) - - # Load executable - self.runCmd("-file-exec-and-symbols %s" % self.myexe) - self.expect("\^done") - - # Run to main - self.runCmd("-break-insert -f main") - self.expect("\^done,bkpt={number=\"1\"") - self.runCmd("-exec-run") - self.expect("\^running") - self.expect("\*stopped,reason=\"breakpoint-hit\"") - - # Test stack depth - self.runCmd("-stack-info-depth") - self.expect("\^done,depth=\"[1-9]\"") - - @lldbmi_test - @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") - @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races - @skipIfLinux # llvm.org/pr22411: Failure presumably due to known thread races - def test_lldbmi_stack_info_frame(self): - """Test that 'lldb-mi --interpreter' can show information about current frame.""" - - self.spawnLldbMi(args = None) - - # Test that -stack-info-frame fails when program isn't running - self.runCmd("-stack-info-frame") - self.expect("\^error,msg=\"Command 'stack-info-frame'. Invalid process during debug session\"") - - # Load executable - self.runCmd("-file-exec-and-symbols %s" % self.myexe) - self.expect("\^done") - - # Run to main - self.runCmd("-break-insert -f main") - self.expect("\^done,bkpt={number=\"1\"") - self.runCmd("-exec-run") - self.expect("\^running") - self.expect("\*stopped,reason=\"breakpoint-hit\"") - - # Test that -stack-info-frame works when program is running - self.runCmd("-stack-info-frame") - self.expect("\^done,frame=\{level=\"0\",addr=\".+\",func=\"main\",file=\"main\.c\",fullname=\".*main\.c\",line=\"\d+\"\}") - - @lldbmi_test - @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") - @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races - @skipIfLinux # llvm.org/pr22411: Failure presumably due to known thread races - def test_lldbmi_stack_list_frames(self): - """Test that 'lldb-mi --interpreter' can lists the frames on the stack.""" - - self.spawnLldbMi(args = None) - - # Load executable - self.runCmd("-file-exec-and-symbols %s" % self.myexe) - self.expect("\^done") - - # Run to main - self.runCmd("-break-insert -f main") - self.expect("\^done,bkpt={number=\"1\"") - self.runCmd("-exec-run") - self.expect("\^running") - self.expect("\*stopped,reason=\"breakpoint-hit\"") - - # Test stack frame: get frame #0 info - self.runCmd("-stack-list-frames 0 0") - self.expect("\^done,stack=\[frame=\{level=\"0\",addr=\".+\",func=\"main\",file=\"main\.c\",fullname=\".*main\.c\",line=\".+\"\}\]") - - @lldbmi_test - @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") - @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races - @skipIfLinux # llvm.org/pr22411: Failure presumably due to known thread races - def test_lldbmi_stack_select_frame(self): - """Test that 'lldb-mi --interpreter' can choose current frame.""" - - self.spawnLldbMi(args = None) - - # Load executable - self.runCmd("-file-exec-and-symbols %s" % self.myexe) - self.expect("\^done") - - # Run to main - self.runCmd("-break-insert -f main") - self.expect("\^done,bkpt={number=\"1\"") - self.runCmd("-exec-run") - self.expect("\^running") - self.expect("\*stopped,reason=\"breakpoint-hit\"") - - # Test that -stack-select-frame requires 1 mandatory argument - self.runCmd("-stack-select-frame") - self.expect("\^error,msg=\"Command 'stack-select-frame'. Command Args. Missing options, 1 or more required\"") - - # Test that -stack-select-frame fails on invalid frame number - self.runCmd("-stack-select-frame 99") - self.expect("\^error,msg=\"Command 'stack-select-frame'. Frame ID invalid\"") - - # Test that current frame is #0 - self.runCmd("-stack-info-frame") - self.expect("\^done,frame=\{level=\"0\",addr=\".+\",func=\"main\",file=\"main\.c\",fullname=\".*main\.c\",line=\"\d+\"\}") - - # Test that -stack-select-frame can select the selected frame - self.runCmd("-stack-select-frame 0") - self.expect("\^done") - - # Test that current frame is still #0 - self.runCmd("-stack-info-frame") - self.expect("\^done,frame=\{level=\"0\",addr=\".+\",func=\"main\",file=\"main\.c\",fullname=\".*main\.c\",line=\"\d+\"\}") - - # Test that -stack-select-frame can select frame #1 (parent frame) - self.runCmd("-stack-select-frame 1") - self.expect("\^done") - - # Test that current frame is #1 - self.runCmd("-stack-info-frame") - self.expect("\^done,frame=\{level=\"1\",addr=\".+\",func=\".+\",file=\"\?\?\",fullname=\"\?\?\",line=\"-1\"\}") - - # Test that -stack-select-frame can select frame #0 (child frame) - self.runCmd("-stack-select-frame 0") - self.expect("\^done") - - # Test that current frame is #0 and it has the same information - self.runCmd("-stack-info-frame") - self.expect("\^done,frame=\{level=\"0\",addr=\".+\",func=\"main\",file=\"main\.c\",fullname=\".*main\.c\",line=\"\d+\"\}") - -if __name__ == '__main__': - unittest2.main() Index: test/tools/lldb-mi/TestMiSyntax.py =================================================================== --- test/tools/lldb-mi/TestMiSyntax.py +++ test/tools/lldb-mi/TestMiSyntax.py @@ -8,12 +8,14 @@ class MiSyntaxTestCase(lldbmi_testcase.MiTestCaseBase): + mydir = TestBase.compute_mydir(__file__) + @lldbmi_test @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races @skipIfLinux # llvm.org/pr22411: Failure presumably due to known thread races def test_lldbmi_tokens(self): - """Test that 'lldb-mi --interpreter' echos command tokens.""" + """Test that 'lldb-mi --interpreter' prints command tokens.""" self.spawnLldbMi(args = None) @@ -22,7 +24,7 @@ self.expect("000\^done") # Run to main - self.runCmd("100000001-break-insert -f b_MyFunction") + self.runCmd("100000001-break-insert -f main") self.expect("100000001\^done,bkpt={number=\"1\"") self.runCmd("2-exec-run") self.expect("2\^running") @@ -53,7 +55,7 @@ self.expect("\^done") # Check that it was loaded correctly - self.runCmd("-break-insert -f a_MyFunction") + self.runCmd("-break-insert -f main") self.expect("\^done,bkpt={number=\"1\"") self.runCmd("-exec-run") self.expect("\^running") Index: test/tools/lldb-mi/breakpoint/Makefile =================================================================== --- /dev/null +++ test/tools/lldb-mi/breakpoint/Makefile @@ -0,0 +1,5 @@ +LEVEL = ../../../make + +CXX_SOURCES := main.cpp + +include $(LEVEL)/Makefile.rules Index: test/tools/lldb-mi/breakpoint/TestMiBreak.py =================================================================== --- test/tools/lldb-mi/breakpoint/TestMiBreak.py +++ test/tools/lldb-mi/breakpoint/TestMiBreak.py @@ -1,42 +1,66 @@ """ -Test that the lldb-mi driver understands an MI breakpoint command. +Test lldb-mi -break-xxx commands. """ import lldbmi_testcase from lldbtest import * import unittest2 -class MiBreakpointTestCase(lldbmi_testcase.MiTestCaseBase): +class MiBreakTestCase(lldbmi_testcase.MiTestCaseBase): + + mydir = TestBase.compute_mydir(__file__) @lldbmi_test @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races @skipIfLinux # llvm.org/pr22411: Failure presumably due to known thread races - def test_lldbmi_pendbreakonsym(self): - """Test that 'lldb-mi --interpreter' works for pending symbol breakpoints.""" + def test_lldbmi_break_insert_function_pending(self): + """Test that 'lldb-mi --interpreter' works for pending function breakpoints.""" self.spawnLldbMi(args = None) self.runCmd("-file-exec-and-symbols %s" % self.myexe) self.expect("\^done") - self.runCmd("-break-insert -f b_MyFunction") + self.runCmd("-break-insert -f g_MyFunction") self.expect("\^done,bkpt={number=\"1\"") self.runCmd("-exec-run") self.expect("\^running") self.expect("\*stopped,reason=\"breakpoint-hit\"") + @lldbmi_test + @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") + @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races + @skipIfLinux # llvm.org/pr22411: Failure presumably due to known thread races + def test_lldbmi_break_insert_function(self): + """Test that 'lldb-mi --interpreter' works for function breakpoints.""" + + self.spawnLldbMi(args = None) + + self.runCmd("-file-exec-and-symbols %s" % self.myexe) + self.expect("\^done") + + self.runCmd("-break-insert -f main") + self.expect("\^done,bkpt={number=\"1\"") + + self.runCmd("-exec-run") + self.expect("\^running") + self.expect("\*stopped,reason=\"breakpoint-hit\"") + + self.runCmd("-break-insert g_MyFunction") + self.expect("\^done,bkpt={number=\"2\"") + self.runCmd("-exec-continue") self.expect("\^running") - self.expect("\*stopped,reason=\"exited-normally\"") + self.expect("\*stopped,reason=\"breakpoint-hit\"") @lldbmi_test @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races @skipIfLinux # llvm.org/pr22411: Failure presumably due to known thread races - def test_lldbmi_pendbreakonsrc(self): - """Test that 'lldb-mi --interpreter' works for pending source breakpoints.""" + def test_lldbmi_break_insert_file_line_pending(self): + """Test that 'lldb-mi --interpreter' works for pending file:line breakpoints.""" self.spawnLldbMi(args = None) @@ -45,24 +69,20 @@ # Find the line number to break inside main() and set # pending BP - line = line_number('main.c', '//BP_source') - self.runCmd("-break-insert -f main.c:%d" % line) + line = line_number('main.cpp', '// BP_return') + self.runCmd("-break-insert -f main.cpp:%d" % line) self.expect("\^done,bkpt={number=\"1\"") self.runCmd("-exec-run") self.expect("\^running") self.expect("\*stopped,reason=\"breakpoint-hit\"") - self.runCmd("-exec-continue") - self.expect("\^running") - self.expect("\*stopped,reason=\"exited-normally\"") - @lldbmi_test @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races @skipIfLinux # llvm.org/pr22411: Failure presumably due to known thread races - def test_lldbmi_breakpoints(self): - """Test that 'lldb-mi --interpreter' works for breakpoints.""" + def test_lldbmi_break_insert_file_line(self): + """Test that 'lldb-mi --interpreter' works for file:line breakpoints.""" self.spawnLldbMi(args = None) @@ -76,38 +96,42 @@ self.expect("\^running") self.expect("\*stopped,reason=\"breakpoint-hit\"") - # Break on symbol - self.runCmd("-break-insert b_MyFunction") + line = line_number('main.cpp', '// BP_return') + self.runCmd("-break-insert main.cpp:%d" % line) self.expect("\^done,bkpt={number=\"2\"") self.runCmd("-exec-continue") self.expect("\^running") self.expect("\*stopped,reason=\"breakpoint-hit\"") - # Break on source - line = line_number('main.c', '//BP_source') - self.runCmd("-break-insert main.c:%d" % line) - self.expect("\^done,bkpt={number=\"3\"") - - # Check with full path. TODO, figure out why this commands fails - # if -f is not given - line = line_number('main.c', '// BP_doloop') - full_path = os.path.join(os.getcwd(), "main.c") - self.runCmd("-break-insert -f %s:%d" % (full_path, line)) - self.expect("\^done,bkpt={number=\"4\"") + @lldbmi_test + @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") + @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races + @skipIfLinux # llvm.org/pr22411: Failure presumably due to known thread races + @unittest2.expectedFailure("-break-insert doesn't work for absolute path") + def test_lldbmi_break_insert_file_line_absolute_path(self): + """Test that 'lldb-mi --interpreter' works for file:line breakpoints.""" - self.runCmd("-exec-continue") - self.expect("\^running") - self.expect("\*stopped,reason=\"breakpoint-hit\"") + self.spawnLldbMi(args = None) - self.runCmd("-exec-continue") + self.runCmd("-file-exec-and-symbols %s" % self.myexe) + self.expect("\^done") + + self.runCmd("-break-insert -f main") + self.expect("\^done,bkpt={number=\"1\"") + + self.runCmd("-exec-run") self.expect("\^running") self.expect("\*stopped,reason=\"breakpoint-hit\"") - # Run to exit + import os + path = os.path.join(os.getcwd(), "main.cpp") + line = line_number('main.cpp', '// BP_return') + self.runCmd("-break-insert %s:%d" % (path, line)) + self.runCmd("-exec-continue") self.expect("\^running") - self.expect("\*stopped,reason=\"exited-normally\"") + self.expect("\*stopped,reason=\"breakpoint-hit\"") if __name__ == '__main__': unittest2.main() Index: test/tools/lldb-mi/breakpoint/main.cpp =================================================================== --- /dev/null +++ test/tools/lldb-mi/breakpoint/main.cpp @@ -0,0 +1,20 @@ +//===-- main.cpp ------------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +void +g_MyFunction(void) +{ +} + +int +main(int argc, char const *argv[]) +{ + g_MyFunction(); + return 0; // BP_return +} Index: test/tools/lldb-mi/data/Makefile =================================================================== --- /dev/null +++ test/tools/lldb-mi/data/Makefile @@ -0,0 +1,5 @@ +LEVEL = ../../../make + +CXX_SOURCES := main.cpp + +include $(LEVEL)/Makefile.rules Index: test/tools/lldb-mi/data/TestMiData.py =================================================================== --- test/tools/lldb-mi/data/TestMiData.py +++ test/tools/lldb-mi/data/TestMiData.py @@ -1,5 +1,5 @@ """ -Test that the lldb-mi driver works with -data-xxx commands +Test lldb-mi -data-xxx commands. """ import lldbmi_testcase @@ -8,6 +8,8 @@ class MiDataTestCase(lldbmi_testcase.MiTestCaseBase): + mydir = TestBase.compute_mydir(__file__) + @lldbmi_test @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races @@ -41,6 +43,7 @@ @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races @skipIfLinux # llvm.org/pr22411: Failure presumably due to known thread races + @unittest2.skip("-data-evaluate-expression doesn't work") #FIXME: the global case worked before refactoring def test_lldbmi_data_read_memory_bytes(self): """Test that 'lldb-mi --interpreter' works for -data-read-memory-bytes.""" @@ -57,15 +60,25 @@ self.expect("\^running") self.expect("\*stopped,reason=\"breakpoint-hit\"") - # Get address of s_RawData - self.runCmd("-data-evaluate-expression &s_RawData") - self.expect("\^done,value=\"0x[0-9a-f]+\"",timeout=1) + # Get address of char[] (global) + self.runCmd("-data-evaluate-expression &g_CharArray") + self.expect("\^done,value=\"0x[0-9a-f]+\"") + addr = int(self.child.after.split("\"")[1], 16) + size = 5 + + # Test that -data-read-memory-bytes works for char[] type (global) + self.runCmd("-data-read-memory-bytes %#x %d" % (addr, size)) + self.expect("\^done,memory=\[{begin=\"0x0*%x\",offset=\"0x0+\",end=\"0x0*%x\",contents=\"1112131400\"}\]" % (addr, addr + size)) + + # Get address of static char[] + self.runCmd("-data-evaluate-expression &s_CharArray") + self.expect("\^done,value=\"0x[0-9a-f]+\"") addr = int(self.child.after.split("\"")[1], 16) size = 5 - # Test -data-read-memory-bytes: try to read data of s_RawData + # Test that -data-read-memory-bytes works for static char[] type self.runCmd("-data-read-memory-bytes %#x %d" % (addr, size)) - self.expect("\^done,memory=\[{begin=\"0x0*%x\",offset=\"0x0+\",end=\"0x0*%x\",contents=\"1234567800\"}\]" % (addr, addr + size)) + self.expect("\^done,memory=\[{begin=\"0x0*%x\",offset=\"0x0+\",end=\"0x0*%x\",contents=\"1112131400\"}\]" % (addr, addr + size)) @lldbmi_test @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") Index: test/tools/lldb-mi/data/main.cpp =================================================================== --- /dev/null +++ test/tools/lldb-mi/data/main.cpp @@ -0,0 +1,17 @@ +//===-- main.cpp ------------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +const char g_CharArray[] = "\x10\x11\x12\x13"; +static const char s_CharArray[] = "\x20\x21\x22\x23"; + +int +main(int argc, char const *argv[]) +{ + return 0; +} Index: test/tools/lldb-mi/lldbmi_testcase.py =================================================================== --- test/tools/lldb-mi/lldbmi_testcase.py +++ test/tools/lldb-mi/lldbmi_testcase.py @@ -8,7 +8,7 @@ class MiTestCaseBase(Base): - mydir = Base.compute_mydir(__file__) + mydir = Base.compute_mydir(__file__) #TODO remove me myexe = "a.out" mylog = "child.log" Index: test/tools/lldb-mi/locals.c =================================================================== --- test/tools/lldb-mi/locals.c +++ /dev/null @@ -1,45 +0,0 @@ -struct inner -{ - int var_d; -}; - -struct my_type -{ - int var_a; - char var_b; - struct inner inner_; -}; - -int local_struct_test(void) -{ - struct my_type var_c; - var_c.var_a = 10; - var_c.var_b = 'a'; - var_c.inner_.var_d = 30; - return 0; // BP_LOCAL_STRUCT -} - -int local_array_test(void) -{ - int array[3]; - array[0] = 100; - array[1] = 200; - array[2] = 300; - return 0; // BP_LOCAL_ARRAY -} - -int local_pointer_test(void) -{ - const char* test_str = "Rakaposhi"; - int var_e = 24; - int *ptr = &var_e; - return 0; // BP_LOCAL_PTR -} - -int local_test() -{ - local_struct_test(); - local_array_test(); - local_pointer_test(); - return 0; -} \ No newline at end of file Index: test/tools/lldb-mi/main.c =================================================================== --- test/tools/lldb-mi/main.c +++ test/tools/lldb-mi/main.c @@ -11,12 +11,12 @@ extern int a_MyFunction(); extern int b_MyFunction(); extern int infloop(); -extern int local_test(); + int doloop, dosegfault; -int g_MyVar = 3; -static int s_MyVar = 4; -//FIXME -data-evaluate-expression/print can't evaluate value of type "static char[]" -const char s_RawData[] = "\x12\x34\x56\x78"; //FIXME static const char s_RawData[] = "\x12\x34\x56\x78"; + + + + int main (int argc, char const *argv[]) { @@ -25,16 +25,16 @@ //BP_argctest a = a_MyFunction(); //BP_a_MyFunction_call b = b_MyFunction(); //BP_b_MyFunction_call - //BP_localstest -- it must be at line #24 (or fix it in main*.micmds) + if (doloop) // BP_doloop infloop(); if (dosegfault) *(volatile int *)NULL = 1; if (argc > 1 && *argv[1] == 'l') { a++; - printf("a=%d, argv[1]=%s\n", a, argv[1]); //BP_argtest + printf("a=%d, argv[1]=%s\n", a, argv[1]); } - s_MyVar = a + b; - local_test(); - return a + b - s_MyVar; //BP_source + + + return a + b; } Index: test/tools/lldb-mi/stack/Makefile =================================================================== --- /dev/null +++ test/tools/lldb-mi/stack/Makefile @@ -0,0 +1,5 @@ +LEVEL = ../../../make + +CXX_SOURCES := main.cpp + +include $(LEVEL)/Makefile.rules Index: test/tools/lldb-mi/stack/TestMiStack.py =================================================================== --- test/tools/lldb-mi/stack/TestMiStack.py +++ test/tools/lldb-mi/stack/TestMiStack.py @@ -1,5 +1,5 @@ """ -Test that the lldb-mi driver works with -stack-xxx commands +Test lldb-mi -stack-xxx commands. """ import lldbmi_testcase @@ -8,6 +8,8 @@ class MiStackTestCase(lldbmi_testcase.MiTestCaseBase): + mydir = TestBase.compute_mydir(__file__) + @lldbmi_test @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races @@ -60,13 +62,21 @@ self.expect("\^done") # Run to main - line = line_number('main.c', '//BP_localstest') - self.runCmd("-break-insert --file main.c:%d" % line) + self.runCmd("-break-insert -f main") self.expect("\^done,bkpt={number=\"1\"") self.runCmd("-exec-run") self.expect("\^running") self.expect("\*stopped,reason=\"breakpoint-hit\"") + # Test int local variables: + # Run to BP_local_int_test + line = line_number('main.cpp', '// BP_local_int_test') + self.runCmd("-break-insert --file main.cpp:%d" % line) + self.expect("\^done,bkpt={number=\"2\"") + self.runCmd("-exec-continue") + self.expect("\^running") + self.expect("\*stopped,reason=\"breakpoint-hit\"") + # Test -stack-list-locals: use 0 or --no-values self.runCmd("-stack-list-locals 0") self.expect("\^done,locals=\[name=\"a\",name=\"b\"\]") @@ -85,11 +95,11 @@ self.runCmd("-stack-list-locals --simple-values") self.expect("\^done,locals=\[{name=\"a\",value=\"10\"},{name=\"b\",value=\"20\"}\]") - # Test struct local variable - line = line_number('locals.c', '// BP_LOCAL_STRUCT') - self.runCmd("-break-insert --file locals.c:%d" % line) - self.expect("\^done,bkpt={number=\"2\"") - + # Test struct local variable: + # Run to BP_local_struct_test + line = line_number('main.cpp', '// BP_local_struct_test') + self.runCmd("-break-insert --file main.cpp:%d" % line) + self.expect("\^done,bkpt={number=\"3\"") self.runCmd("-exec-continue") self.expect("\^running") self.expect("\*stopped,reason=\"breakpoint-hit\"") @@ -112,11 +122,11 @@ self.runCmd("-stack-list-locals --simple-values") self.expect("\^done,locals=\[name=\"var_c\"\]") - # Test array local variable - line = line_number('locals.c', '// BP_LOCAL_ARRAY') - self.runCmd("-break-insert --file locals.c:%d" % line) - self.expect("\^done,bkpt={number=\"3\"") - + # Test array local variable: + # Run to BP_local_array_test + line = line_number('main.cpp', '// BP_local_array_test') + self.runCmd("-break-insert --file main.cpp:%d" % line) + self.expect("\^done,bkpt={number=\"4\"") self.runCmd("-exec-continue") self.expect("\^running") self.expect("\*stopped,reason=\"breakpoint-hit\"") @@ -139,11 +149,11 @@ self.runCmd("-stack-list-locals --simple-values") self.expect("\^done,locals=\[name=\"array\"\]") - # Test pointers as local variable - line = line_number('locals.c', '// BP_LOCAL_PTR') - self.runCmd("-break-insert --file locals.c:%d" % line) - self.expect("\^done,bkpt={number=\"4\"") - + # Test pointers as local variable: + # Run to BP_local_pointer_test + line = line_number('main.cpp', '// BP_local_pointer_test') + self.runCmd("-break-insert --file main.cpp:%d" % line) + self.expect("\^done,bkpt={number=\"5\"") self.runCmd("-exec-continue") self.expect("\^running") self.expect("\*stopped,reason=\"breakpoint-hit\"") @@ -216,7 +226,7 @@ # Test that -stack-info-frame works when program is running self.runCmd("-stack-info-frame") - self.expect("\^done,frame=\{level=\"0\",addr=\".+\",func=\"main\",file=\"main\.c\",fullname=\".*main\.c\",line=\"\d+\"\}") + self.expect("\^done,frame=\{level=\"0\",addr=\".+\",func=\"main\",file=\"main\.cpp\",fullname=\".*main\.cpp\",line=\"\d+\"\}") @lldbmi_test @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") @@ -240,7 +250,7 @@ # Test stack frame: get frame #0 info self.runCmd("-stack-list-frames 0 0") - self.expect("\^done,stack=\[frame=\{level=\"0\",addr=\".+\",func=\"main\",file=\"main\.c\",fullname=\".*main\.c\",line=\".+\"\}\]") + self.expect("\^done,stack=\[frame=\{level=\"0\",addr=\".+\",func=\"main\",file=\"main\.cpp\",fullname=\".*main\.cpp\",line=\".+\"\}\]") @lldbmi_test @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") @@ -272,7 +282,7 @@ # Test that current frame is #0 self.runCmd("-stack-info-frame") - self.expect("\^done,frame=\{level=\"0\",addr=\".+\",func=\"main\",file=\"main\.c\",fullname=\".*main\.c\",line=\"\d+\"\}") + self.expect("\^done,frame=\{level=\"0\",addr=\".+\",func=\"main\",file=\"main\.cpp\",fullname=\".*main\.cpp\",line=\"\d+\"\}") # Test that -stack-select-frame can select the selected frame self.runCmd("-stack-select-frame 0") @@ -280,7 +290,7 @@ # Test that current frame is still #0 self.runCmd("-stack-info-frame") - self.expect("\^done,frame=\{level=\"0\",addr=\".+\",func=\"main\",file=\"main\.c\",fullname=\".*main\.c\",line=\"\d+\"\}") + self.expect("\^done,frame=\{level=\"0\",addr=\".+\",func=\"main\",file=\"main\.cpp\",fullname=\".*main\.cpp\",line=\"\d+\"\}") # Test that -stack-select-frame can select frame #1 (parent frame) self.runCmd("-stack-select-frame 1") @@ -296,7 +306,7 @@ # Test that current frame is #0 and it has the same information self.runCmd("-stack-info-frame") - self.expect("\^done,frame=\{level=\"0\",addr=\".+\",func=\"main\",file=\"main\.c\",fullname=\".*main\.c\",line=\"\d+\"\}") + self.expect("\^done,frame=\{level=\"0\",addr=\".+\",func=\"main\",file=\"main\.cpp\",fullname=\".*main\.cpp\",line=\"\d+\"\}") if __name__ == '__main__': unittest2.main() Index: test/tools/lldb-mi/stack/main.cpp =================================================================== --- /dev/null +++ test/tools/lldb-mi/stack/main.cpp @@ -0,0 +1,66 @@ +//===-- main.cpp ------------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +struct inner +{ + int var_d; +}; + +struct my_type +{ + int var_a; + char var_b; + struct inner inner_; +}; + +int +local_int_test(void) +{ + int a = 10, b = 20; + return 0; // BP_local_int_test +} + +int +local_struct_test(void) +{ + struct my_type var_c; + var_c.var_a = 10; + var_c.var_b = 'a'; + var_c.inner_.var_d = 30; + return 0; // BP_local_struct_test +} + +int +local_array_test(void) +{ + int array[3]; + array[0] = 100; + array[1] = 200; + array[2] = 300; + return 0; // BP_local_array_test +} + +int +local_pointer_test(void) +{ + const char *test_str = "Rakaposhi"; + int var_e = 24; + int *ptr = &var_e; + return 0; // BP_local_pointer_test +} + +int +main(int argc, char const *argv[]) +{ + local_int_test(); + local_struct_test(); + local_array_test(); + local_pointer_test(); + return 0; +} Index: test/tools/lldb-mi/variable/Makefile =================================================================== --- /dev/null +++ test/tools/lldb-mi/variable/Makefile @@ -0,0 +1,5 @@ +LEVEL = ../../../make + +CXX_SOURCES := main.cpp + +include $(LEVEL)/Makefile.rules Index: test/tools/lldb-mi/variable/TestMiVar.py =================================================================== --- test/tools/lldb-mi/variable/TestMiVar.py +++ test/tools/lldb-mi/variable/TestMiVar.py @@ -1,12 +1,14 @@ """ -Test that the lldb-mi driver can evaluate expressions. +Test lldb-mi -var-xxx commands. """ import lldbmi_testcase from lldbtest import * import unittest2 -class MiEvaluateTestCase(lldbmi_testcase.MiTestCaseBase): +class MiVarTestCase(lldbmi_testcase.MiTestCaseBase): + + mydir = TestBase.compute_mydir(__file__) @lldbmi_test @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") @@ -21,9 +23,9 @@ self.runCmd("-file-exec-and-symbols %s" % self.myexe) self.expect("\^done") - # Run to program return (marked BP_source) - line = line_number('main.c', '//BP_source') - self.runCmd("-break-insert main.c:%d" % line) + # Run to program return + line = line_number('main.cpp', '// BP_return') + self.runCmd("-break-insert main.cpp:%d" % line) self.expect("\^done,bkpt={number=\"1\"") self.runCmd("-exec-run") self.expect("\^running") @@ -46,8 +48,8 @@ self.expect("\^done,status=\"editable\"") self.runCmd("-data-evaluate-expression \"g_MyVar=30\"") self.expect("\^done,value=\"30\"") - self.runCmd("-var-update var2") - #self.expect("name=\"var2\",value=\"30\"") #FIXME -var-update doesn't work + self.runCmd("-var-update --all-values var2") + #self.expect("\^done,changelist=\[\{name=\"var2\",value=\"30\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\}\]") #FIXME -var-update doesn't work self.runCmd("-var-delete var2") self.expect("\^done") self.runCmd("-var-create var2 * g_MyVar") @@ -64,8 +66,8 @@ self.expect("\^done,status=\"editable\"") self.runCmd("-data-evaluate-expression \"s_MyVar=3\"") self.expect("\^done,value=\"3\"") - self.runCmd("-var-update var3") - #self.expect("name=\"var3\",value=\"3\"") #FIXME -var-update doesn't work + self.runCmd("-var-update --all-values var3") + #self.expect("\^done,changelist=\[\{name=\"var3\",value=\"3\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\}\]") #FIXME -var-update doesn't work self.runCmd("-var-delete var3") self.expect("\^done") self.runCmd("-var-create var3 * s_MyVar") @@ -82,8 +84,8 @@ self.expect("\^done,status=\"editable\"") self.runCmd("-data-evaluate-expression \"b=2\"") self.expect("\^done,value=\"2\"") - self.runCmd("-var-update var4") - #self.expect("name=\"var4\",value=\"2\"") #FIXME -var-update doesn't work + self.runCmd("-var-update --all-values var4") + #self.expect("\^done,changelist=\[\{name=\"var4\",value=\"2\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\}\]") #FIXME -var-update doesn't work self.runCmd("-var-delete var4") self.expect("\^done") self.runCmd("-var-create var4 * b") Index: test/tools/lldb-mi/variable/main.cpp =================================================================== --- /dev/null +++ test/tools/lldb-mi/variable/main.cpp @@ -0,0 +1,19 @@ +//===-- main.cpp ------------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int g_MyVar = 3; +static int s_MyVar = 4; + +int +main(int argc, char const *argv[]) +{ + int a = 10, b = 20; + s_MyVar = a + b; + return 0; // BP_return +}