"""
Test lldb ability to unwind a stack with a function containing a call to the
'__builtin_trap' intrinsic, which GCC (4.6) encodes to an illegal opcode.
"""

import os
import unittest2
import lldb
from lldbtest import *
import lldbutil

class BuiltinTrapTestCase(TestBase):

    mydir = TestBase.compute_mydir(__file__)

    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
    @dsym_test
    def test_with_dsym_and_run_command(self):
        """Test that LLDB handles a function with __builtin_trap correctly."""
        self.buildDsym()
        self.builtin_trap_unwind()

    @dwarf_test
    @expectedFailureGcc # llvm.org/pr15936: LLDB is omits a function that contains an
                        #           illegal opcode from backtraces. This
                        #           failure is GCC 4.6 specific.
    def test_with_dwarf_and_run_command(self):
        """Test that LLDB handles a function with __builtin_trap correctly."""
        self.buildDwarf()
        self.builtin_trap_unwind()

    def setUp(self):
        # Call super's setUp().
        TestBase.setUp(self)
        # Find the line number to break at.
        self.line = line_number('main.cpp', '// Set break point at this line.')

    def builtin_trap_unwind(self):
        """Test that LLDB handles unwinding a frame that contains a function
           with a __builtin_trap intrinsic.
        """
        self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)

        lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line,
                                                 num_expected_locations=1,
                                                 loc_exact=True)

        self.runCmd("run", RUN_SUCCEEDED)

        # The stop reason of the thread should be breakpoint.
        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
            substrs = ['stopped',
                       'stop reason = breakpoint'])

        # print backtrace, expect both 'bar' and 'main' functions to be listed
        self.expect('bt', substrs = ['bar', 'main'])

        # go up one frame
        self.runCmd("up", RUN_SUCCEEDED)

        # evaluate a local
        self.expect('p foo', substrs = ['= 5'])



if __name__ == '__main__':
    import atexit
    lldb.SBDebugger.Initialize()
    atexit.register(lambda: lldb.SBDebugger.Terminate())
    unittest2.main()
