from lldbsuite.test import decorators

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


@requireNotWasm("checks the platform-specific TLS-uninitialized error, N/A to wasm")
class PlatformProcessCrashInfoTestCase(TestBase):
    @expectedFailureAll(oslist=["windows", "linux", "freebsd", "netbsd"])
    @skipIfDarwin  # rdar://120795095
    def test_thread_local(self):
        # Set a breakpoint on the first instruction of the main function,
        # before the TLS initialization has run.
        self.build()
        exe = self.getBuildArtifact("a.out")

        (target, process, _, _) = lldbutil.run_to_source_breakpoint(
            self, "Set breakpoint here", lldb.SBFileSpec("main.cpp")
        )
        self.expect_expr("tl_local_int + 1", result_type="int", result_value="323")
        self.expect_expr("*tl_local_ptr + 2", result_type="int", result_value="324")
        self.expect_expr("tl_global_int", result_type="int", result_value="123")
        self.expect_expr("*tl_global_ptr", result_type="int", result_value="45")

        # Create the filespec by which to locate our a.out module. Use the
        # absolute path to get the module for the current variant.
        filespec = lldb.SBFileSpec(exe, False)

        # Now see if we emit the correct error when the TLS is not yet
        # initialized. Let's set a breakpoint on the first instruction
        # of main.
        main_module = target.FindModule(filespec)
        self.assertTrue(main_module, VALID_MODULE)
        main_address = main_module.FindSymbol("main").GetStartAddress()
        main_bkpt = target.BreakpointCreateBySBAddress(main_address)

        process.Kill()
        lldbutil.run_to_breakpoint_do_run(self, target, main_bkpt)

        # The test fails during tear down because the module isn't cleared.
        # Even though this test case is marked as xfail, a failure during
        # tear down still counts as an error.
        main_module.Clear()

        self.expect(
            "expr tl_local_int",
            error=True,
            substrs=[
                "couldn't get the value of variable tl_local_int",
                "No TLS data currently exists for this thread",
            ],
        )
        self.expect(
            "expr *tl_local_ptr",
            error=True,
            substrs=[
                "couldn't get the value of variable tl_local_ptr",
                "No TLS data currently exists for this thread",
            ],
        )
