"""
Test that lldb can continue past a __builtin_debugtrap, but not a __builtin_trap
"""

import lldb
import lldbsuite.test.lldbutil as lldbutil
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *


class BuiltinDebugTrapTestCase(TestBase):
    NO_DEBUG_INFO_TESTCASE = True

    # Currently this depends on behavior in debugserver to
    # advance the pc past __builtin_trap instructions so that
    # continue works.  Everyone is in agreement that this
    # should be moved up into lldb instead of depending on the
    # remote stub rewriting the pc values.
    @skipUnlessDarwin
    def test(self):
        self.build()
        (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(
            self, "// Set a breakpoint here", lldb.SBFileSpec("main.cpp")
        )

        # Continue to __builtin_debugtrap()
        process.Continue()
        if self.TraceOn():
            self.runCmd("f")
            self.runCmd("bt")
            self.runCmd("ta v global")

        self.assertEqual(
            process.GetSelectedThread().GetStopReason(), lldb.eStopReasonException
        )

        list = target.FindGlobalVariables("global", 1, lldb.eMatchTypeNormal)
        self.assertEqual(list.GetSize(), 1)
        global_value = list.GetValueAtIndex(0)

        self.assertEqual(global_value.GetValueAsUnsigned(), 5)

        # Continue to the __builtin_trap() -- we should be able to
        # continue past __builtin_debugtrap.
        process.Continue()
        if self.TraceOn():
            self.runCmd("f")
            self.runCmd("bt")
            self.runCmd("ta v global")

        self.assertEqual(
            process.GetSelectedThread().GetStopReason(), lldb.eStopReasonException
        )

        # "global" is now 10.
        self.assertEqual(global_value.GetValueAsUnsigned(), 10)

        # We should be at the same point as before -- cannot advance
        # past a __builtin_trap().
        process.Continue()
        if self.TraceOn():
            self.runCmd("f")
            self.runCmd("bt")
            self.runCmd("ta v global")

        self.assertEqual(
            process.GetSelectedThread().GetStopReason(), lldb.eStopReasonException
        )

        # "global" is still 10.
        self.assertEqual(global_value.GetValueAsUnsigned(), 10)
