TestFunctionTypes.py revision 081137057abc6b2c32eb077bde7459f46544f7d8
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""Test variable with function ptr type and that break on the function works."""
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import os, time
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import unittest2
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import lldb
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from lldbtest import *
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FunctionTypesTestCase(TestBase):
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mydir = os.path.join("lang", "c", "function_types")
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def test_with_dsym(self):
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        """Test 'callback' has function ptr type, then break on the function."""
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        self.buildDsym()
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        self.function_types()
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def test_with_dwarf(self):
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        """Test 'callback' has function ptr type, then break on the function."""
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.buildDwarf()
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.function_types()
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    def test_pointers_with_dsym(self):
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        """Test that a function pointer to 'printf' works and can be called."""
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.buildDsym()
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.function_pointers()
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def test_pointers_with_dwarf(self):
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        """Test that a function pointer to 'printf' works and can be called."""
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.buildDwarf()
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.function_pointers()
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def setUp(self):
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        # Call super's setUp().
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TestBase.setUp(self)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        # Find the line number to break inside main().
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.line = line_number('main.c', '// Set break point at this line.')
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def runToBreakpoint(self):
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        exe = os.path.join(os.getcwd(), "a.out")
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        # Break inside the main.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.expect("breakpoint set -f main.c -l %d" % self.line,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    BREAKPOINT_CREATED,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    startstr = "Breakpoint created: 1: file ='main.c', line = %d, locations = 1" %
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    self.line)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.runCmd("run", RUN_SUCCEEDED)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        # The stop reason of the thread should be breakpoint.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    substrs = ['stopped',
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               'stop reason = breakpoint'])
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        # The breakpoint should have a hit count of 1.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    substrs = [' resolved, hit count = 1'])
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def function_types(self):
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        """Test 'callback' has function ptr type, then break on the function."""
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.runToBreakpoint()
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        # Check that the 'callback' variable display properly.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.expect("frame variable -T callback", VARIABLES_DISPLAYED_CORRECTLY,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            startstr = '(int (*)(const char *)) callback =')
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        # And that we can break on the callback function.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.runCmd("breakpoint set -n string_not_empty", BREAKPOINT_CREATED)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.runCmd("continue")
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        # Check that we do indeed stop on the string_not_empty function.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.expect("process status", STOPPED_DUE_TO_BREAKPOINT,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            substrs = ['a.out`string_not_empty',
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       'stop reason = breakpoint'])
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def function_pointers(self):
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        """Test that a function pointer to 'printf' works and can be called."""
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.runToBreakpoint()
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.expect("expr string_not_empty",
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    substrs = ['(int (*)(const char *)) $0 = ', '(a.out`'])
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if sys.platform.startswith("darwin"):
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            regexps = ['lib.*\.dylib`printf']
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else:
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            regexps = ['printf']
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.expect("expr (int (*)(const char*, ...))printf",
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    substrs = ['(int (*)(const char *, ...)) $1 = '],
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    patterns = regexps)
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        self.expect("expr $1(\"Hello world\\n\")",
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    startstr = '(int) $2 = 12')
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == '__main__':
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    import atexit
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    lldb.SBDebugger.Initialize()
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    atexit.register(lambda: lldb.SBDebugger.Terminate())
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unittest2.main()
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)