"""
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

    def test(self):
        platform_stop_reason = lldb.eStopReasonSignal
        platform = self.getPlatform()
        if self.platformIsDarwin() or platform == "windows":
            platform_stop_reason = lldb.eStopReasonException

        self.build()
        (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(
            self, "// Set a breakpoint here", lldb.SBFileSpec("main.c")
        )

        # 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(), platform_stop_reason
        )

        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(), platform_stop_reason
        )

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

        # Change the handling of SIGILL on Linux - do not pass it to the
        # inferior, but stop and notify lldb. If we don't do this, the
        # inferior will receive the SIGILL and be terminated. On x86_64,
        # __builtin_trap() emits UD2; on ARM it emits UDF — both generate
        # SIGILL. AArch64 uses BRK #1 (SIGTRAP, already suppressed by
        # default), so this is harmless there.
        if platform == "linux":
            self.runCmd("process handle -p false SIGILL")

        # 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(), platform_stop_reason
        )

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