The architectures provided to skipIf / expectedFail are regular expressions (v. _match_decorator_property() in decorators.py so on Darwin systems "arm64" would match the skips for "arm" (32-bit Linux). Update these to "arm$" to prevent this, and also update three tests (TestBuiltinFormats.py, TestCrossDSOTailCalls.py, TestCrossObjectTailCalls.py) that were skipped for arm64 via this behavior, and need to be skipped or they will fail. This was moviated by the new TestDynamicValue.py test which has an expected-fail for arm, but the test was passing on arm64 Darwin resulting in failure for the CIs.
263 lines
8.9 KiB
Python
263 lines
8.9 KiB
Python
import re
|
|
|
|
import gdbremote_testcase
|
|
from lldbsuite.test.decorators import *
|
|
from lldbsuite.test.lldbtest import *
|
|
from lldbsuite.test import lldbutil
|
|
|
|
|
|
class TestSignal(gdbremote_testcase.GdbRemoteTestCaseBase):
|
|
def start_threads(self, num):
|
|
procs = self.prep_debug_monitor_and_inferior(inferior_args=[str(num)])
|
|
self.test_sequence.add_log_lines(
|
|
[
|
|
"read packet: $c#63",
|
|
{"direction": "send", "regex": "[$]T.*;reason:signal.*"},
|
|
],
|
|
True,
|
|
)
|
|
self.add_threadinfo_collection_packets()
|
|
|
|
context = self.expect_gdbremote_sequence()
|
|
self.assertIsNotNone(context)
|
|
threads = self.parse_threadinfo_packets(context)
|
|
self.assertIsNotNone(threads)
|
|
self.assertEqual(len(threads), num + 1)
|
|
|
|
self.reset_test_sequence()
|
|
return threads
|
|
|
|
SIGNAL_MATCH_RE = re.compile(r"received SIGUSR1 on thread id: ([0-9a-f]+)")
|
|
|
|
def send_and_check_signal(self, vCont_data, threads):
|
|
self.test_sequence.add_log_lines(
|
|
[
|
|
"read packet: $vCont;{0}#00".format(vCont_data),
|
|
"send packet: $W00#00",
|
|
],
|
|
True,
|
|
)
|
|
exp = self.expect_gdbremote_sequence()
|
|
self.reset_test_sequence()
|
|
tids = []
|
|
for line in exp["O_content"].decode().splitlines():
|
|
m = self.SIGNAL_MATCH_RE.match(line)
|
|
if m is not None:
|
|
tids.append(int(m.group(1), 16))
|
|
self.assertEqual(sorted(tids), sorted(threads))
|
|
|
|
def get_pid(self):
|
|
self.add_process_info_collection_packets()
|
|
context = self.expect_gdbremote_sequence()
|
|
self.assertIsNotNone(context)
|
|
procinfo = self.parse_process_info_response(context)
|
|
return int(procinfo["pid"], 16)
|
|
|
|
@skipIfWindows
|
|
@skipIfDarwin
|
|
@expectedFailureNetBSD
|
|
@expectedFailureAll(
|
|
oslist=["freebsd"], bugnumber="github.com/llvm/llvm-project/issues/56086"
|
|
)
|
|
@skipIfAsan # Times out under asan
|
|
@skipIf(oslist=["linux"], archs=["arm$", "aarch64"]) # Randomly fails on buildbot
|
|
def test_signal_process_without_tid(self):
|
|
self.build()
|
|
self.set_inferior_startup_launch()
|
|
|
|
threads = self.start_threads(1)
|
|
self.send_and_check_signal(
|
|
"C{0:x}".format(lldbutil.get_signal_number("SIGUSR1")), threads
|
|
)
|
|
|
|
@skipUnlessPlatform(["netbsd"])
|
|
@expectedFailureNetBSD
|
|
@skipIfAsan # Times out under asan
|
|
@skipIf(oslist=["linux"], archs=["arm$", "aarch64"]) # Randomly fails on buildbot
|
|
def test_signal_one_thread(self):
|
|
self.build()
|
|
self.set_inferior_startup_launch()
|
|
|
|
threads = self.start_threads(1)
|
|
# try sending a signal to one of the two threads
|
|
self.send_and_check_signal(
|
|
"C{0:x}:{1:x};c".format(lldbutil.get_signal_number("SIGUSR1")), threads[:1]
|
|
)
|
|
|
|
@skipIfWindows
|
|
@skipIfDarwin
|
|
@expectedFailureNetBSD
|
|
@expectedFailureAll(
|
|
oslist=["freebsd"], bugnumber="github.com/llvm/llvm-project/issues/56086"
|
|
)
|
|
@skipIfAsan # Times out under asan
|
|
@skipIf(oslist=["linux"], archs=["arm$", "aarch64"]) # Randomly fails on buildbot
|
|
def test_signal_all_threads(self):
|
|
self.build()
|
|
self.set_inferior_startup_launch()
|
|
|
|
threads = self.start_threads(1)
|
|
# try sending a signal to two threads (= the process)
|
|
self.send_and_check_signal(
|
|
"C{0:x}:{1:x};C{0:x}:{2:x}".format(
|
|
lldbutil.get_signal_number("SIGUSR1"), *threads
|
|
),
|
|
threads,
|
|
)
|
|
|
|
@skipIfWindows
|
|
@expectedFailureNetBSD
|
|
@expectedFailureAll(
|
|
oslist=["freebsd"], bugnumber="github.com/llvm/llvm-project/issues/56086"
|
|
)
|
|
@add_test_categories(["llgs"])
|
|
@skipIfAsan # Times out under asan
|
|
@skipIf(oslist=["linux"], archs=["arm$", "aarch64"]) # Randomly fails on buildbot
|
|
def test_signal_process_by_pid(self):
|
|
self.build()
|
|
self.set_inferior_startup_launch()
|
|
|
|
threads = self.start_threads(1)
|
|
self.send_and_check_signal(
|
|
"C{0:x}:p{1:x}".format(
|
|
lldbutil.get_signal_number("SIGUSR1"), self.get_pid()
|
|
),
|
|
threads,
|
|
)
|
|
|
|
@skipIfWindows
|
|
@expectedFailureNetBSD
|
|
@expectedFailureAll(
|
|
oslist=["freebsd"], bugnumber="github.com/llvm/llvm-project/issues/56086"
|
|
)
|
|
@add_test_categories(["llgs"])
|
|
@skipIfAsan # Times out under asan
|
|
@skipIf(oslist=["linux"], archs=["arm$", "aarch64"]) # Randomly fails on buildbot
|
|
def test_signal_process_minus_one(self):
|
|
self.build()
|
|
self.set_inferior_startup_launch()
|
|
|
|
threads = self.start_threads(1)
|
|
self.send_and_check_signal(
|
|
"C{0:x}:p-1".format(lldbutil.get_signal_number("SIGUSR1")), threads
|
|
)
|
|
|
|
@skipIfWindows
|
|
@expectedFailureNetBSD
|
|
@expectedFailureAll(
|
|
oslist=["freebsd"], bugnumber="github.com/llvm/llvm-project/issues/56086"
|
|
)
|
|
@add_test_categories(["llgs"])
|
|
@skipIf(oslist=["linux"], archs=["arm$", "aarch64"]) # Randomly fails on buildbot
|
|
def test_signal_minus_one(self):
|
|
self.build()
|
|
self.set_inferior_startup_launch()
|
|
|
|
threads = self.start_threads(1)
|
|
self.send_and_check_signal(
|
|
"C{0:x}:-1".format(lldbutil.get_signal_number("SIGUSR1")), threads
|
|
)
|
|
|
|
@skipIfWindows
|
|
@expectedFailureNetBSD
|
|
@expectedFailureAll(
|
|
oslist=["freebsd"], bugnumber="github.com/llvm/llvm-project/issues/56086"
|
|
)
|
|
@add_test_categories(["llgs"])
|
|
@skipIfAsan # Times out under asan
|
|
@skipIf(oslist=["linux"], archs=["arm$", "aarch64"]) # Randomly fails on buildbot
|
|
def test_signal_all_threads_by_pid(self):
|
|
self.build()
|
|
self.set_inferior_startup_launch()
|
|
|
|
threads = self.start_threads(1)
|
|
# try sending a signal to two threads (= the process)
|
|
self.send_and_check_signal(
|
|
"C{0:x}:p{1:x}.{2:x};C{0:x}:p{1:x}.{3:x}".format(
|
|
lldbutil.get_signal_number("SIGUSR1"), self.get_pid(), *threads
|
|
),
|
|
threads,
|
|
)
|
|
|
|
@skipIfWindows
|
|
@expectedFailureNetBSD
|
|
@expectedFailureAll(
|
|
oslist=["freebsd"], bugnumber="github.com/llvm/llvm-project/issues/56086"
|
|
)
|
|
@add_test_categories(["llgs"])
|
|
@skipIfAsan # Times out under asan
|
|
@skipIf(oslist=["linux"], archs=["arm$", "aarch64"]) # Randomly fails on buildbot
|
|
def test_signal_minus_one_by_pid(self):
|
|
self.build()
|
|
self.set_inferior_startup_launch()
|
|
|
|
threads = self.start_threads(1)
|
|
self.send_and_check_signal(
|
|
"C{0:x}:p{1:x}.-1".format(
|
|
lldbutil.get_signal_number("SIGUSR1"), self.get_pid()
|
|
),
|
|
threads,
|
|
)
|
|
|
|
@skipIfWindows
|
|
@expectedFailureNetBSD
|
|
@expectedFailureAll(
|
|
oslist=["freebsd"], bugnumber="github.com/llvm/llvm-project/issues/56086"
|
|
)
|
|
@add_test_categories(["llgs"])
|
|
@skipIfAsan # Times out under asan
|
|
@skipIf(oslist=["linux"], archs=["arm$", "aarch64"]) # Randomly fails on buildbot
|
|
def test_signal_minus_one_by_minus_one(self):
|
|
self.build()
|
|
self.set_inferior_startup_launch()
|
|
|
|
threads = self.start_threads(1)
|
|
self.send_and_check_signal(
|
|
"C{0:x}:p-1.-1".format(lldbutil.get_signal_number("SIGUSR1")), threads
|
|
)
|
|
|
|
@skipUnlessPlatform(["netbsd"])
|
|
@skipIf(oslist=["linux"], archs=["arm$", "aarch64"]) # Randomly fails on buildbot
|
|
def test_signal_two_of_three_threads(self):
|
|
self.build()
|
|
self.set_inferior_startup_launch()
|
|
|
|
threads = self.start_threads(2)
|
|
# try sending a signal to 2 out of 3 threads
|
|
self.test_sequence.add_log_lines(
|
|
[
|
|
"read packet: $vCont;C{0:x}:{1:x};C{0:x}:{2:x};c#00".format(
|
|
lldbutil.get_signal_number("SIGUSR1"), threads[1], threads[2]
|
|
),
|
|
{"direction": "send", "regex": r"^\$E1e#db$"},
|
|
],
|
|
True,
|
|
)
|
|
|
|
context = self.expect_gdbremote_sequence()
|
|
self.assertIsNotNone(context)
|
|
|
|
@skipUnlessPlatform(["netbsd"])
|
|
@skipIf(oslist=["linux"], archs=["arm$", "aarch64"]) # Randomly fails on buildbot
|
|
def test_signal_two_signals(self):
|
|
self.build()
|
|
self.set_inferior_startup_launch()
|
|
|
|
threads = self.start_threads(1)
|
|
# try sending two different signals to two threads
|
|
self.test_sequence.add_log_lines(
|
|
[
|
|
"read packet: $vCont;C{0:x}:{1:x};C{2:x}:{3:x}#00".format(
|
|
lldbutil.get_signal_number("SIGUSR1"),
|
|
threads[0],
|
|
lldbutil.get_signal_number("SIGUSR2"),
|
|
threads[1],
|
|
),
|
|
{"direction": "send", "regex": r"^\$E1e#db$"},
|
|
],
|
|
True,
|
|
)
|
|
|
|
context = self.expect_gdbremote_sequence()
|
|
self.assertIsNotNone(context)
|