diff options
author | Sam James <sam@gentoo.org> | 2023-04-12 07:25:18 +0100 |
---|---|---|
committer | Sam James <sam@gentoo.org> | 2023-04-12 07:26:08 +0100 |
commit | f5e0ac5711c94279073106adf04977cb07db37c7 (patch) | |
tree | 3f4f75fb36416044105de2f319158d2310d13fc0 /dev-util/rr | |
parent | dev-libs/cutlass: fix /dev/nvidiactl sandbox issues (diff) | |
download | gentoo-f5e0ac5711c94279073106adf04977cb07db37c7.tar.gz gentoo-f5e0ac5711c94279073106adf04977cb07db37c7.tar.bz2 gentoo-f5e0ac5711c94279073106adf04977cb07db37c7.zip |
dev-util/rr: backport gcc 13 workaround; add epoll_pwait2 support
Only really doing the epoll_pwait2 bit because it touches the same
files as the gcc 13 workaround.
Closes: https://bugs.gentoo.org/897874
Signed-off-by: Sam James <sam@gentoo.org>
Diffstat (limited to 'dev-util/rr')
-rw-r--r-- | dev-util/rr/files/rr-5.6.0-epoll_pwait2.patch | 78 | ||||
-rw-r--r-- | dev-util/rr/files/rr-5.6.0-gcc13-workaround.patch | 222 | ||||
-rw-r--r-- | dev-util/rr/rr-5.6.0-r3.ebuild | 89 |
3 files changed, 389 insertions, 0 deletions
diff --git a/dev-util/rr/files/rr-5.6.0-epoll_pwait2.patch b/dev-util/rr/files/rr-5.6.0-epoll_pwait2.patch new file mode 100644 index 000000000000..02d90d36e7dc --- /dev/null +++ b/dev-util/rr/files/rr-5.6.0-epoll_pwait2.patch @@ -0,0 +1,78 @@ +https://github.com/rr-debugger/rr/commit/7d1b31dd76d18e9e810455f4abd804e76b0a6c1f + +From 7d1b31dd76d18e9e810455f4abd804e76b0a6c1f Mon Sep 17 00:00:00 2001 +From: Robert O'Callahan <robert@ocallahan.org> +Date: Sun, 26 Mar 2023 23:52:44 +1300 +Subject: [PATCH] Support epoll_pwait2 + +Resolves #3462 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -933,6 +933,7 @@ set(BASIC_TESTS + epoll_edge + epoll_many + epoll_pwait_eintr_sigmask ++ epoll_pwait2 + eventfd + exec_flags + exec_no_env +--- a/src/record_syscall.cc ++++ b/src/record_syscall.cc +@@ -4841,6 +4841,7 @@ static Switchable rec_prepare_syscall_arch(RecordTask* t, + sizeof(typename Arch::epoll_event))); + return ALLOW_SWITCH; + ++ case Arch::epoll_pwait2: + case Arch::epoll_pwait: { + syscall_state.reg_parameter( + 2, ParamSize::from_syscall_result<int>(sizeof(typename Arch::epoll_event) * regs.arg3_signed(), +--- a/src/syscalls.py ++++ b/src/syscalls.py +@@ -1729,7 +1729,7 @@ def __init__(self, **kwargs): + openat2 = UnsupportedSyscall(x86=437, x64=437, generic=437) + pidfd_getfd = UnsupportedSyscall(x86=438, x64=438, generic=438) + process_madvise = UnsupportedSyscall(x86=440, x64=440, generic=440) +-epoll_pwait2 = UnsupportedSyscall(x86=441, x64=441, generic=441) ++epoll_pwait2 = IrregularEmulatedSyscall(x86=441, x64=441, generic=441) + mount_setattr = UnsupportedSyscall(x86=442, x64=442, generic=442) + quotactl_fd = UnsupportedSyscall(x86=443, x64=443, generic=443) + landlock_create_ruleset = UnsupportedSyscall(x86=444, x64=444, generic=444) +--- /dev/null ++++ b/src/test/epoll_pwait2.c +@@ -0,0 +1,35 @@ ++/* -*- Mode: C; tab-width: 8; c-basic-offset: 2; indent-tabs-mode: nil; -*- */ ++ ++#include "util.h" ++ ++static void handle_sig(__attribute__((unused)) int sig) { ++ /* Don't do anything, just go through the signal handler motions */ ++} ++ ++int main(void) { ++ int pipe_fd[2]; ++ int epfd; ++ struct timespec ts = { 5, 0 }; ++ struct epoll_event ev; ++ sigset_t sigmask; ++ sigemptyset(&sigmask); ++ sigaddset(&sigmask, SIGCHLD); ++ ++ signal(SIGALRM, handle_sig); ++ ++ test_assert(0 == pipe(pipe_fd)); ++ test_assert(0 <= (epfd = epoll_create(1 /*num events*/))); ++ ++ ev.events = EPOLLIN; ++ ev.data.fd = pipe_fd[0]; ++ test_assert(0 == epoll_ctl(epfd, EPOLL_CTL_ADD, ev.data.fd, &ev)); ++ ++ // Make sure something will wake us from the epoll_pwait2. ++ alarm(1); ++ // But also use the epoll_pwait to modify the signal mask. ++ epoll_pwait2(epfd, &ev, 1, &ts, &sigmask); ++ test_assert(errno == EINTR || errno == ENOSYS); ++ ++ atomic_puts("EXIT-SUCCESS"); ++ return 0; ++} + diff --git a/dev-util/rr/files/rr-5.6.0-gcc13-workaround.patch b/dev-util/rr/files/rr-5.6.0-gcc13-workaround.patch new file mode 100644 index 000000000000..30dad8d9fa20 --- /dev/null +++ b/dev-util/rr/files/rr-5.6.0-gcc13-workaround.patch @@ -0,0 +1,222 @@ +https://bugs.gentoo.org/897874 +https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109420 +https://github.com/rr-debugger/rr/issues/3485 +https://github.com/rr-debugger/rr/commit/e32502d00b18a5225d3b7fbab75fb1e63cb367d2 + +From e32502d00b18a5225d3b7fbab75fb1e63cb367d2 Mon Sep 17 00:00:00 2001 +From: Robert O'Callahan <robert@ocallahan.org> +Date: Wed, 5 Apr 2023 08:15:23 +1200 +Subject: [PATCH] Avoid having type members and enum members of `Arch` with the + same name + +Resolves #3485 +--- a/src/kernel_abi.h ++++ b/src/kernel_abi.h +@@ -1282,7 +1282,7 @@ struct BaseArch : public wordsize, + }; + RR_VERIFY_TYPE_EXPLICIT(struct ::timezone, timezone); + +- struct statfs { ++ struct statfs_t { + __statfs_word f_type; + __statfs_word f_bsize; + __statfs_word f_blocks; +@@ -1298,9 +1298,9 @@ struct BaseArch : public wordsize, + __statfs_word f_flags; + __statfs_word f_spare[4]; + }; +- RR_VERIFY_TYPE_EXPLICIT(struct ::statfs, statfs); ++ RR_VERIFY_TYPE_EXPLICIT(struct ::statfs, statfs_t); + +- struct statfs64 { ++ struct statfs64_t { + __statfs_word f_type; + __statfs_word f_bsize; + uint64_t f_blocks; +@@ -1316,7 +1316,7 @@ struct BaseArch : public wordsize, + __statfs_word f_flags; + __statfs_word f_spare[4]; + }; +- RR_VERIFY_TYPE_EXPLICIT(struct ::statfs64, statfs64); ++ RR_VERIFY_TYPE_EXPLICIT(struct ::statfs64, statfs64_t); + + struct itimerval { + timeval it_interval; +@@ -1338,7 +1338,7 @@ struct BaseArch : public wordsize, + } stack_t; + RR_VERIFY_TYPE(stack_t); + +- struct sysinfo { ++ struct sysinfo_t { + __kernel_long_t uptime; + __kernel_ulong_t loads[3]; + __kernel_ulong_t totalram; +@@ -1355,7 +1355,7 @@ struct BaseArch : public wordsize, + uint32_t mem_unit; + char _f[20 - 2 * sizeof(__kernel_ulong_t) - sizeof(uint32_t)]; + }; +- RR_VERIFY_TYPE_EXPLICIT(struct ::sysinfo, sysinfo); ++ RR_VERIFY_TYPE_EXPLICIT(struct ::sysinfo, sysinfo_t); + + static const ::size_t UTSNAME_LENGTH = 65; + struct utsname { +@@ -2093,7 +2093,7 @@ struct X64Arch : public BaseArch<SupportedArch::x86_64, WordSize64Defs> { + // Can't verify this one because glibc leaves out the last two members and the + // kernel header isn't available to userspace. + +- struct stat { ++ struct stat_t { + dev_t st_dev; + ino_t st_ino; + nlink_t st_nlink; +@@ -2110,10 +2110,10 @@ struct X64Arch : public BaseArch<SupportedArch::x86_64, WordSize64Defs> { + struct timespec st_ctim; + syscall_slong_t __rr_unused[3]; + }; +- RR_VERIFY_TYPE_ARCH(SupportedArch::x86_64, struct ::stat, struct stat); ++ RR_VERIFY_TYPE_ARCH(SupportedArch::x86_64, struct ::stat, struct stat_t); + +- struct stat64 : public stat {}; +- RR_VERIFY_TYPE_ARCH(SupportedArch::x86_64, struct ::stat64, struct stat64); ++ struct stat64_t : public stat_t {}; ++ RR_VERIFY_TYPE_ARCH(SupportedArch::x86_64, struct ::stat64, struct stat64_t); + + struct semid64_ds { + ipc64_perm sem_perm; +@@ -2291,7 +2291,7 @@ struct X86Arch : public BaseArch<SupportedArch::x86, WordSize32Defs> { + }; + RR_VERIFY_TYPE_X86_ARCH(SupportedArch::x86, ::user, user); + +- struct stat { ++ struct stat_t { + dev_t st_dev; + unsigned_short __pad1; + ino_t st_ino; +@@ -2310,9 +2310,9 @@ struct X86Arch : public BaseArch<SupportedArch::x86, WordSize32Defs> { + unsigned_long __unused4; + unsigned_long __unused5; + }; +- RR_VERIFY_TYPE_ARCH(SupportedArch::x86, struct ::stat, struct stat); ++ RR_VERIFY_TYPE_ARCH(SupportedArch::x86, struct ::stat, struct stat_t); + +- struct __attribute__((packed)) stat64 { ++ struct __attribute__((packed)) stat64_t { + dev_t st_dev; + unsigned_int __pad1; + ino_t __st_ino; +@@ -2330,7 +2330,7 @@ struct X86Arch : public BaseArch<SupportedArch::x86, WordSize32Defs> { + timespec st_ctim; + ino64_t st_ino; + }; +- RR_VERIFY_TYPE_ARCH(SupportedArch::x86, struct ::stat64, struct stat64); ++ RR_VERIFY_TYPE_ARCH(SupportedArch::x86, struct ::stat64, struct stat64_t); + + struct semid64_ds { + ipc64_perm sem_perm; +@@ -2377,7 +2377,7 @@ struct GenericArch : public BaseArch<arch_, wordsize> { + typedef uint32_t legacy_uid_t; + typedef uint32_t legacy_gid_t; + +- struct stat { ++ struct stat_t { + dev_t st_dev; + ino_t st_ino; + mode_t st_mode; +@@ -2405,7 +2405,7 @@ struct GenericArch : public BaseArch<arch_, wordsize> { + typename BaseArch<arch_, wordsize>::unsigned_long __unused4; + }; + +- struct stat64 : public stat {}; ++ struct stat64_t : public stat_t {}; + }; + + struct ARM64Arch : public GenericArch<SupportedArch::aarch64, WordSize64Defs> { +--- a/src/syscalls.py ++++ b/src/syscalls.py +@@ -544,7 +544,7 @@ def __init__(self, **kwargs): + # system. path is the pathname of any file within the mounted file + # system. buf is a pointer to a statfs structure defined + # approximately as follows: +-statfs = EmulatedSyscall(x86=99, x64=137, generic=43, arg2="struct Arch::statfs") ++statfs = EmulatedSyscall(x86=99, x64=137, generic=43, arg2="struct Arch::statfs_t") + + # int fstatfs(int fd, struct statfs *buf) + # +@@ -552,7 +552,7 @@ def __init__(self, **kwargs): + # system. path is the pathname of any file within the + # get_time(GET_TID(thread_id));mounted file system. buf is a pointer + # to a statfs structure defined approximately as follows: +-fstatfs = EmulatedSyscall(x86=100, x64=138, generic=44, arg2="struct Arch::statfs") ++fstatfs = EmulatedSyscall(x86=100, x64=138, generic=44, arg2="struct Arch::statfs_t") + + ioperm = EmulatedSyscall(x86=101, x64=173) + +@@ -574,9 +574,9 @@ def __init__(self, **kwargs): + # stored there. + setitimer = EmulatedSyscall(x86=104, x64=38, generic=103, arg3="typename Arch::itimerval") + getitimer = EmulatedSyscall(x86=105, x64=36, generic=102, arg2="typename Arch::itimerval") +-stat = EmulatedSyscall(x86=106, x64=4, arg2="struct Arch::stat") +-lstat = EmulatedSyscall(x86=107, x64=6, arg2="struct Arch::stat") +-fstat = EmulatedSyscall(x86=108, x64=5, generic=80, arg2="struct Arch::stat") ++stat = EmulatedSyscall(x86=106, x64=4, arg2="struct Arch::stat_t") ++lstat = EmulatedSyscall(x86=107, x64=6, arg2="struct Arch::stat_t") ++fstat = EmulatedSyscall(x86=108, x64=5, generic=80, arg2="struct Arch::stat_t") + olduname = UnsupportedSyscall(x86=109) + iopl = EmulatedSyscall(x86=110, x64=172) + vhangup = UnsupportedSyscall(x86=111, x64=153, generic=58) +@@ -596,7 +596,7 @@ def __init__(self, **kwargs): + # + # sysinfo() provides a simple way of getting overall system + # statistics. +-sysinfo = EmulatedSyscall(x86=116, x64=99, generic=179, arg1="struct Arch::sysinfo") ++sysinfo = EmulatedSyscall(x86=116, x64=99, generic=179, arg1="struct Arch::sysinfo_t") + # int ipc(unsigned int call, int first, int second, int third, void *ptr, long + #fifth); + # +@@ -992,20 +992,20 @@ def __init__(self, **kwargs): + # int stat(const char *path, struct stat *buf); + # + # stat() stats the file pointed to by path and fills in buf. +-stat64 = EmulatedSyscall(x86=195, arg2="struct Arch::stat64") ++stat64 = EmulatedSyscall(x86=195, arg2="struct Arch::stat64_t") + + # int lstat(const char *path, struct stat *buf); + # + # lstat() is identical to stat(), except that if path is a symbolic + # link, then the link itself is stat-ed, not the file that it refers + # to. +-lstat64 = EmulatedSyscall(x86=196, arg2="struct Arch::stat64") ++lstat64 = EmulatedSyscall(x86=196, arg2="struct Arch::stat64_t") + + # int fstat(int fd, struct stat *buf) + # + # fstat() is identical to stat(), except that the file to be stat-ed + # is specified by the file descriptor fd. +-fstat64 = EmulatedSyscall(x86=197, arg2="struct Arch::stat64") ++fstat64 = EmulatedSyscall(x86=197, arg2="struct Arch::stat64_t") + + lchown32 = EmulatedSyscall(x86=198) + +@@ -1342,8 +1342,8 @@ def __init__(self, **kwargs): + # + # FIXME: we use arg3() here, although according to man pages this system + # call has only 2 paramaters. However, strace tells another story... +-statfs64 = EmulatedSyscall(x86=268, arg3="struct Arch::statfs64") +-fstatfs64 = EmulatedSyscall(x86=269, arg3="struct Arch::statfs64") ++statfs64 = EmulatedSyscall(x86=268, arg3="struct Arch::statfs64_t") ++fstatfs64 = EmulatedSyscall(x86=269, arg3="struct Arch::statfs64_t") + + # int tgkill(int tgid, int tid, int sig) + # +@@ -1443,8 +1443,8 @@ def __init__(self, **kwargs): + # The fstatat() system call operates in exactly the same way as + # stat(2), except for the differences described in this manual + # page.... +-fstatat = EmulatedSyscall(x64=262, generic=79, arg3="struct Arch::stat") +-fstatat64 = EmulatedSyscall(x86=300, arg3="struct Arch::stat64") ++fstatat = EmulatedSyscall(x64=262, generic=79, arg3="struct Arch::stat_t") ++fstatat64 = EmulatedSyscall(x86=300, arg3="struct Arch::stat64_t") + + # int unlinkat(int dirfd, const char *pathname, int flags) + # + diff --git a/dev-util/rr/rr-5.6.0-r3.ebuild b/dev-util/rr/rr-5.6.0-r3.ebuild new file mode 100644 index 000000000000..bdd724733aaa --- /dev/null +++ b/dev-util/rr/rr-5.6.0-r3.ebuild @@ -0,0 +1,89 @@ +# Copyright 1999-2023 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +PYTHON_COMPAT=( python3_{9..11} ) +CMAKE_BUILD_TYPE=Release + +inherit cmake linux-info python-single-r1 + +DESCRIPTION="Record and Replay Framework" +HOMEPAGE="https://rr-project.org/" +SRC_URI="https://github.com/rr-debugger/${PN}/archive/${PV}.tar.gz -> mozilla-${P}.tar.gz" + +LICENSE="MIT BSD-2" +SLOT="0" +KEYWORDS="~amd64 ~x86" +IUSE="multilib test" +REQUIRED_USE="${PYTHON_REQUIRED_USE}" + +DEPEND=" + ${PYTHON_DEPS} + dev-libs/capnproto:= + sys-libs/zlib:= +" +RDEPEND=" + ${DEPEND} + sys-devel/gdb[xml] +" +# Add all the deps needed only at build/test time. +DEPEND+=" + test? ( + $(python_gen_cond_dep ' + dev-python/pexpect[${PYTHON_USEDEP}] + ') + sys-devel/gdb[xml] + )" + +QA_FLAGS_IGNORED=" + usr/lib.*/rr/librrpage.so + usr/lib.*/rr/librrpage_32.so +" + +RESTRICT="test" # toolchain and kernel version dependent + +PATCHES=( + "${FILESDIR}"/${P}-linux-headers-6.0.patch + "${FILESDIR}"/${P}-tests-clang16.patch + "${FILESDIR}"/${P}-gcc13.patch + "${FILESDIR}"/${P}-epoll_pwait2.patch + "${FILESDIR}"/${P}-gcc13-workaround.patch +) + +pkg_setup() { + if use kernel_linux; then + CONFIG_CHECK="SECCOMP" + linux-info_pkg_setup + fi + python-single-r1_pkg_setup +} + +src_prepare() { + cmake_src_prepare + + sed -i 's:-Werror::' CMakeLists.txt || die #609192 +} + +src_test() { + if has usersandbox ${FEATURES} ; then + ewarn "Test suite fails under FEATURES=usersandbox (bug #632394). Skipping." + return 0 + fi + + cmake_src_test +} + +src_configure() { + local mycmakeargs=( + -DBUILD_TESTS=$(usex test) + -Ddisable32bit=$(usex !multilib) #636786 + ) + + cmake_src_configure +} + +src_install() { + cmake_src_install + python_fix_shebang "${ED}"/usr/bin/rr-collect-symbols.py +} |