Upgrade strace to 4.17.

Noteworthy changes in release 4.17 (2017-05-24)
===============================================

* Changes in command line syntax
  * Syscall classes specified in -e trace= option now have % prefix (like
    -e trace=%process).  Old style class names without leading % are still
    supported, but considered deprecated now.

* Improvements
  * Optimized syscall filtering.
  * Improved representation of timestamps.
  * Enhanced decoding of sched_setattr syscall.
  * Added -e trace=%stat option for tracing variants of stat syscall.
  * Added -e trace=%lstat option for tracing variants of lstat syscall.
  * Added -e trace=%fstat option for tracing variants of fstat and fstatat
    syscalls.
  * Added -e trace=%%stat option for tracing syscalls used for querying file
    status information (stat, lstat, fstat, fstatat, statx, and their
    variations).
  * Added -e trace=%statfs option for tracing statfs, statfs64 and statvfs
    syscalls.
  * Added -e trace=%fstatfs option for tracing fstatfs, fstatfs64 and fstatvfs
    syscalls.
  * Added -e trace=%%statfs option for tracing syscalls used for querying file
    system statistics information (statfs-like, fstatfs-like and ustat).
  * Added -e trace=/regex option for filtering syscalls using regular
    expressions.
  * Added support for prepending of question mark before syscall qualification
    in -e trace expressions in order to suppress error in case no syscalls
    matched the provided qualification.
  * Implemented decoding of signal mask in rt_sigreturn syscall on alpha, arc,
    arm, avr32, bfin, cris, hppa, m68k, metag, microblaze, mips, nios2, or1k,
    powerpc, powerpc64, riscv, sh, sh64, sparc, sparc64, tile, x86, and xtensa
    architectures.
  * Implemented decoding of statx syscall.
  * Implemented decoding of NS_* ioctl commands.
  * Implemented decoding of the remaining V4L2_BUF_TYPE_* types.
  * Implemented decoding of VIDIOC_[SG]_TUNER ioctl commands.
  * Implemented decoding of NLMSG_ERROR netlink messages.
  * Improved decoding of BPF_PROG_ATTACH command of bpf syscall.
  * Improved decoding of misplaced parts in DM_* ioctl commands.
  * Updated lists of ioctl commands from Linux 4.11.

* Bug fixes
  * Fixed decoding of flags argument of preadv2 and pwritev2 syscalls on x32.
  * Fixed the number of arguments and tracing flags of alpha specific syscalls.
  * Fixed decoding of old sigsuspend syscall on alpha, cris, mips, powerpc,
    powerpc64, sh, sh64, sparc, and sparc64.
  * Fixed decoding of sgetmask and ssetmask syscalls on 64-bit architectures.
  * Fixed decoding of netlink messages received within struct msghdr.
  * Worked around a bug in miscompiled aarch64 kernels leading to the 3rd
    argument of sched_getattr syscall being not quite 32-bit.
  * Fixed corner cases of printing inaccessible times argument of utimes
    and futimesat syscalls.

Bug: N/A
Test: strace date
Change-Id: Idc4614a3f16ffe57fdca2a07a05253900d1c52bb
diff --git a/tests/Makefile b/tests/Makefile
index 53b7a6c..f2071c4 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -17,6 +17,7 @@
 # Automake input for strace tests.
 #
 # Copyright (c) 2011-2016 Dmitry V. Levin <[email protected]>
+# Copyright (c) 2011-2017 The strace developers.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -131,148 +132,38 @@
 POST_UNINSTALL = :
 build_triplet = x86_64-pc-linux-gnu
 host_triplet = x86_64-pc-linux-gnu
-check_PROGRAMS = _newselect$(EXEEXT) accept$(EXEEXT) accept4$(EXEEXT) \
-	access$(EXEEXT) acct$(EXEEXT) add_key$(EXEEXT) \
-	adjtimex$(EXEEXT) aio$(EXEEXT) alarm$(EXEEXT) answer$(EXEEXT) \
-	attach-f-p$(EXEEXT) attach-f-p-cmd$(EXEEXT) \
-	attach-p-cmd-cmd$(EXEEXT) attach-p-cmd-p$(EXEEXT) bpf$(EXEEXT) \
-	brk$(EXEEXT) btrfs$(EXEEXT) caps$(EXEEXT) caps-abbrev$(EXEEXT) \
-	chmod$(EXEEXT) chown$(EXEEXT) chown32$(EXEEXT) chroot$(EXEEXT) \
-	clock_adjtime$(EXEEXT) clock_nanosleep$(EXEEXT) \
-	clock_xettime$(EXEEXT) copy_file_range$(EXEEXT) \
-	count-f$(EXEEXT) creat$(EXEEXT) delete_module$(EXEEXT) \
-	dup$(EXEEXT) dup2$(EXEEXT) dup3$(EXEEXT) epoll_create$(EXEEXT) \
-	epoll_create1$(EXEEXT) epoll_ctl$(EXEEXT) epoll_pwait$(EXEEXT) \
-	epoll_wait$(EXEEXT) erestartsys$(EXEEXT) eventfd$(EXEEXT) \
-	execve$(EXEEXT) execve-v$(EXEEXT) execveat$(EXEEXT) \
-	execveat-v$(EXEEXT) faccessat$(EXEEXT) fadvise64$(EXEEXT) \
-	fadvise64_64$(EXEEXT) fallocate$(EXEEXT) \
-	fanotify_init$(EXEEXT) fanotify_mark$(EXEEXT) fchdir$(EXEEXT) \
-	fchmod$(EXEEXT) fchmodat$(EXEEXT) fchown$(EXEEXT) \
-	fchown32$(EXEEXT) fchownat$(EXEEXT) fcntl$(EXEEXT) \
-	fcntl64$(EXEEXT) fdatasync$(EXEEXT) file_handle$(EXEEXT) \
-	file_ioctl$(EXEEXT) filter-unavailable$(EXEEXT) \
-	finit_module$(EXEEXT) flock$(EXEEXT) fork-f$(EXEEXT) \
-	fstat$(EXEEXT) fstat64$(EXEEXT) fstatat64$(EXEEXT) \
-	fstatfs$(EXEEXT) fstatfs64$(EXEEXT) fsync$(EXEEXT) \
-	ftruncate$(EXEEXT) ftruncate64$(EXEEXT) futex$(EXEEXT) \
-	futimesat$(EXEEXT) get_mempolicy$(EXEEXT) getcpu$(EXEEXT) \
-	getcwd$(EXEEXT) getdents$(EXEEXT) getdents64$(EXEEXT) \
-	getegid$(EXEEXT) getegid32$(EXEEXT) geteuid$(EXEEXT) \
-	geteuid32$(EXEEXT) getgid$(EXEEXT) getgid32$(EXEEXT) \
-	getgroups$(EXEEXT) getgroups32$(EXEEXT) getpeername$(EXEEXT) \
-	getpgrp$(EXEEXT) getrandom$(EXEEXT) getresgid$(EXEEXT) \
-	getresgid32$(EXEEXT) getresuid$(EXEEXT) getresuid32$(EXEEXT) \
-	getrlimit$(EXEEXT) getrusage$(EXEEXT) getsid$(EXEEXT) \
-	getsockname$(EXEEXT) getuid$(EXEEXT) getuid32$(EXEEXT) \
-	getxxid$(EXEEXT) inet-cmsg$(EXEEXT) init_module$(EXEEXT) \
-	inotify$(EXEEXT) inotify_init1$(EXEEXT) ioctl$(EXEEXT) \
-	ioctl_block$(EXEEXT) ioctl_dm$(EXEEXT) ioctl_dm-v$(EXEEXT) \
-	ioctl_evdev$(EXEEXT) ioctl_evdev-v$(EXEEXT) \
-	ioctl_loop$(EXEEXT) ioctl_loop-nv$(EXEEXT) \
-	ioctl_loop-v$(EXEEXT) ioctl_mtd$(EXEEXT) ioctl_rtc$(EXEEXT) \
-	ioctl_rtc-v$(EXEEXT) ioctl_scsi$(EXEEXT) \
-	ioctl_sg_io_v3$(EXEEXT) ioctl_sg_io_v4$(EXEEXT) \
-	ioctl_sock_gifconf$(EXEEXT) ioctl_uffdio$(EXEEXT) \
-	ioctl_v4l2$(EXEEXT) ioperm$(EXEEXT) iopl$(EXEEXT) \
-	ioprio$(EXEEXT) ip_mreq$(EXEEXT) ipc$(EXEEXT) ipc_msg$(EXEEXT) \
-	ipc_msgbuf$(EXEEXT) ipc_sem$(EXEEXT) ipc_shm$(EXEEXT) \
-	kcmp$(EXEEXT) kexec_file_load$(EXEEXT) kexec_load$(EXEEXT) \
-	keyctl$(EXEEXT) kill$(EXEEXT) ksysent$(EXEEXT) lchown$(EXEEXT) \
-	lchown32$(EXEEXT) link$(EXEEXT) linkat$(EXEEXT) \
-	llseek$(EXEEXT) lookup_dcookie$(EXEEXT) lseek$(EXEEXT) \
-	lstat$(EXEEXT) lstat64$(EXEEXT) mbind$(EXEEXT) \
-	membarrier$(EXEEXT) memfd_create$(EXEEXT) \
-	migrate_pages$(EXEEXT) mincore$(EXEEXT) mkdir$(EXEEXT) \
-	mkdirat$(EXEEXT) mknod$(EXEEXT) mknodat$(EXEEXT) \
-	mlock$(EXEEXT) mlock2$(EXEEXT) mlockall$(EXEEXT) mmap$(EXEEXT) \
-	mmap64$(EXEEXT) mmsg$(EXEEXT) mmsg-silent$(EXEEXT) \
-	mmsg_name$(EXEEXT) mmsg_name-v$(EXEEXT) mount$(EXEEXT) \
-	move_pages$(EXEEXT) mq$(EXEEXT) mq_sendrecv$(EXEEXT) \
-	mq_sendrecv-read$(EXEEXT) mq_sendrecv-write$(EXEEXT) \
-	msg_control$(EXEEXT) msg_control-v$(EXEEXT) msg_name$(EXEEXT) \
-	munlockall$(EXEEXT) nanosleep$(EXEEXT) \
-	net-accept-connect$(EXEEXT) net-icmp_filter$(EXEEXT) \
-	net-sockaddr$(EXEEXT) net-y-unix$(EXEEXT) net-yy-inet$(EXEEXT) \
-	net-yy-netlink$(EXEEXT) net-yy-unix$(EXEEXT) \
-	netlink_inet_diag$(EXEEXT) netlink_netlink_diag$(EXEEXT) \
-	netlink_protocol$(EXEEXT) netlink_unix_diag$(EXEEXT) \
-	newfstatat$(EXEEXT) nsyscalls$(EXEEXT) old_mmap$(EXEEXT) \
-	oldfstat$(EXEEXT) oldlstat$(EXEEXT) oldselect$(EXEEXT) \
-	oldstat$(EXEEXT) open$(EXEEXT) openat$(EXEEXT) pause$(EXEEXT) \
-	pc$(EXEEXT) perf_event_open$(EXEEXT) \
-	perf_event_open_nonverbose$(EXEEXT) \
-	perf_event_open_unabbrev$(EXEEXT) personality$(EXEEXT) \
-	pipe$(EXEEXT) pipe2$(EXEEXT) pkey_alloc$(EXEEXT) \
-	pkey_free$(EXEEXT) pkey_mprotect$(EXEEXT) poll$(EXEEXT) \
-	ppoll$(EXEEXT) prctl-arg2-intptr$(EXEEXT) \
-	prctl-dumpable$(EXEEXT) prctl-name$(EXEEXT) \
-	prctl-no-args$(EXEEXT) prctl-pdeathsig$(EXEEXT) \
-	prctl-seccomp-filter-v$(EXEEXT) prctl-seccomp-strict$(EXEEXT) \
-	prctl-securebits$(EXEEXT) prctl-tid_address$(EXEEXT) \
-	prctl-tsc$(EXEEXT) pread64-pwrite64$(EXEEXT) preadv$(EXEEXT) \
-	preadv-pwritev$(EXEEXT) preadv2-pwritev2$(EXEEXT) \
-	print_maxfd$(EXEEXT) printstr$(EXEEXT) prlimit64$(EXEEXT) \
-	process_vm_readv$(EXEEXT) process_vm_writev$(EXEEXT) \
-	pselect6$(EXEEXT) ptrace$(EXEEXT) pwritev$(EXEEXT) \
-	qual_fault$(EXEEXT) qual_inject-error-signal$(EXEEXT) \
-	qual_inject-retval$(EXEEXT) qual_inject-signal$(EXEEXT) \
-	qual_signal$(EXEEXT) quotactl$(EXEEXT) quotactl-v$(EXEEXT) \
-	quotactl-xfs$(EXEEXT) quotactl-xfs-v$(EXEEXT) \
-	read-write$(EXEEXT) readahead$(EXEEXT) readdir$(EXEEXT) \
-	readlink$(EXEEXT) readlinkat$(EXEEXT) readv$(EXEEXT) \
-	reboot$(EXEEXT) recvfrom$(EXEEXT) recvmmsg-timeout$(EXEEXT) \
-	recvmsg$(EXEEXT) redirect-fds$(EXEEXT) \
-	remap_file_pages$(EXEEXT) rename$(EXEEXT) renameat$(EXEEXT) \
-	renameat2$(EXEEXT) request_key$(EXEEXT) \
-	restart_syscall$(EXEEXT) rmdir$(EXEEXT) rt_sigpending$(EXEEXT) \
-	rt_sigprocmask$(EXEEXT) rt_sigqueueinfo$(EXEEXT) \
-	rt_sigsuspend$(EXEEXT) rt_sigtimedwait$(EXEEXT) \
-	rt_tgsigqueueinfo$(EXEEXT) sched_get_priority_mxx$(EXEEXT) \
-	sched_rr_get_interval$(EXEEXT) sched_xetaffinity$(EXEEXT) \
-	sched_xetattr$(EXEEXT) sched_xetparam$(EXEEXT) \
-	sched_xetscheduler$(EXEEXT) sched_yield$(EXEEXT) \
-	scm_rights$(EXEEXT) seccomp-filter$(EXEEXT) \
-	seccomp-filter-v$(EXEEXT) seccomp-strict$(EXEEXT) \
-	select$(EXEEXT) semop$(EXEEXT) sendfile$(EXEEXT) \
-	sendfile64$(EXEEXT) set_mempolicy$(EXEEXT) \
-	set_ptracer_any$(EXEEXT) setdomainname$(EXEEXT) \
-	setfsgid$(EXEEXT) setfsgid32$(EXEEXT) setfsuid$(EXEEXT) \
-	setfsuid32$(EXEEXT) setgid$(EXEEXT) setgid32$(EXEEXT) \
-	setgroups$(EXEEXT) setgroups32$(EXEEXT) sethostname$(EXEEXT) \
-	setns$(EXEEXT) setregid$(EXEEXT) setregid32$(EXEEXT) \
-	setresgid$(EXEEXT) setresgid32$(EXEEXT) setresuid$(EXEEXT) \
-	setresuid32$(EXEEXT) setreuid$(EXEEXT) setreuid32$(EXEEXT) \
-	setrlimit$(EXEEXT) setuid$(EXEEXT) setuid32$(EXEEXT) \
-	shmxt$(EXEEXT) shutdown$(EXEEXT) sigaction$(EXEEXT) \
-	sigaltstack$(EXEEXT) siginfo$(EXEEXT) signal_receive$(EXEEXT) \
-	signalfd4$(EXEEXT) sigreturn$(EXEEXT) sleep$(EXEEXT) \
-	socketcall$(EXEEXT) splice$(EXEEXT) stack-fcall$(EXEEXT) \
-	stat$(EXEEXT) stat64$(EXEEXT) statfs$(EXEEXT) \
-	statfs64$(EXEEXT) swap$(EXEEXT) symlink$(EXEEXT) \
-	symlinkat$(EXEEXT) sync$(EXEEXT) sync_file_range$(EXEEXT) \
-	sync_file_range2$(EXEEXT) sysinfo$(EXEEXT) syslog$(EXEEXT) \
-	tee$(EXEEXT) threads-execve$(EXEEXT) time$(EXEEXT) \
-	timer_create$(EXEEXT) timer_xettime$(EXEEXT) \
-	timerfd_xettime$(EXEEXT) times$(EXEEXT) times-fail$(EXEEXT) \
-	truncate$(EXEEXT) truncate64$(EXEEXT) ugetrlimit$(EXEEXT) \
-	uio$(EXEEXT) umask$(EXEEXT) umount$(EXEEXT) umount2$(EXEEXT) \
-	umoven-illptr$(EXEEXT) umovestr$(EXEEXT) \
-	umovestr-illptr$(EXEEXT) umovestr2$(EXEEXT) umovestr3$(EXEEXT) \
-	uname$(EXEEXT) unix-pair-send-recv$(EXEEXT) \
-	unix-pair-sendto-recvfrom$(EXEEXT) unlink$(EXEEXT) \
-	unlinkat$(EXEEXT) unshare$(EXEEXT) userfaultfd$(EXEEXT) \
-	ustat$(EXEEXT) utime$(EXEEXT) utimensat$(EXEEXT) \
-	utimes$(EXEEXT) vfork-f$(EXEEXT) vhangup$(EXEEXT) \
-	vmsplice$(EXEEXT) wait4$(EXEEXT) wait4-v$(EXEEXT) \
-	waitid$(EXEEXT) waitid-v$(EXEEXT) waitpid$(EXEEXT) \
-	xattr$(EXEEXT) xattr-strings$(EXEEXT) xet_robust_list$(EXEEXT) \
-	xetitimer$(EXEEXT) xetpgid$(EXEEXT) xetpriority$(EXEEXT) \
-	xettimeofday$(EXEEXT)
-TESTS = $(DECODER_TESTS) $(MISC_TESTS) $(am__EXEEXT_1)
-DIST_COMMON = $(srcdir)/../scno.am $(srcdir)/Makefile.in \
+DIST_COMMON = $(srcdir)/pure_executables.am $(srcdir)/gen_tests.am \
+	$(srcdir)/../scno.am $(srcdir)/Makefile.in \
 	$(srcdir)/Makefile.am $(top_srcdir)/depcomp \
 	$(top_srcdir)/test-driver
+check_PROGRAMS = $(am__EXEEXT_1) answer$(EXEEXT) attach-f-p$(EXEEXT) \
+	attach-f-p-cmd$(EXEEXT) attach-p-cmd-cmd$(EXEEXT) \
+	attach-p-cmd-p$(EXEEXT) caps-abbrev$(EXEEXT) count-f$(EXEEXT) \
+	execve-v$(EXEEXT) execveat-v$(EXEEXT) \
+	filter-unavailable$(EXEEXT) fork-f$(EXEEXT) getpid$(EXEEXT) \
+	getppid$(EXEEXT) gettid$(EXEEXT) int_0x80$(EXEEXT) \
+	ioctl_dm-v$(EXEEXT) ioctl_evdev-v$(EXEEXT) \
+	ioctl_loop-nv$(EXEEXT) ioctl_loop-v$(EXEEXT) \
+	ioctl_nsfs$(EXEEXT) ioctl_rtc-v$(EXEEXT) ksysent$(EXEEXT) \
+	mmsg-silent$(EXEEXT) mmsg_name-v$(EXEEXT) \
+	msg_control-v$(EXEEXT) net-accept-connect$(EXEEXT) \
+	netlink_inet_diag$(EXEEXT) netlink_netlink_diag$(EXEEXT) \
+	netlink_unix_diag$(EXEEXT) nsyscalls$(EXEEXT) pc$(EXEEXT) \
+	perf_event_open_nonverbose$(EXEEXT) \
+	perf_event_open_unabbrev$(EXEEXT) ppoll-v$(EXEEXT) \
+	prctl-seccomp-filter-v$(EXEEXT) prctl-seccomp-strict$(EXEEXT) \
+	print_maxfd$(EXEEXT) qual_fault$(EXEEXT) \
+	qual_inject-error-signal$(EXEEXT) qual_inject-retval$(EXEEXT) \
+	qual_inject-signal$(EXEEXT) qual_signal$(EXEEXT) \
+	quotactl-v$(EXEEXT) quotactl-xfs-v$(EXEEXT) \
+	redirect-fds$(EXEEXT) restart_syscall$(EXEEXT) \
+	scm_rights$(EXEEXT) seccomp-filter-v$(EXEEXT) \
+	seccomp-strict$(EXEEXT) set_ptracer_any$(EXEEXT) \
+	signal_receive$(EXEEXT) sleep$(EXEEXT) stack-fcall$(EXEEXT) \
+	threads-execve$(EXEEXT) unix-pair-send-recv$(EXEEXT) \
+	unix-pair-sendto-recvfrom$(EXEEXT) vfork-f$(EXEEXT) \
+	wait4-v$(EXEEXT) waitid-v$(EXEEXT)
+TESTS = $(GEN_TESTS) $(DECODER_TESTS) $(MISC_TESTS) $(am__EXEEXT_2)
 subdir = tests
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
@@ -300,6 +191,7 @@
 	libtests_a-error_msg.$(OBJEXT) \
 	libtests_a-fill_memory.$(OBJEXT) \
 	libtests_a-get_page_size.$(OBJEXT) \
+	libtests_a-get_sigset_size.$(OBJEXT) \
 	libtests_a-hexdump_strdup.$(OBJEXT) \
 	libtests_a-hexquote_strndup.$(OBJEXT) \
 	libtests_a-inode_of_sockfd.$(OBJEXT) \
@@ -308,10 +200,130 @@
 	libtests_a-overflowuid.$(OBJEXT) \
 	libtests_a-pipe_maxfd.$(OBJEXT) \
 	libtests_a-print_quoted_string.$(OBJEXT) \
+	libtests_a-print_time.$(OBJEXT) \
 	libtests_a-printflags.$(OBJEXT) libtests_a-printxval.$(OBJEXT) \
-	libtests_a-signal2name.$(OBJEXT) libtests_a-sprintrc.$(OBJEXT) \
-	libtests_a-tail_alloc.$(OBJEXT) libtests_a-tprintf.$(OBJEXT)
+	libtests_a-signal2name.$(OBJEXT) \
+	libtests_a-skip_unavailable.$(OBJEXT) \
+	libtests_a-sprintrc.$(OBJEXT) libtests_a-tail_alloc.$(OBJEXT) \
+	libtests_a-tprintf.$(OBJEXT)
 libtests_a_OBJECTS = $(am_libtests_a_OBJECTS)
+am__EXEEXT_1 = _newselect$(EXEEXT) accept$(EXEEXT) accept4$(EXEEXT) \
+	access$(EXEEXT) acct$(EXEEXT) add_key$(EXEEXT) \
+	adjtimex$(EXEEXT) aio$(EXEEXT) alarm$(EXEEXT) bpf$(EXEEXT) \
+	brk$(EXEEXT) btrfs$(EXEEXT) caps$(EXEEXT) chmod$(EXEEXT) \
+	chown$(EXEEXT) chown32$(EXEEXT) chroot$(EXEEXT) \
+	clock_adjtime$(EXEEXT) clock_nanosleep$(EXEEXT) \
+	clock_xettime$(EXEEXT) copy_file_range$(EXEEXT) creat$(EXEEXT) \
+	delete_module$(EXEEXT) dup$(EXEEXT) dup2$(EXEEXT) \
+	dup3$(EXEEXT) epoll_create$(EXEEXT) epoll_create1$(EXEEXT) \
+	epoll_ctl$(EXEEXT) epoll_pwait$(EXEEXT) epoll_wait$(EXEEXT) \
+	erestartsys$(EXEEXT) eventfd$(EXEEXT) execve$(EXEEXT) \
+	execveat$(EXEEXT) faccessat$(EXEEXT) fadvise64$(EXEEXT) \
+	fadvise64_64$(EXEEXT) fallocate$(EXEEXT) \
+	fanotify_init$(EXEEXT) fanotify_mark$(EXEEXT) fchdir$(EXEEXT) \
+	fchmod$(EXEEXT) fchmodat$(EXEEXT) fchown$(EXEEXT) \
+	fchown32$(EXEEXT) fchownat$(EXEEXT) fcntl$(EXEEXT) \
+	fcntl64$(EXEEXT) fdatasync$(EXEEXT) file_handle$(EXEEXT) \
+	file_ioctl$(EXEEXT) finit_module$(EXEEXT) flock$(EXEEXT) \
+	fstat$(EXEEXT) fstat64$(EXEEXT) fstatat64$(EXEEXT) \
+	fstatfs$(EXEEXT) fstatfs64$(EXEEXT) fsync$(EXEEXT) \
+	ftruncate$(EXEEXT) ftruncate64$(EXEEXT) futex$(EXEEXT) \
+	futimesat$(EXEEXT) get_mempolicy$(EXEEXT) getcpu$(EXEEXT) \
+	getcwd$(EXEEXT) getdents$(EXEEXT) getdents64$(EXEEXT) \
+	getegid$(EXEEXT) getegid32$(EXEEXT) geteuid$(EXEEXT) \
+	geteuid32$(EXEEXT) getgid$(EXEEXT) getgid32$(EXEEXT) \
+	getgroups$(EXEEXT) getgroups32$(EXEEXT) getpeername$(EXEEXT) \
+	getpgrp$(EXEEXT) getpid$(EXEEXT) getppid$(EXEEXT) \
+	getrandom$(EXEEXT) getresgid$(EXEEXT) getresgid32$(EXEEXT) \
+	getresuid$(EXEEXT) getresuid32$(EXEEXT) getrlimit$(EXEEXT) \
+	getrusage$(EXEEXT) getsid$(EXEEXT) getsockname$(EXEEXT) \
+	getuid$(EXEEXT) getuid32$(EXEEXT) getxxid$(EXEEXT) \
+	inet-cmsg$(EXEEXT) init_module$(EXEEXT) inotify$(EXEEXT) \
+	inotify_init1$(EXEEXT) ioctl$(EXEEXT) ioctl_block$(EXEEXT) \
+	ioctl_dm$(EXEEXT) ioctl_evdev$(EXEEXT) ioctl_loop$(EXEEXT) \
+	ioctl_mtd$(EXEEXT) ioctl_rtc$(EXEEXT) ioctl_scsi$(EXEEXT) \
+	ioctl_sg_io_v3$(EXEEXT) ioctl_sg_io_v4$(EXEEXT) \
+	ioctl_sock_gifconf$(EXEEXT) ioctl_uffdio$(EXEEXT) \
+	ioctl_v4l2$(EXEEXT) ioperm$(EXEEXT) iopl$(EXEEXT) \
+	ioprio$(EXEEXT) ip_mreq$(EXEEXT) ipc$(EXEEXT) ipc_msg$(EXEEXT) \
+	ipc_msgbuf$(EXEEXT) ipc_sem$(EXEEXT) ipc_shm$(EXEEXT) \
+	kcmp$(EXEEXT) kexec_file_load$(EXEEXT) kexec_load$(EXEEXT) \
+	keyctl$(EXEEXT) kill$(EXEEXT) lchown$(EXEEXT) \
+	lchown32$(EXEEXT) link$(EXEEXT) linkat$(EXEEXT) \
+	llseek$(EXEEXT) lookup_dcookie$(EXEEXT) lseek$(EXEEXT) \
+	lstat$(EXEEXT) lstat64$(EXEEXT) madvise$(EXEEXT) \
+	mbind$(EXEEXT) membarrier$(EXEEXT) memfd_create$(EXEEXT) \
+	migrate_pages$(EXEEXT) mincore$(EXEEXT) mkdir$(EXEEXT) \
+	mkdirat$(EXEEXT) mknod$(EXEEXT) mknodat$(EXEEXT) \
+	mlock$(EXEEXT) mlock2$(EXEEXT) mlockall$(EXEEXT) mmap$(EXEEXT) \
+	mmap64$(EXEEXT) mmsg$(EXEEXT) mmsg_name$(EXEEXT) \
+	mount$(EXEEXT) move_pages$(EXEEXT) mq$(EXEEXT) \
+	mq_sendrecv$(EXEEXT) mq_sendrecv-read$(EXEEXT) \
+	mq_sendrecv-write$(EXEEXT) msg_control$(EXEEXT) \
+	msg_name$(EXEEXT) munlockall$(EXEEXT) nanosleep$(EXEEXT) \
+	net-icmp_filter$(EXEEXT) net-sockaddr$(EXEEXT) \
+	net-y-unix$(EXEEXT) net-yy-inet$(EXEEXT) \
+	net-yy-netlink$(EXEEXT) net-yy-unix$(EXEEXT) \
+	netlink_protocol$(EXEEXT) newfstatat$(EXEEXT) \
+	old_mmap$(EXEEXT) oldfstat$(EXEEXT) oldlstat$(EXEEXT) \
+	oldselect$(EXEEXT) oldstat$(EXEEXT) open$(EXEEXT) \
+	openat$(EXEEXT) osf_utimes$(EXEEXT) pause$(EXEEXT) \
+	perf_event_open$(EXEEXT) personality$(EXEEXT) pipe$(EXEEXT) \
+	pipe2$(EXEEXT) pkey_alloc$(EXEEXT) pkey_free$(EXEEXT) \
+	pkey_mprotect$(EXEEXT) poll$(EXEEXT) ppoll$(EXEEXT) \
+	prctl-arg2-intptr$(EXEEXT) prctl-dumpable$(EXEEXT) \
+	prctl-name$(EXEEXT) prctl-no-args$(EXEEXT) \
+	prctl-pdeathsig$(EXEEXT) prctl-securebits$(EXEEXT) \
+	prctl-tid_address$(EXEEXT) prctl-tsc$(EXEEXT) \
+	pread64-pwrite64$(EXEEXT) preadv$(EXEEXT) \
+	preadv-pwritev$(EXEEXT) preadv2-pwritev2$(EXEEXT) \
+	printstr$(EXEEXT) prlimit64$(EXEEXT) process_vm_readv$(EXEEXT) \
+	process_vm_writev$(EXEEXT) pselect6$(EXEEXT) ptrace$(EXEEXT) \
+	pwritev$(EXEEXT) quotactl$(EXEEXT) quotactl-xfs$(EXEEXT) \
+	read-write$(EXEEXT) readahead$(EXEEXT) readdir$(EXEEXT) \
+	readlink$(EXEEXT) readlinkat$(EXEEXT) readv$(EXEEXT) \
+	reboot$(EXEEXT) recvfrom$(EXEEXT) recvmmsg-timeout$(EXEEXT) \
+	recvmsg$(EXEEXT) remap_file_pages$(EXEEXT) rename$(EXEEXT) \
+	renameat$(EXEEXT) renameat2$(EXEEXT) request_key$(EXEEXT) \
+	rmdir$(EXEEXT) rt_sigpending$(EXEEXT) rt_sigprocmask$(EXEEXT) \
+	rt_sigqueueinfo$(EXEEXT) rt_sigreturn$(EXEEXT) \
+	rt_sigsuspend$(EXEEXT) rt_sigtimedwait$(EXEEXT) \
+	rt_tgsigqueueinfo$(EXEEXT) sched_get_priority_mxx$(EXEEXT) \
+	sched_rr_get_interval$(EXEEXT) sched_xetaffinity$(EXEEXT) \
+	sched_xetattr$(EXEEXT) sched_xetparam$(EXEEXT) \
+	sched_xetscheduler$(EXEEXT) sched_yield$(EXEEXT) \
+	seccomp-filter$(EXEEXT) select$(EXEEXT) semop$(EXEEXT) \
+	sendfile$(EXEEXT) sendfile64$(EXEEXT) set_mempolicy$(EXEEXT) \
+	setdomainname$(EXEEXT) setfsgid$(EXEEXT) setfsgid32$(EXEEXT) \
+	setfsuid$(EXEEXT) setfsuid32$(EXEEXT) setgid$(EXEEXT) \
+	setgid32$(EXEEXT) setgroups$(EXEEXT) setgroups32$(EXEEXT) \
+	sethostname$(EXEEXT) setns$(EXEEXT) setregid$(EXEEXT) \
+	setregid32$(EXEEXT) setresgid$(EXEEXT) setresgid32$(EXEEXT) \
+	setresuid$(EXEEXT) setresuid32$(EXEEXT) setreuid$(EXEEXT) \
+	setreuid32$(EXEEXT) setrlimit$(EXEEXT) setuid$(EXEEXT) \
+	setuid32$(EXEEXT) shmxt$(EXEEXT) shutdown$(EXEEXT) \
+	sigaction$(EXEEXT) sigaltstack$(EXEEXT) siginfo$(EXEEXT) \
+	signalfd4$(EXEEXT) sigreturn$(EXEEXT) sigsuspend$(EXEEXT) \
+	socketcall$(EXEEXT) splice$(EXEEXT) stat$(EXEEXT) \
+	stat64$(EXEEXT) statfs$(EXEEXT) statfs64$(EXEEXT) \
+	statx$(EXEEXT) swap$(EXEEXT) sxetmask$(EXEEXT) \
+	symlink$(EXEEXT) symlinkat$(EXEEXT) sync$(EXEEXT) \
+	sync_file_range$(EXEEXT) sync_file_range2$(EXEEXT) \
+	sysinfo$(EXEEXT) syslog$(EXEEXT) tee$(EXEEXT) time$(EXEEXT) \
+	timer_create$(EXEEXT) timer_xettime$(EXEEXT) \
+	timerfd_xettime$(EXEEXT) times$(EXEEXT) times-fail$(EXEEXT) \
+	truncate$(EXEEXT) truncate64$(EXEEXT) ugetrlimit$(EXEEXT) \
+	uio$(EXEEXT) umask$(EXEEXT) umount$(EXEEXT) umount2$(EXEEXT) \
+	umoven-illptr$(EXEEXT) umovestr$(EXEEXT) \
+	umovestr-illptr$(EXEEXT) umovestr2$(EXEEXT) umovestr3$(EXEEXT) \
+	uname$(EXEEXT) unlink$(EXEEXT) unlinkat$(EXEEXT) \
+	unshare$(EXEEXT) userfaultfd$(EXEEXT) ustat$(EXEEXT) \
+	utime$(EXEEXT) utimensat$(EXEEXT) utimes$(EXEEXT) \
+	vhangup$(EXEEXT) vmsplice$(EXEEXT) wait4$(EXEEXT) \
+	waitid$(EXEEXT) waitpid$(EXEEXT) xattr$(EXEEXT) \
+	xattr-strings$(EXEEXT) xet_robust_list$(EXEEXT) \
+	xetitimer$(EXEEXT) xetpgid$(EXEEXT) xetpriority$(EXEEXT) \
+	xettimeofday$(EXEEXT)
 _newselect_SOURCES = _newselect.c
 _newselect_OBJECTS = _newselect.$(OBJEXT)
 _newselect_LDADD = $(LDADD)
@@ -668,6 +680,14 @@
 getpgrp_OBJECTS = getpgrp.$(OBJEXT)
 getpgrp_LDADD = $(LDADD)
 getpgrp_DEPENDENCIES = libtests.a
+getpid_SOURCES = getpid.c
+getpid_OBJECTS = getpid.$(OBJEXT)
+getpid_LDADD = $(LDADD)
+getpid_DEPENDENCIES = libtests.a
+getppid_SOURCES = getppid.c
+getppid_OBJECTS = getppid.$(OBJEXT)
+getppid_LDADD = $(LDADD)
+getppid_DEPENDENCIES = libtests.a
 getrandom_SOURCES = getrandom.c
 getrandom_OBJECTS = getrandom.$(OBJEXT)
 getrandom_LDADD = $(LDADD)
@@ -704,6 +724,10 @@
 getsockname_OBJECTS = getsockname.$(OBJEXT)
 getsockname_LDADD = $(LDADD)
 getsockname_DEPENDENCIES = libtests.a
+gettid_SOURCES = gettid.c
+gettid_OBJECTS = gettid.$(OBJEXT)
+gettid_LDADD = $(LDADD)
+gettid_DEPENDENCIES = libtests.a
 getuid_SOURCES = getuid.c
 getuid_OBJECTS = getuid.$(OBJEXT)
 getuid_LDADD = $(LDADD)
@@ -732,6 +756,10 @@
 inotify_init1_OBJECTS = inotify_init1.$(OBJEXT)
 inotify_init1_LDADD = $(LDADD)
 inotify_init1_DEPENDENCIES = libtests.a
+int_0x80_SOURCES = int_0x80.c
+int_0x80_OBJECTS = int_0x80.$(OBJEXT)
+int_0x80_LDADD = $(LDADD)
+int_0x80_DEPENDENCIES = libtests.a
 ioctl_SOURCES = ioctl.c
 ioctl_OBJECTS = ioctl.$(OBJEXT)
 ioctl_LDADD = $(LDADD)
@@ -772,6 +800,10 @@
 ioctl_mtd_OBJECTS = ioctl_mtd.$(OBJEXT)
 ioctl_mtd_LDADD = $(LDADD)
 ioctl_mtd_DEPENDENCIES = libtests.a
+ioctl_nsfs_SOURCES = ioctl_nsfs.c
+ioctl_nsfs_OBJECTS = ioctl_nsfs.$(OBJEXT)
+ioctl_nsfs_LDADD = $(LDADD)
+ioctl_nsfs_DEPENDENCIES = libtests.a
 ioctl_rtc_SOURCES = ioctl_rtc.c
 ioctl_rtc_OBJECTS = ioctl_rtc.$(OBJEXT)
 ioctl_rtc_LDADD = $(LDADD)
@@ -900,6 +932,10 @@
 lstat64_OBJECTS = lstat64-lstat64.$(OBJEXT)
 lstat64_LDADD = $(LDADD)
 lstat64_DEPENDENCIES = libtests.a
+madvise_SOURCES = madvise.c
+madvise_OBJECTS = madvise.$(OBJEXT)
+madvise_LDADD = $(LDADD)
+madvise_DEPENDENCIES = libtests.a
 mbind_SOURCES = mbind.c
 mbind_OBJECTS = mbind.$(OBJEXT)
 mbind_LDADD = $(LDADD)
@@ -1092,6 +1128,10 @@
 openat_OBJECTS = openat.$(OBJEXT)
 openat_LDADD = $(LDADD)
 openat_DEPENDENCIES = libtests.a
+osf_utimes_SOURCES = osf_utimes.c
+osf_utimes_OBJECTS = osf_utimes.$(OBJEXT)
+osf_utimes_LDADD = $(LDADD)
+osf_utimes_DEPENDENCIES = libtests.a
 pause_SOURCES = pause.c
 pause_OBJECTS = pause.$(OBJEXT)
 pause_LDADD = $(LDADD)
@@ -1145,6 +1185,10 @@
 ppoll_OBJECTS = ppoll.$(OBJEXT)
 ppoll_LDADD = $(LDADD)
 ppoll_DEPENDENCIES = libtests.a
+ppoll_v_SOURCES = ppoll-v.c
+ppoll_v_OBJECTS = ppoll-v.$(OBJEXT)
+ppoll_v_LDADD = $(LDADD)
+ppoll_v_DEPENDENCIES = libtests.a
 prctl_arg2_intptr_SOURCES = prctl-arg2-intptr.c
 prctl_arg2_intptr_OBJECTS = prctl-arg2-intptr.$(OBJEXT)
 prctl_arg2_intptr_LDADD = $(LDADD)
@@ -1354,6 +1398,10 @@
 rt_sigqueueinfo_OBJECTS = rt_sigqueueinfo.$(OBJEXT)
 rt_sigqueueinfo_LDADD = $(LDADD)
 rt_sigqueueinfo_DEPENDENCIES = libtests.a
+rt_sigreturn_SOURCES = rt_sigreturn.c
+rt_sigreturn_OBJECTS = rt_sigreturn.$(OBJEXT)
+rt_sigreturn_LDADD = $(LDADD)
+rt_sigreturn_DEPENDENCIES = libtests.a
 rt_sigsuspend_SOURCES = rt_sigsuspend.c
 rt_sigsuspend_OBJECTS = rt_sigsuspend.$(OBJEXT)
 rt_sigsuspend_LDADD = $(LDADD)
@@ -1554,6 +1602,10 @@
 sigreturn_OBJECTS = sigreturn.$(OBJEXT)
 sigreturn_LDADD = $(LDADD)
 sigreturn_DEPENDENCIES = libtests.a
+sigsuspend_SOURCES = sigsuspend.c
+sigsuspend_OBJECTS = sigsuspend.$(OBJEXT)
+sigsuspend_LDADD = $(LDADD)
+sigsuspend_DEPENDENCIES = libtests.a
 sleep_SOURCES = sleep.c
 sleep_OBJECTS = sleep.$(OBJEXT)
 sleep_LDADD = $(LDADD)
@@ -1588,10 +1640,18 @@
 statfs64_OBJECTS = statfs64.$(OBJEXT)
 statfs64_LDADD = $(LDADD)
 statfs64_DEPENDENCIES = libtests.a
+statx_SOURCES = statx.c
+statx_OBJECTS = statx.$(OBJEXT)
+statx_LDADD = $(LDADD)
+statx_DEPENDENCIES = libtests.a
 swap_SOURCES = swap.c
 swap_OBJECTS = swap.$(OBJEXT)
 swap_LDADD = $(LDADD)
 swap_DEPENDENCIES = libtests.a
+sxetmask_SOURCES = sxetmask.c
+sxetmask_OBJECTS = sxetmask.$(OBJEXT)
+sxetmask_LDADD = $(LDADD)
+sxetmask_DEPENDENCIES = libtests.a
 symlink_SOURCES = symlink.c
 symlink_OBJECTS = symlink.$(OBJEXT)
 symlink_LDADD = $(LDADD)
@@ -1853,35 +1913,36 @@
 	futex.c futimesat.c get_mempolicy.c getcpu.c getcwd.c \
 	getdents.c getdents64.c getegid.c getegid32.c geteuid.c \
 	geteuid32.c getgid.c getgid32.c getgroups.c getgroups32.c \
-	getpeername.c getpgrp.c getrandom.c getresgid.c getresgid32.c \
-	getresuid.c getresuid32.c getrlimit.c getrusage.c getsid.c \
-	getsockname.c getuid.c getuid32.c getxxid.c inet-cmsg.c \
-	init_module.c inotify.c inotify_init1.c ioctl.c ioctl_block.c \
+	getpeername.c getpgrp.c getpid.c getppid.c getrandom.c \
+	getresgid.c getresgid32.c getresuid.c getresuid32.c \
+	getrlimit.c getrusage.c getsid.c getsockname.c gettid.c \
+	getuid.c getuid32.c getxxid.c inet-cmsg.c init_module.c \
+	inotify.c inotify_init1.c int_0x80.c ioctl.c ioctl_block.c \
 	ioctl_dm.c ioctl_dm-v.c ioctl_evdev.c ioctl_evdev-v.c \
 	ioctl_loop.c ioctl_loop-nv.c ioctl_loop-v.c ioctl_mtd.c \
-	ioctl_rtc.c ioctl_rtc-v.c ioctl_scsi.c ioctl_sg_io_v3.c \
-	ioctl_sg_io_v4.c ioctl_sock_gifconf.c ioctl_uffdio.c \
-	ioctl_v4l2.c ioperm.c iopl.c ioprio.c ip_mreq.c ipc.c \
-	ipc_msg.c ipc_msgbuf.c ipc_sem.c ipc_shm.c kcmp.c \
+	ioctl_nsfs.c ioctl_rtc.c ioctl_rtc-v.c ioctl_scsi.c \
+	ioctl_sg_io_v3.c ioctl_sg_io_v4.c ioctl_sock_gifconf.c \
+	ioctl_uffdio.c ioctl_v4l2.c ioperm.c iopl.c ioprio.c ip_mreq.c \
+	ipc.c ipc_msg.c ipc_msgbuf.c ipc_sem.c ipc_shm.c kcmp.c \
 	kexec_file_load.c kexec_load.c keyctl.c kill.c ksysent.c \
 	lchown.c lchown32.c link.c linkat.c llseek.c lookup_dcookie.c \
-	lseek.c lstat.c lstat64.c mbind.c membarrier.c memfd_create.c \
-	migrate_pages.c mincore.c mkdir.c mkdirat.c mknod.c mknodat.c \
-	mlock.c mlock2.c mlockall.c mmap.c mmap64.c mmsg.c \
-	mmsg-silent.c mmsg_name.c mmsg_name-v.c mount.c move_pages.c \
-	mq.c mq_sendrecv.c mq_sendrecv-read.c mq_sendrecv-write.c \
-	msg_control.c msg_control-v.c msg_name.c munlockall.c \
-	nanosleep.c net-accept-connect.c net-icmp_filter.c \
-	net-sockaddr.c net-y-unix.c net-yy-inet.c net-yy-netlink.c \
-	net-yy-unix.c netlink_inet_diag.c netlink_netlink_diag.c \
-	netlink_protocol.c netlink_unix_diag.c newfstatat.c \
-	nsyscalls.c old_mmap.c oldfstat.c oldlstat.c oldselect.c \
-	oldstat.c open.c openat.c pause.c pc.c perf_event_open.c \
-	perf_event_open_nonverbose.c perf_event_open_unabbrev.c \
-	personality.c pipe.c pipe2.c pkey_alloc.c pkey_free.c \
-	pkey_mprotect.c poll.c ppoll.c prctl-arg2-intptr.c \
-	prctl-dumpable.c prctl-name.c prctl-no-args.c \
-	prctl-pdeathsig.c prctl-seccomp-filter-v.c \
+	lseek.c lstat.c lstat64.c madvise.c mbind.c membarrier.c \
+	memfd_create.c migrate_pages.c mincore.c mkdir.c mkdirat.c \
+	mknod.c mknodat.c mlock.c mlock2.c mlockall.c mmap.c mmap64.c \
+	mmsg.c mmsg-silent.c mmsg_name.c mmsg_name-v.c mount.c \
+	move_pages.c mq.c mq_sendrecv.c mq_sendrecv-read.c \
+	mq_sendrecv-write.c msg_control.c msg_control-v.c msg_name.c \
+	munlockall.c nanosleep.c net-accept-connect.c \
+	net-icmp_filter.c net-sockaddr.c net-y-unix.c net-yy-inet.c \
+	net-yy-netlink.c net-yy-unix.c netlink_inet_diag.c \
+	netlink_netlink_diag.c netlink_protocol.c netlink_unix_diag.c \
+	newfstatat.c nsyscalls.c old_mmap.c oldfstat.c oldlstat.c \
+	oldselect.c oldstat.c open.c openat.c osf_utimes.c pause.c \
+	pc.c perf_event_open.c perf_event_open_nonverbose.c \
+	perf_event_open_unabbrev.c personality.c pipe.c pipe2.c \
+	pkey_alloc.c pkey_free.c pkey_mprotect.c poll.c ppoll.c \
+	ppoll-v.c prctl-arg2-intptr.c prctl-dumpable.c prctl-name.c \
+	prctl-no-args.c prctl-pdeathsig.c prctl-seccomp-filter-v.c \
 	prctl-seccomp-strict.c prctl-securebits.c prctl-tid_address.c \
 	prctl-tsc.c pread64-pwrite64.c preadv.c preadv-pwritev.c \
 	preadv2-pwritev2.c print_maxfd.c printstr.c prlimit64.c \
@@ -1894,21 +1955,22 @@
 	redirect-fds.c remap_file_pages.c rename.c renameat.c \
 	renameat2.c request_key.c restart_syscall.c rmdir.c \
 	rt_sigpending.c rt_sigprocmask.c rt_sigqueueinfo.c \
-	rt_sigsuspend.c rt_sigtimedwait.c rt_tgsigqueueinfo.c \
-	sched_get_priority_mxx.c sched_rr_get_interval.c \
-	sched_xetaffinity.c sched_xetattr.c sched_xetparam.c \
-	sched_xetscheduler.c sched_yield.c scm_rights.c \
-	seccomp-filter.c seccomp-filter-v.c seccomp-strict.c select.c \
-	semop.c sendfile.c sendfile64.c set_mempolicy.c \
-	set_ptracer_any.c setdomainname.c setfsgid.c setfsgid32.c \
-	setfsuid.c setfsuid32.c setgid.c setgid32.c setgroups.c \
-	setgroups32.c sethostname.c setns.c setregid.c setregid32.c \
-	setresgid.c setresgid32.c setresuid.c setresuid32.c setreuid.c \
-	setreuid32.c setrlimit.c setuid.c setuid32.c shmxt.c \
-	shutdown.c sigaction.c sigaltstack.c siginfo.c \
-	signal_receive.c signalfd4.c sigreturn.c sleep.c socketcall.c \
-	splice.c $(stack_fcall_SOURCES) stat.c stat64.c statfs.c \
-	statfs64.c swap.c symlink.c symlinkat.c sync.c \
+	rt_sigreturn.c rt_sigsuspend.c rt_sigtimedwait.c \
+	rt_tgsigqueueinfo.c sched_get_priority_mxx.c \
+	sched_rr_get_interval.c sched_xetaffinity.c sched_xetattr.c \
+	sched_xetparam.c sched_xetscheduler.c sched_yield.c \
+	scm_rights.c seccomp-filter.c seccomp-filter-v.c \
+	seccomp-strict.c select.c semop.c sendfile.c sendfile64.c \
+	set_mempolicy.c set_ptracer_any.c setdomainname.c setfsgid.c \
+	setfsgid32.c setfsuid.c setfsuid32.c setgid.c setgid32.c \
+	setgroups.c setgroups32.c sethostname.c setns.c setregid.c \
+	setregid32.c setresgid.c setresgid32.c setresuid.c \
+	setresuid32.c setreuid.c setreuid32.c setrlimit.c setuid.c \
+	setuid32.c shmxt.c shutdown.c sigaction.c sigaltstack.c \
+	siginfo.c signal_receive.c signalfd4.c sigreturn.c \
+	sigsuspend.c sleep.c socketcall.c splice.c \
+	$(stack_fcall_SOURCES) stat.c stat64.c statfs.c statfs64.c \
+	statx.c swap.c sxetmask.c symlink.c symlinkat.c sync.c \
 	sync_file_range.c sync_file_range2.c sysinfo.c syslog.c tee.c \
 	threads-execve.c time.c timer_create.c timer_xettime.c \
 	timerfd_xettime.c times.c times-fail.c truncate.c truncate64.c \
@@ -1938,35 +2000,36 @@
 	futex.c futimesat.c get_mempolicy.c getcpu.c getcwd.c \
 	getdents.c getdents64.c getegid.c getegid32.c geteuid.c \
 	geteuid32.c getgid.c getgid32.c getgroups.c getgroups32.c \
-	getpeername.c getpgrp.c getrandom.c getresgid.c getresgid32.c \
-	getresuid.c getresuid32.c getrlimit.c getrusage.c getsid.c \
-	getsockname.c getuid.c getuid32.c getxxid.c inet-cmsg.c \
-	init_module.c inotify.c inotify_init1.c ioctl.c ioctl_block.c \
+	getpeername.c getpgrp.c getpid.c getppid.c getrandom.c \
+	getresgid.c getresgid32.c getresuid.c getresuid32.c \
+	getrlimit.c getrusage.c getsid.c getsockname.c gettid.c \
+	getuid.c getuid32.c getxxid.c inet-cmsg.c init_module.c \
+	inotify.c inotify_init1.c int_0x80.c ioctl.c ioctl_block.c \
 	ioctl_dm.c ioctl_dm-v.c ioctl_evdev.c ioctl_evdev-v.c \
 	ioctl_loop.c ioctl_loop-nv.c ioctl_loop-v.c ioctl_mtd.c \
-	ioctl_rtc.c ioctl_rtc-v.c ioctl_scsi.c ioctl_sg_io_v3.c \
-	ioctl_sg_io_v4.c ioctl_sock_gifconf.c ioctl_uffdio.c \
-	ioctl_v4l2.c ioperm.c iopl.c ioprio.c ip_mreq.c ipc.c \
-	ipc_msg.c ipc_msgbuf.c ipc_sem.c ipc_shm.c kcmp.c \
+	ioctl_nsfs.c ioctl_rtc.c ioctl_rtc-v.c ioctl_scsi.c \
+	ioctl_sg_io_v3.c ioctl_sg_io_v4.c ioctl_sock_gifconf.c \
+	ioctl_uffdio.c ioctl_v4l2.c ioperm.c iopl.c ioprio.c ip_mreq.c \
+	ipc.c ipc_msg.c ipc_msgbuf.c ipc_sem.c ipc_shm.c kcmp.c \
 	kexec_file_load.c kexec_load.c keyctl.c kill.c ksysent.c \
 	lchown.c lchown32.c link.c linkat.c llseek.c lookup_dcookie.c \
-	lseek.c lstat.c lstat64.c mbind.c membarrier.c memfd_create.c \
-	migrate_pages.c mincore.c mkdir.c mkdirat.c mknod.c mknodat.c \
-	mlock.c mlock2.c mlockall.c mmap.c mmap64.c mmsg.c \
-	mmsg-silent.c mmsg_name.c mmsg_name-v.c mount.c move_pages.c \
-	mq.c mq_sendrecv.c mq_sendrecv-read.c mq_sendrecv-write.c \
-	msg_control.c msg_control-v.c msg_name.c munlockall.c \
-	nanosleep.c net-accept-connect.c net-icmp_filter.c \
-	net-sockaddr.c net-y-unix.c net-yy-inet.c net-yy-netlink.c \
-	net-yy-unix.c netlink_inet_diag.c netlink_netlink_diag.c \
-	netlink_protocol.c netlink_unix_diag.c newfstatat.c \
-	nsyscalls.c old_mmap.c oldfstat.c oldlstat.c oldselect.c \
-	oldstat.c open.c openat.c pause.c pc.c perf_event_open.c \
-	perf_event_open_nonverbose.c perf_event_open_unabbrev.c \
-	personality.c pipe.c pipe2.c pkey_alloc.c pkey_free.c \
-	pkey_mprotect.c poll.c ppoll.c prctl-arg2-intptr.c \
-	prctl-dumpable.c prctl-name.c prctl-no-args.c \
-	prctl-pdeathsig.c prctl-seccomp-filter-v.c \
+	lseek.c lstat.c lstat64.c madvise.c mbind.c membarrier.c \
+	memfd_create.c migrate_pages.c mincore.c mkdir.c mkdirat.c \
+	mknod.c mknodat.c mlock.c mlock2.c mlockall.c mmap.c mmap64.c \
+	mmsg.c mmsg-silent.c mmsg_name.c mmsg_name-v.c mount.c \
+	move_pages.c mq.c mq_sendrecv.c mq_sendrecv-read.c \
+	mq_sendrecv-write.c msg_control.c msg_control-v.c msg_name.c \
+	munlockall.c nanosleep.c net-accept-connect.c \
+	net-icmp_filter.c net-sockaddr.c net-y-unix.c net-yy-inet.c \
+	net-yy-netlink.c net-yy-unix.c netlink_inet_diag.c \
+	netlink_netlink_diag.c netlink_protocol.c netlink_unix_diag.c \
+	newfstatat.c nsyscalls.c old_mmap.c oldfstat.c oldlstat.c \
+	oldselect.c oldstat.c open.c openat.c osf_utimes.c pause.c \
+	pc.c perf_event_open.c perf_event_open_nonverbose.c \
+	perf_event_open_unabbrev.c personality.c pipe.c pipe2.c \
+	pkey_alloc.c pkey_free.c pkey_mprotect.c poll.c ppoll.c \
+	ppoll-v.c prctl-arg2-intptr.c prctl-dumpable.c prctl-name.c \
+	prctl-no-args.c prctl-pdeathsig.c prctl-seccomp-filter-v.c \
 	prctl-seccomp-strict.c prctl-securebits.c prctl-tid_address.c \
 	prctl-tsc.c pread64-pwrite64.c preadv.c preadv-pwritev.c \
 	preadv2-pwritev2.c print_maxfd.c printstr.c prlimit64.c \
@@ -1979,21 +2042,22 @@
 	redirect-fds.c remap_file_pages.c rename.c renameat.c \
 	renameat2.c request_key.c restart_syscall.c rmdir.c \
 	rt_sigpending.c rt_sigprocmask.c rt_sigqueueinfo.c \
-	rt_sigsuspend.c rt_sigtimedwait.c rt_tgsigqueueinfo.c \
-	sched_get_priority_mxx.c sched_rr_get_interval.c \
-	sched_xetaffinity.c sched_xetattr.c sched_xetparam.c \
-	sched_xetscheduler.c sched_yield.c scm_rights.c \
-	seccomp-filter.c seccomp-filter-v.c seccomp-strict.c select.c \
-	semop.c sendfile.c sendfile64.c set_mempolicy.c \
-	set_ptracer_any.c setdomainname.c setfsgid.c setfsgid32.c \
-	setfsuid.c setfsuid32.c setgid.c setgid32.c setgroups.c \
-	setgroups32.c sethostname.c setns.c setregid.c setregid32.c \
-	setresgid.c setresgid32.c setresuid.c setresuid32.c setreuid.c \
-	setreuid32.c setrlimit.c setuid.c setuid32.c shmxt.c \
-	shutdown.c sigaction.c sigaltstack.c siginfo.c \
-	signal_receive.c signalfd4.c sigreturn.c sleep.c socketcall.c \
-	splice.c $(stack_fcall_SOURCES) stat.c stat64.c statfs.c \
-	statfs64.c swap.c symlink.c symlinkat.c sync.c \
+	rt_sigreturn.c rt_sigsuspend.c rt_sigtimedwait.c \
+	rt_tgsigqueueinfo.c sched_get_priority_mxx.c \
+	sched_rr_get_interval.c sched_xetaffinity.c sched_xetattr.c \
+	sched_xetparam.c sched_xetscheduler.c sched_yield.c \
+	scm_rights.c seccomp-filter.c seccomp-filter-v.c \
+	seccomp-strict.c select.c semop.c sendfile.c sendfile64.c \
+	set_mempolicy.c set_ptracer_any.c setdomainname.c setfsgid.c \
+	setfsgid32.c setfsuid.c setfsuid32.c setgid.c setgid32.c \
+	setgroups.c setgroups32.c sethostname.c setns.c setregid.c \
+	setregid32.c setresgid.c setresgid32.c setresuid.c \
+	setresuid32.c setreuid.c setreuid32.c setrlimit.c setuid.c \
+	setuid32.c shmxt.c shutdown.c sigaction.c sigaltstack.c \
+	siginfo.c signal_receive.c signalfd4.c sigreturn.c \
+	sigsuspend.c sleep.c socketcall.c splice.c \
+	$(stack_fcall_SOURCES) stat.c stat64.c statfs.c statfs64.c \
+	statx.c swap.c sxetmask.c symlink.c symlinkat.c sync.c \
 	sync_file_range.c sync_file_range2.c sysinfo.c syslog.c tee.c \
 	threads-execve.c time.c timer_create.c timer_xettime.c \
 	timerfd_xettime.c times.c times-fail.c truncate.c truncate64.c \
@@ -2214,7 +2278,7 @@
   bases=`echo $$bases`
 RECHECK_LOGS = $(TEST_LOGS)
 AM_RECURSIVE_TARGETS = check recheck
-#am__EXEEXT_1 = strace-k.test
+#am__EXEEXT_2 = strace-k.test
 TEST_SUITE_LOG = test-suite.log
 TEST_EXTENSIONS =  .test
 am__test_logs1 = $(TESTS:=.log)
@@ -2234,12 +2298,12 @@
       b='$*';; \
   esac
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = ${SHELL} /usr/local/google/home/enh/Downloads/strace-4.16/missing aclocal-1.14
+ACLOCAL = ${SHELL} /tmp/strace-4.17/missing aclocal-1.14
 AMTAR = $${TAR-tar}
 AM_DEFAULT_VERBOSITY = 1
-AUTOCONF = ${SHELL} /usr/local/google/home/enh/Downloads/strace-4.16/missing autoconf
-AUTOHEADER = ${SHELL} /usr/local/google/home/enh/Downloads/strace-4.16/missing autoheader
-AUTOMAKE = ${SHELL} /usr/local/google/home/enh/Downloads/strace-4.16/missing automake-1.14
+AUTOCONF = ${SHELL} /tmp/strace-4.17/missing autoconf
+AUTOHEADER = ${SHELL} /tmp/strace-4.17/missing autoheader
+AUTOMAKE = ${SHELL} /tmp/strace-4.17/missing automake-1.14
 AWK = gawk
 BUILD_EXEEXT = 
 BUILD_OBJEXT = 
@@ -2253,12 +2317,13 @@
 CODE_COVERAGE_CXXFLAGS = 
 CODE_COVERAGE_ENABLED = no
 CODE_COVERAGE_LDFLAGS = 
+COPYRIGHT_YEAR = 2017
 CPP = gcc -E
 CPPFLAGS = 
 CPPFLAGS_FOR_BUILD = 
 CPP_FOR_BUILD = gcc -E
 CYGPATH_W = echo
-DEB_CHANGELOGTIME = Wed, 15 Feb 2017 11:38:25 -0800
+DEB_CHANGELOGTIME = Thu, 25 May 2017 15:09:49 -0700
 DEFS = -DHAVE_CONFIG_H
 DEPDIR = .deps
 ECHO_C = 
@@ -2285,34 +2350,34 @@
 LIBS = 
 LTLIBOBJS = 
 MAINT = #
-MAKEINFO = ${SHELL} /usr/local/google/home/enh/Downloads/strace-4.16/missing makeinfo
+MAKEINFO = ${SHELL} /tmp/strace-4.17/missing makeinfo
 MIPS_ABI = 
 MKDIR_P = /bin/mkdir -p
 OBJEXT = o
 PACKAGE = strace
 PACKAGE_BUGREPORT = [email protected]
 PACKAGE_NAME = strace
-PACKAGE_STRING = strace 4.16
+PACKAGE_STRING = strace 4.17
 PACKAGE_TARNAME = strace
 PACKAGE_URL = https://strace.io
-PACKAGE_VERSION = 4.16
+PACKAGE_VERSION = 4.17
 PATH_SEPARATOR = :
 PERL = /usr/bin/perl
 RANLIB = ranlib
-RPM_CHANGELOGTIME = Wed Feb 15 2017
+RPM_CHANGELOGTIME = Thu May 25 2017
 SED = /bin/sed
 SET_MAKE = 
 SHELL = /bin/sh
 STRIP = 
 VALGRIND = valgrind
 VALGRIND_ENABLED = yes
-VERSION = 4.16
+VERSION = 4.17
 WARN_CFLAGS =  -Wall -Wempty-body -Wformat-security -Wignored-qualifiers -Winit-self -Wlogical-op -Wmissing-parameter-type -Wnested-externs -Wold-style-declaration -Wold-style-definition -Wsign-compare -Wtype-limits -Wwrite-strings
 WARN_CFLAGS_FOR_BUILD =  -Wall -Wempty-body -Wformat-security -Wignored-qualifiers -Winit-self -Wlogical-op -Wmissing-parameter-type -Wnested-externs -Wold-style-declaration -Wold-style-definition -Wsign-compare -Wtype-limits -Wwrite-strings
-abs_builddir = /usr/local/google/home/enh/Downloads/strace-4.16/tests
-abs_srcdir = /usr/local/google/home/enh/Downloads/strace-4.16/tests
-abs_top_builddir = /usr/local/google/home/enh/Downloads/strace-4.16
-abs_top_srcdir = /usr/local/google/home/enh/Downloads/strace-4.16
+abs_builddir = /tmp/strace-4.17/tests
+abs_srcdir = /tmp/strace-4.17/tests
+abs_top_builddir = /tmp/strace-4.17
+abs_top_srcdir = /tmp/strace-4.17
 ac_ct_CC = gcc
 ac_ct_CC_FOR_BUILD = gcc
 am__include = include
@@ -2344,7 +2409,7 @@
 htmldir = ${docdir}
 includedir = ${prefix}/include
 infodir = ${datarootdir}/info
-install_sh = ${SHELL} /usr/local/google/home/enh/Downloads/strace-4.16/install-sh
+install_sh = ${SHELL} /tmp/strace-4.17/install-sh
 libdir = ${exec_prefix}/lib
 libexecdir = ${exec_prefix}/libexec
 libunwind_CPPFLAGS = 
@@ -2389,6 +2454,7 @@
 	error_msg.c \
 	fill_memory.c \
 	get_page_size.c \
+	get_sigset_size.c \
 	hexdump_strdup.c \
 	hexquote_strndup.c \
 	inode_of_sockfd.c \
@@ -2397,9 +2463,11 @@
 	overflowuid.c \
 	pipe_maxfd.c \
 	print_quoted_string.c \
+	print_time.c \
 	printflags.c \
 	printxval.c \
 	signal2name.c \
+	skip_unavailable.c \
 	sprintrc.c \
 	tail_alloc.c \
 	tests.h \
@@ -2409,6 +2477,340 @@
 libtests_a_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
 check_LIBRARIES = libtests.a
 LDADD = libtests.a
+
+# Generated by ./tests/gen_pure_executables.sh from ./tests/pure_executables.list; do not edit.
+PURE_EXECUTABLES = \
+  _newselect \
+  accept \
+  accept4 \
+  access \
+  acct \
+  add_key \
+  adjtimex \
+  aio \
+  alarm \
+  bpf \
+  brk \
+  btrfs \
+  caps \
+  chmod \
+  chown \
+  chown32 \
+  chroot \
+  clock_adjtime \
+  clock_nanosleep \
+  clock_xettime \
+  copy_file_range \
+  creat \
+  delete_module \
+  dup \
+  dup2 \
+  dup3 \
+  epoll_create \
+  epoll_create1 \
+  epoll_ctl \
+  epoll_pwait \
+  epoll_wait \
+  erestartsys \
+  eventfd \
+  execve \
+  execveat \
+  faccessat \
+  fadvise64 \
+  fadvise64_64 \
+  fallocate \
+  fanotify_init \
+  fanotify_mark \
+  fchdir \
+  fchmod \
+  fchmodat \
+  fchown \
+  fchown32 \
+  fchownat \
+  fcntl \
+  fcntl64 \
+  fdatasync \
+  file_handle \
+  file_ioctl \
+  finit_module \
+  flock \
+  fstat \
+  fstat64 \
+  fstatat64 \
+  fstatfs \
+  fstatfs64 \
+  fsync \
+  ftruncate \
+  ftruncate64 \
+  futex \
+  futimesat \
+  get_mempolicy \
+  getcpu \
+  getcwd \
+  getdents \
+  getdents64 \
+  getegid \
+  getegid32 \
+  geteuid \
+  geteuid32 \
+  getgid \
+  getgid32 \
+  getgroups \
+  getgroups32 \
+  getpeername \
+  getpgrp \
+  getpid \
+  getppid \
+  getrandom \
+  getresgid \
+  getresgid32 \
+  getresuid \
+  getresuid32 \
+  getrlimit \
+  getrusage \
+  getsid \
+  getsockname \
+  getuid \
+  getuid32 \
+  getxxid \
+  inet-cmsg \
+  init_module \
+  inotify \
+  inotify_init1 \
+  ioctl \
+  ioctl_block \
+  ioctl_dm \
+  ioctl_evdev \
+  ioctl_loop \
+  ioctl_mtd \
+  ioctl_rtc \
+  ioctl_scsi \
+  ioctl_sg_io_v3 \
+  ioctl_sg_io_v4 \
+  ioctl_sock_gifconf \
+  ioctl_uffdio \
+  ioctl_v4l2 \
+  ioperm \
+  iopl \
+  ioprio \
+  ip_mreq \
+  ipc \
+  ipc_msg \
+  ipc_msgbuf \
+  ipc_sem \
+  ipc_shm \
+  kcmp \
+  kexec_file_load \
+  kexec_load \
+  keyctl \
+  kill \
+  lchown \
+  lchown32 \
+  link \
+  linkat \
+  llseek \
+  lookup_dcookie \
+  lseek \
+  lstat \
+  lstat64 \
+  madvise \
+  mbind \
+  membarrier \
+  memfd_create \
+  migrate_pages \
+  mincore \
+  mkdir \
+  mkdirat \
+  mknod \
+  mknodat \
+  mlock \
+  mlock2 \
+  mlockall \
+  mmap \
+  mmap64 \
+  mmsg \
+  mmsg_name \
+  mount \
+  move_pages \
+  mq \
+  mq_sendrecv \
+  mq_sendrecv-read \
+  mq_sendrecv-write \
+  msg_control \
+  msg_name \
+  munlockall \
+  nanosleep \
+  net-icmp_filter \
+  net-sockaddr \
+  net-y-unix \
+  net-yy-inet \
+  net-yy-netlink \
+  net-yy-unix \
+  netlink_protocol \
+  newfstatat \
+  old_mmap \
+  oldfstat \
+  oldlstat \
+  oldselect \
+  oldstat \
+  open \
+  openat \
+  osf_utimes \
+  pause \
+  perf_event_open \
+  personality \
+  pipe \
+  pipe2 \
+  pkey_alloc \
+  pkey_free \
+  pkey_mprotect \
+  poll \
+  ppoll \
+  prctl-arg2-intptr \
+  prctl-dumpable \
+  prctl-name \
+  prctl-no-args \
+  prctl-pdeathsig \
+  prctl-securebits \
+  prctl-tid_address \
+  prctl-tsc \
+  pread64-pwrite64 \
+  preadv \
+  preadv-pwritev \
+  preadv2-pwritev2 \
+  printstr \
+  prlimit64 \
+  process_vm_readv \
+  process_vm_writev \
+  pselect6 \
+  ptrace \
+  pwritev \
+  quotactl \
+  quotactl-xfs \
+  read-write \
+  readahead \
+  readdir \
+  readlink \
+  readlinkat \
+  readv \
+  reboot \
+  recvfrom \
+  recvmmsg-timeout \
+  recvmsg \
+  remap_file_pages \
+  rename \
+  renameat \
+  renameat2 \
+  request_key \
+  rmdir \
+  rt_sigpending \
+  rt_sigprocmask \
+  rt_sigqueueinfo \
+  rt_sigreturn \
+  rt_sigsuspend \
+  rt_sigtimedwait \
+  rt_tgsigqueueinfo \
+  sched_get_priority_mxx \
+  sched_rr_get_interval \
+  sched_xetaffinity \
+  sched_xetattr \
+  sched_xetparam \
+  sched_xetscheduler \
+  sched_yield \
+  seccomp-filter \
+  select \
+  semop \
+  sendfile \
+  sendfile64 \
+  set_mempolicy \
+  setdomainname \
+  setfsgid \
+  setfsgid32 \
+  setfsuid \
+  setfsuid32 \
+  setgid \
+  setgid32 \
+  setgroups \
+  setgroups32 \
+  sethostname \
+  setns \
+  setregid \
+  setregid32 \
+  setresgid \
+  setresgid32 \
+  setresuid \
+  setresuid32 \
+  setreuid \
+  setreuid32 \
+  setrlimit \
+  setuid \
+  setuid32 \
+  shmxt \
+  shutdown \
+  sigaction \
+  sigaltstack \
+  siginfo \
+  signalfd4 \
+  sigreturn \
+  sigsuspend \
+  socketcall \
+  splice \
+  stat \
+  stat64 \
+  statfs \
+  statfs64 \
+  statx \
+  swap \
+  sxetmask \
+  symlink \
+  symlinkat \
+  sync \
+  sync_file_range \
+  sync_file_range2 \
+  sysinfo \
+  syslog \
+  tee \
+  time \
+  timer_create \
+  timer_xettime \
+  timerfd_xettime \
+  times \
+  times-fail \
+  truncate \
+  truncate64 \
+  ugetrlimit \
+  uio \
+  umask \
+  umount \
+  umount2 \
+  umoven-illptr \
+  umovestr \
+  umovestr-illptr \
+  umovestr2 \
+  umovestr3 \
+  uname \
+  unlink \
+  unlinkat \
+  unshare \
+  userfaultfd \
+  ustat \
+  utime \
+  utimensat \
+  utimes \
+  vhangup \
+  vmsplice \
+  wait4 \
+  waitid \
+  waitpid \
+  xattr \
+  xattr-strings \
+  xet_robust_list \
+  xetitimer \
+  xetpgid \
+  xetpriority \
+  xettimeofday \
+  #
+
 attach_f_p_LDADD = -lrt -lpthread $(LDADD)
 clock_xettime_LDADD = -lrt $(LDADD)
 count_f_LDADD = -lpthread $(LDADD)
@@ -2437,209 +2839,159 @@
 stack_fcall_SOURCES = stack-fcall.c \
 	stack-fcall-0.c stack-fcall-1.c stack-fcall-2.c stack-fcall-3.c
 
+
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in; do not edit.
+GEN_TESTS = _newselect.gen.test accept.gen.test accept4.gen.test \
+	access.gen.test acct.gen.test add_key.gen.test \
+	adjtimex.gen.test aio.gen.test alarm.gen.test bpf.gen.test \
+	btrfs.gen.test chmod.gen.test chown.gen.test chown32.gen.test \
+	chroot.gen.test clock.gen.test clock_adjtime.gen.test \
+	clock_nanosleep.gen.test clock_xettime.gen.test \
+	copy_file_range.gen.test creat.gen.test delete_module.gen.test \
+	dup.gen.test dup2.gen.test dup3.gen.test epoll_create.gen.test \
+	epoll_create1.gen.test epoll_ctl.gen.test epoll_pwait.gen.test \
+	epoll_wait.gen.test erestartsys.gen.test execveat.gen.test \
+	execveat-v.gen.test faccessat.gen.test fadvise64_64.gen.test \
+	fallocate.gen.test fanotify_init.gen.test \
+	fanotify_mark.gen.test fchdir.gen.test fchmod.gen.test \
+	fchmodat.gen.test fchown.gen.test fchown32.gen.test \
+	fchownat.gen.test fcntl.gen.test fcntl64.gen.test \
+	fdatasync.gen.test file_handle.gen.test file_ioctl.gen.test \
+	finit_module.gen.test flock.gen.test fork-f.gen.test \
+	fstat.gen.test fstat64.gen.test fstatat64.gen.test \
+	fstatfs.gen.test fstatfs64.gen.test fsync.gen.test \
+	ftruncate.gen.test ftruncate64.gen.test futimesat.gen.test \
+	get_mempolicy.gen.test getcpu.gen.test getcwd.gen.test \
+	getdents.gen.test getdents64.gen.test getegid.gen.test \
+	getegid32.gen.test geteuid.gen.test geteuid32.gen.test \
+	getgid.gen.test getgid32.gen.test getgroups.gen.test \
+	getgroups32.gen.test getpeername.gen.test getpgrp.gen.test \
+	getpid.gen.test getppid.gen.test getrandom.gen.test \
+	getresgid.gen.test getresgid32.gen.test getresuid.gen.test \
+	getresuid32.gen.test getrlimit.gen.test getrusage.gen.test \
+	getsid.gen.test getsockname.gen.test gettid.gen.test \
+	getuid32.gen.test getxxid.gen.test inet-cmsg.gen.test \
+	init_module.gen.test inotify.gen.test inotify_init1.gen.test \
+	int_0x80.gen.test ioctl_block.gen.test ioctl_evdev.gen.test \
+	ioctl_evdev-v.gen.test ioctl_loop.gen.test \
+	ioctl_loop-v.gen.test ioctl_mtd.gen.test ioctl_rtc.gen.test \
+	ioctl_rtc-v.gen.test ioctl_scsi.gen.test \
+	ioctl_sg_io_v3.gen.test ioctl_sg_io_v4.gen.test \
+	ioctl_uffdio.gen.test ioctl_v4l2.gen.test ioperm.gen.test \
+	iopl.gen.test ioprio.gen.test ip_mreq.gen.test ipc.gen.test \
+	ipc_msg.gen.test ipc_sem.gen.test ipc_shm.gen.test \
+	kcmp.gen.test kexec_file_load.gen.test kexec_load.gen.test \
+	keyctl.gen.test kill.gen.test lchown.gen.test \
+	lchown32.gen.test link.gen.test linkat.gen.test \
+	lookup_dcookie.gen.test lstat.gen.test lstat64.gen.test \
+	madvise.gen.test mbind.gen.test membarrier.gen.test \
+	memfd_create.gen.test migrate_pages.gen.test mincore.gen.test \
+	mkdir.gen.test mkdirat.gen.test mknod.gen.test \
+	mknodat.gen.test mlock.gen.test mlock2.gen.test \
+	mlockall.gen.test mmap64.gen.test mmsg.gen.test \
+	mmsg-silent.gen.test mmsg_name.gen.test mmsg_name-v.gen.test \
+	mount.gen.test move_pages.gen.test mq.gen.test \
+	mq_sendrecv.gen.test mq_sendrecv-read.gen.test \
+	mq_sendrecv-write.gen.test msg_control.gen.test \
+	msg_control-v.gen.test msg_name.gen.test munlockall.gen.test \
+	nanosleep.gen.test net-icmp_filter.gen.test \
+	net-sockaddr.gen.test netlink_protocol.gen.test \
+	newfstatat.gen.test old_mmap.gen.test oldfstat.gen.test \
+	oldlstat.gen.test oldstat.gen.test open.gen.test \
+	openat.gen.test osf_utimes.gen.test pause.gen.test \
+	perf_event_open.gen.test perf_event_open_nonverbose.gen.test \
+	perf_event_open_unabbrev.gen.test pipe2.gen.test \
+	pkey_alloc.gen.test pkey_free.gen.test pkey_mprotect.gen.test \
+	ppoll.gen.test ppoll-v.gen.test pread64-pwrite64.gen.test \
+	preadv.gen.test preadv-pwritev.gen.test \
+	preadv2-pwritev2.gen.test printstr.gen.test prlimit64.gen.test \
+	process_vm_readv.gen.test process_vm_writev.gen.test \
+	pselect6.gen.test ptrace.gen.test pwritev.gen.test \
+	quotactl.gen.test quotactl-v.gen.test quotactl-xfs.gen.test \
+	quotactl-xfs-v.gen.test read-write.gen.test readahead.gen.test \
+	readdir.gen.test readlink.gen.test readlinkat.gen.test \
+	reboot.gen.test recvfrom.gen.test recvmmsg-timeout.gen.test \
+	recvmsg.gen.test regex.gen.test remap_file_pages.gen.test \
+	rename.gen.test renameat.gen.test renameat2.gen.test \
+	request_key.gen.test rmdir.gen.test rt_sigpending.gen.test \
+	rt_sigprocmask.gen.test rt_sigqueueinfo.gen.test \
+	rt_sigreturn.gen.test rt_sigsuspend.gen.test \
+	rt_sigtimedwait.gen.test rt_tgsigqueueinfo.gen.test \
+	sched.gen.test sched_get_priority_mxx.gen.test \
+	sched_rr_get_interval.gen.test sched_xetaffinity.gen.test \
+	sched_xetattr.gen.test sched_xetparam.gen.test \
+	sched_xetscheduler.gen.test sched_yield.gen.test \
+	seccomp-filter.gen.test seccomp-filter-v.gen.test \
+	select.gen.test semop.gen.test sendfile.gen.test \
+	sendfile64.gen.test set_mempolicy.gen.test \
+	setdomainname.gen.test setfsgid.gen.test setfsgid32.gen.test \
+	setfsuid.gen.test setfsuid32.gen.test setgid.gen.test \
+	setgid32.gen.test setgroups.gen.test setgroups32.gen.test \
+	sethostname.gen.test setns.gen.test setregid.gen.test \
+	setregid32.gen.test setresgid.gen.test setresgid32.gen.test \
+	setresuid.gen.test setresuid32.gen.test setreuid.gen.test \
+	setreuid32.gen.test setrlimit.gen.test setuid.gen.test \
+	setuid32.gen.test shmxt.gen.test shutdown.gen.test \
+	siginfo.gen.test signal_receive.gen.test signalfd4.gen.test \
+	sigreturn.gen.test sigsuspend.gen.test socketcall.gen.test \
+	splice.gen.test stat.gen.test stat64.gen.test statfs.gen.test \
+	statfs64.gen.test statx.gen.test swap.gen.test \
+	sxetmask.gen.test symlink.gen.test symlinkat.gen.test \
+	sync.gen.test sync_file_range.gen.test \
+	sync_file_range2.gen.test sysinfo.gen.test syslog.gen.test \
+	tee.gen.test time.gen.test timer_create.gen.test \
+	timer_xettime.gen.test timerfd_xettime.gen.test times.gen.test \
+	times-fail.gen.test trace_fstat.gen.test \
+	trace_fstatfs.gen.test trace_lstat.gen.test \
+	trace_question.gen.test trace_stat.gen.test \
+	trace_stat_like.gen.test trace_statfs.gen.test \
+	trace_statfs_like.gen.test truncate.gen.test \
+	truncate64.gen.test ugetrlimit.gen.test umask.gen.test \
+	umoven-illptr.gen.test umovestr-illptr.gen.test \
+	umovestr3.gen.test unlink.gen.test unlinkat.gen.test \
+	unshare.gen.test userfaultfd.gen.test ustat.gen.test \
+	utime.gen.test utimensat.gen.test utimes.gen.test \
+	vfork-f.gen.test vhangup.gen.test vmsplice.gen.test \
+	wait4.gen.test wait4-v.gen.test waitid.gen.test \
+	waitid-v.gen.test waitpid.gen.test xattr.gen.test \
+	xattr-strings.gen.test xet_robust_list.gen.test \
+	xetitimer.gen.test xetpgid.gen.test xetpriority.gen.test \
+	xettimeofday.gen.test
 LIBUNWIND_TESTS = 
 #LIBUNWIND_TESTS = strace-k.test
 DECODER_TESTS = \
-	_newselect.test \
-	accept.test \
-	accept4.test \
-	access.test \
-	acct.test \
-	add_key.test \
-	adjtimex.test \
-	aio.test \
-	alarm.test \
-	bpf.test \
 	brk.test \
 	btrfs-v.test \
 	btrfs-vw.test \
 	btrfs-w.test \
-	btrfs.test \
 	caps-abbrev.test \
 	caps.test \
-	chmod.test \
-	chown.test \
-	chown32.test \
-	chroot.test \
-	clock_adjtime.test \
-	clock_nanosleep.test \
-	clock_xettime.test \
-	copy_file_range.test \
-	creat.test \
-	delete_module.test \
-	dup.test \
-	dup2.test \
-	dup3.test \
-	epoll_create.test \
-	epoll_create1.test \
-	epoll_ctl.test \
-	epoll_pwait.test \
-	epoll_wait.test \
-	erestartsys.test \
 	eventfd.test \
 	execve-v.test \
 	execve.test \
-	execveat-v.test \
-	execveat.test \
-	faccessat.test \
 	fadvise64.test \
-	fadvise64_64.test \
-	fallocate.test \
-	fanotify_init.test \
-	fanotify_mark.test \
-	fchdir.test \
-	fchmod.test \
-	fchmodat.test \
-	fchown.test \
-	fchown32.test \
-	fchownat.test \
-	fcntl.test \
-	fcntl64.test \
-	fdatasync.test \
-	file_handle.test \
-	file_ioctl.test \
-	finit_module.test \
-	flock.test \
-	fstat.test \
-	fstat64.test \
-	fstatat64.test \
-	fstatfs.test \
-	fstatfs64.test \
-	fsync.test \
-	ftruncate.test \
-	ftruncate64.test \
 	futex.test \
-	futimesat.test \
-	get_mempolicy.test \
-	getcpu.test \
-	getcwd.test \
-	getdents.test \
-	getdents64.test \
-	getegid.test \
-	getegid32.test \
-	geteuid.test \
-	geteuid32.test \
-	getgid.test \
-	getgid32.test \
-	getgroups.test \
-	getgroups32.test \
-	getpeername.test \
-	getpgrp.test \
-	getrandom.test \
-	getresgid.test \
-	getresgid32.test \
-	getresuid.test \
-	getresuid32.test \
-	getrlimit.test \
-	getrusage.test \
-	getsid.test \
-	getsockname.test \
 	getuid.test \
-	getuid32.test \
-	getxxid.test \
-	inet-cmsg.test \
-	init_module.test \
-	inotify.test \
-	inotify_init1.test \
 	ioctl.test \
-	ioctl_block.test \
 	ioctl_dm-v.test \
 	ioctl_dm.test \
-	ioctl_evdev-v.test \
-	ioctl_evdev.test \
 	ioctl_loop-nv.test \
-	ioctl_loop-v.test \
-	ioctl_loop.test \
-	ioctl_mtd.test \
-	ioctl_rtc-v.test \
-	ioctl_rtc.test \
-	ioctl_scsi.test \
-	ioctl_sg_io_v3.test \
-	ioctl_sg_io_v4.test \
+	ioctl_nsfs.test \
 	ioctl_sock_gifconf.test \
-	ioctl_uffdio.test \
-	ioctl_v4l2.test \
-	ioperm.test \
-	iopl.test \
-	ioprio.test \
-	ip_mreq.test \
-	ipc.test \
-	ipc_msg.test \
 	ipc_msgbuf.test \
-	ipc_sem.test \
-	ipc_shm.test \
-	kcmp.test \
-	kexec_file_load.test \
-	kexec_load.test \
-	keyctl.test \
-	kill.test \
-	lchown.test \
-	lchown32.test \
-	link.test \
-	linkat.test \
 	llseek.test \
-	lookup_dcookie.test \
 	lseek.test \
-	lstat.test \
-	lstat64.test \
-	mbind.test \
-	membarrier.test \
-	memfd_create.test \
-	migrate_pages.test \
-	mincore.test \
-	mkdir.test \
-	mkdirat.test \
-	mknod.test \
-	mknodat.test \
-	mlock.test \
-	mlock2.test \
-	mlockall.test \
 	mmap.test \
-	mmap64.test \
-	mmsg-silent.test \
-	mmsg.test \
-	mmsg_name-v.test \
-	mmsg_name.test \
-	mount.test \
-	move_pages.test \
-	mq.test \
-	mq_sendrecv-read.test \
-	mq_sendrecv-write.test \
-	mq_sendrecv.test \
-	msg_control-v.test \
-	msg_control.test \
-	msg_name.test \
-	munlockall.test \
-	nanosleep.test \
-	net-icmp_filter.test \
-	net-sockaddr.test \
 	net-y-unix.test \
 	net-yy-inet.test \
 	net-yy-netlink.test \
 	net-yy-unix.test \
 	net.test \
-	netlink_protocol.test \
-	newfstatat.test \
 	nsyscalls.test \
-	old_mmap.test \
-	oldfstat.test \
-	oldlstat.test \
 	oldselect.test \
-	oldstat.test \
-	open.test \
-	openat.test \
-	pause.test \
-	perf_event_open.test \
-	perf_event_open_nonverbose.test \
-	perf_event_open_unabbrev.test \
 	personality.test \
 	pipe.test \
-	pipe2.test \
-	pkey_alloc.test \
-	pkey_free.test \
-	pkey_mprotect.test \
 	poll.test \
-	ppoll.test \
 	prctl-arg2-intptr.test \
 	prctl-dumpable.test \
 	prctl-name.test \
@@ -2650,148 +3002,21 @@
 	prctl-securebits.test \
 	prctl-tid_address.test \
 	prctl-tsc.test \
-	pread64-pwrite64.test \
-	preadv-pwritev.test \
-	preadv.test \
-	preadv2-pwritev2.test \
-	printstr.test \
-	prlimit64.test \
-	process_vm_readv.test \
-	process_vm_writev.test \
-	pselect6.test \
-	ptrace.test \
-	pwritev.test \
 	qual_fault-exit_group.test \
-	quotactl-v.test \
-	quotactl-xfs-v.test \
-	quotactl-xfs.test \
-	quotactl.test \
-	read-write.test \
-	readahead.test \
-	readdir.test \
-	readlink.test \
-	readlinkat.test \
 	readv.test \
-	reboot.test \
-	recvfrom.test \
-	recvmmsg-timeout.test \
-	recvmsg.test \
-	remap_file_pages.test \
-	rename.test \
-	renameat.test \
-	renameat2.test \
-	request_key.test \
-	rmdir.test \
-	rt_sigpending.test \
-	rt_sigprocmask.test \
-	rt_sigqueueinfo.test \
-	rt_sigsuspend.test \
-	rt_sigtimedwait.test \
-	rt_tgsigqueueinfo.test \
-	sched_get_priority_mxx.test \
-	sched_rr_get_interval.test \
-	sched_xetaffinity.test \
-	sched_xetattr.test \
-	sched_xetparam.test \
-	sched_xetscheduler.test \
-	sched_yield.test \
 	scm_rights-fd.test \
-	seccomp-filter-v.test \
-	seccomp-filter.test \
 	seccomp-strict.test \
-	select.test \
-	semop.test \
-	sendfile.test \
-	sendfile64.test \
-	set_mempolicy.test \
-	setdomainname.test \
-	setfsgid.test \
-	setfsgid32.test \
-	setfsuid.test \
-	setfsuid32.test \
-	setgid.test \
-	setgid32.test \
-	setgroups.test \
-	setgroups32.test \
-	sethostname.test \
-	setns.test \
-	setregid.test \
-	setregid32.test \
-	setresgid.test \
-	setresgid32.test \
-	setresuid.test \
-	setresuid32.test \
-	setreuid.test \
-	setreuid32.test \
-	setrlimit.test \
-	setuid.test \
-	setuid32.test \
-	shmxt.test \
-	shutdown.test \
 	sigaction.test \
 	sigaltstack.test \
-	siginfo.test \
-	signalfd4.test \
-	sigreturn.test \
-	socketcall.test \
-	splice.test \
-	stat.test \
-	stat64.test \
-	statfs.test \
-	statfs64.test \
 	sun_path.test \
-	swap.test \
-	symlink.test \
-	symlinkat.test \
-	sync.test \
-	sync_file_range.test \
-	sync_file_range2.test \
-	sysinfo.test \
-	syslog.test \
-	tee.test \
-	time.test \
-	timer_create.test \
-	timer_xettime.test \
-	timerfd_xettime.test \
-	times-fail.test \
-	times.test \
-	truncate.test \
-	truncate64.test \
-	ugetrlimit.test \
 	uio.test \
-	umask.test \
 	umount.test \
 	umount2.test \
-	umoven-illptr.test \
-	umovestr-illptr.test \
 	umovestr.test \
 	umovestr2.test \
-	umovestr3.test \
 	uname.test \
 	unix-pair-send-recv.test \
 	unix-pair-sendto-recvfrom.test \
-	unlink.test \
-	unlinkat.test \
-	unshare.test \
-	userfaultfd.test \
-	ustat.test \
-	utime.test \
-	utimensat.test \
-	utimes.test \
-	vhangup.test \
-	vmsplice.test \
-	wait4-v.test \
-	wait4.test \
-	waitid-v.test \
-	waitid.test \
-	waitpid.test \
-	xattr-strings.test \
-	xattr.test \
-	xet_robust_list.test \
-	xetitimer.test \
-	xetpgid.test \
-	xetpriority.test \
-	xettimeofday.test \
 	# end of DECODER_TESTS
 
 MISC_TESTS = \
@@ -2804,7 +3029,7 @@
 	detach-sleeping.test \
 	detach-stopped.test \
 	filter-unavailable.test \
-	fork-f.test \
+	get_regs.test \
 	ksysent.test \
 	opipe.test \
 	options-syntax.test \
@@ -2820,7 +3045,6 @@
 	redirect-fds.test \
 	redirect.test \
 	restart_syscall.test \
-	signal_receive.test \
 	strace-C.test \
 	strace-E.test \
 	strace-S.test \
@@ -2832,77 +3056,94 @@
 	strace-tt.test \
 	strace-ttt.test \
 	threads-execve.test \
-	vfork-f.test \
 	# end of MISC_TESTS
 
 XFAIL_TESTS_ = 
 XFAIL_TESTS_m32 = $(LIBUNWIND_TESTS)
 XFAIL_TESTS_mx32 = $(LIBUNWIND_TESTS)
-XFAIL_TESTS = $(XFAIL_TESTS_$(MPERS_NAME))
+XFAIL_TESTS_x86_64 = int_0x80.gen.test
+XFAIL_TESTS_x32 = int_0x80.gen.test
+XFAIL_TESTS = $(XFAIL_TESTS_$(MPERS_NAME)) $(XFAIL_TESTS_$(ARCH))
 TEST_LOG_COMPILER = env
 AM_TEST_LOG_FLAGS = STRACE_ARCH=$(ARCH) MIPS_ABI=$(MIPS_ABI) $(srcdir)/run.sh
 VALGRIND_FLAGS = --quiet
 VALGRIND_SUPPRESSIONS_FILES = $(srcdir)/strace.supp
-EXTRA_DIST = init.sh run.sh match.awk \
-	     caps-abbrev.awk \
-	     caps.awk \
-	     count-f.expected \
-	     eventfd.expected \
-	     fadvise.h \
-	     filter-unavailable.expected \
-	     fstatat.c \
-	     fstatx.c \
-	     getresugid.c \
-	     init_delete_module.h \
-	     ipc.sh \
-	     ipc_msgbuf.expected \
-	     ksysent.sed \
-	     lstatx.c \
-	     net.expected \
-	     oldselect.expected \
-	     pipe.expected \
-	     ppoll-v.expected \
-	     ppoll.expected \
-	     process_vm_readv_writev.c \
-	     qual_fault-exit_group.expected \
-	     qual_inject-error-signal.expected \
-	     qual_inject-signal.expected \
-	     quotactl.h \
-	     scno_tampering.sh \
-	     setfsugid.c \
-	     setresugid.c \
-	     setreugid.c \
-	     setugid.c \
-	     sigaction.awk \
-	     sigaltstack.expected \
-	     sockname.c \
-	     statfs.expected \
-	     statx.sh \
-	     strace-C.expected \
-	     strace-E.expected \
-	     strace-T.expected \
-	     strace-ff.expected \
-	     strace-k.test \
-	     strace-r.expected \
-	     strace.supp \
-	     struct_flock.c \
-	     sun_path.expected \
-	     uio.expected \
-	     umode_t.c \
-	     umovestr.expected \
-	     unix-pair-send-recv.expected \
-	     unix-pair-sendto-recvfrom.expected \
-	     xchownx.c \
-	     xgetrlimit.c \
-	     xselect.c \
-	     xstatfs.c \
-	     xstatfs64.c \
-	     xstatfsx.c \
-	     xstatx.c \
-	     $(TESTS)
+EXTRA_DIST = \
+	caps-abbrev.awk \
+	caps.awk \
+	clock.in \
+	count-f.expected \
+	eventfd.expected \
+	fadvise.h \
+	filter-unavailable.expected \
+	fstatat.c \
+	fstatx.c \
+	gen_pure_executables.sh \
+	gen_tests.in \
+	gen_tests.sh \
+	getresugid.c \
+	init.sh \
+	init_delete_module.h \
+	ioctl-v.sh \
+	ipc.sh \
+	ipc_msgbuf.expected \
+	ksysent.sed \
+	lstatx.c \
+	match.awk \
+	net.expected \
+	oldselect.expected \
+	pipe.expected \
+	process_vm_readv_writev.c \
+	pure_executables.list \
+	qual_fault-exit_group.expected \
+	qual_inject-error-signal.expected \
+	qual_inject-signal.expected \
+	quotactl.h \
+	regex.in \
+	run.sh \
+	sched.in \
+	scno_tampering.sh \
+	setfsugid.c \
+	setresugid.c \
+	setreugid.c \
+	setugid.c \
+	sigaction.awk \
+	sigaltstack.expected \
+	sockname.c \
+	strace-C.expected \
+	strace-E.expected \
+	strace-T.expected \
+	strace-ff.expected \
+	strace-k.test \
+	strace-r.expected \
+	strace.supp \
+	struct_flock.c \
+	sun_path.expected \
+	trace_fstat.in \
+	trace_fstatfs.in \
+	trace_lstat.in \
+	trace_question.in \
+	trace_stat.in \
+	trace_stat_like.in \
+	trace_statfs.in \
+	trace_statfs_like.in \
+	uio.expected \
+	umode_t.c \
+	umovestr.expected \
+	unix-pair-send-recv.expected \
+	unix-pair-sendto-recvfrom.expected \
+	xchownx.c \
+	xgetrlimit.c \
+	xselect.c \
+	xstatfs.c \
+	xstatfs64.c \
+	xstatfsx.c \
+	xstatx.c \
+	xutimes.c \
+	$(TESTS)
 
 objects = $(filter %.$(OBJEXT),$(SOURCES:.c=.$(OBJEXT)))
-CLEANFILES = ksysent.h $(TESTS:=.tmp) syscallent.i scno.h
+CLEANFILES = ksysent.h syscallent.i scno.h
 SCNO_CPPFLAGS = $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
 		$(ARCH_MFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS)
 
@@ -2913,7 +3154,7 @@
 
 .SUFFIXES:
 .SUFFIXES: .c .log .o .obj .test .test$(EXEEXT) .trs
-$(srcdir)/Makefile.in: # $(srcdir)/Makefile.am $(srcdir)/../scno.am $(am__configure_deps)
+$(srcdir)/Makefile.in: # $(srcdir)/Makefile.am $(srcdir)/pure_executables.am $(srcdir)/gen_tests.am $(srcdir)/../scno.am $(am__configure_deps)
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
@@ -2934,7 +3175,7 @@
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(srcdir)/../scno.am:
+$(srcdir)/pure_executables.am $(srcdir)/gen_tests.am $(srcdir)/../scno.am:
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -3316,6 +3557,14 @@
 	@rm -f getpgrp$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(getpgrp_OBJECTS) $(getpgrp_LDADD) $(LIBS)
 
+getpid$(EXEEXT): $(getpid_OBJECTS) $(getpid_DEPENDENCIES) $(EXTRA_getpid_DEPENDENCIES) 
+	@rm -f getpid$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(getpid_OBJECTS) $(getpid_LDADD) $(LIBS)
+
+getppid$(EXEEXT): $(getppid_OBJECTS) $(getppid_DEPENDENCIES) $(EXTRA_getppid_DEPENDENCIES) 
+	@rm -f getppid$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(getppid_OBJECTS) $(getppid_LDADD) $(LIBS)
+
 getrandom$(EXEEXT): $(getrandom_OBJECTS) $(getrandom_DEPENDENCIES) $(EXTRA_getrandom_DEPENDENCIES) 
 	@rm -f getrandom$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(getrandom_OBJECTS) $(getrandom_LDADD) $(LIBS)
@@ -3352,6 +3601,10 @@
 	@rm -f getsockname$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(getsockname_OBJECTS) $(getsockname_LDADD) $(LIBS)
 
+gettid$(EXEEXT): $(gettid_OBJECTS) $(gettid_DEPENDENCIES) $(EXTRA_gettid_DEPENDENCIES) 
+	@rm -f gettid$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(gettid_OBJECTS) $(gettid_LDADD) $(LIBS)
+
 getuid$(EXEEXT): $(getuid_OBJECTS) $(getuid_DEPENDENCIES) $(EXTRA_getuid_DEPENDENCIES) 
 	@rm -f getuid$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(getuid_OBJECTS) $(getuid_LDADD) $(LIBS)
@@ -3380,6 +3633,10 @@
 	@rm -f inotify_init1$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(inotify_init1_OBJECTS) $(inotify_init1_LDADD) $(LIBS)
 
+int_0x80$(EXEEXT): $(int_0x80_OBJECTS) $(int_0x80_DEPENDENCIES) $(EXTRA_int_0x80_DEPENDENCIES) 
+	@rm -f int_0x80$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(int_0x80_OBJECTS) $(int_0x80_LDADD) $(LIBS)
+
 ioctl$(EXEEXT): $(ioctl_OBJECTS) $(ioctl_DEPENDENCIES) $(EXTRA_ioctl_DEPENDENCIES) 
 	@rm -f ioctl$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(ioctl_OBJECTS) $(ioctl_LDADD) $(LIBS)
@@ -3420,6 +3677,10 @@
 	@rm -f ioctl_mtd$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(ioctl_mtd_OBJECTS) $(ioctl_mtd_LDADD) $(LIBS)
 
+ioctl_nsfs$(EXEEXT): $(ioctl_nsfs_OBJECTS) $(ioctl_nsfs_DEPENDENCIES) $(EXTRA_ioctl_nsfs_DEPENDENCIES) 
+	@rm -f ioctl_nsfs$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(ioctl_nsfs_OBJECTS) $(ioctl_nsfs_LDADD) $(LIBS)
+
 ioctl_rtc$(EXEEXT): $(ioctl_rtc_OBJECTS) $(ioctl_rtc_DEPENDENCIES) $(EXTRA_ioctl_rtc_DEPENDENCIES) 
 	@rm -f ioctl_rtc$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(ioctl_rtc_OBJECTS) $(ioctl_rtc_LDADD) $(LIBS)
@@ -3548,6 +3809,10 @@
 	@rm -f lstat64$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(lstat64_OBJECTS) $(lstat64_LDADD) $(LIBS)
 
+madvise$(EXEEXT): $(madvise_OBJECTS) $(madvise_DEPENDENCIES) $(EXTRA_madvise_DEPENDENCIES) 
+	@rm -f madvise$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(madvise_OBJECTS) $(madvise_LDADD) $(LIBS)
+
 mbind$(EXEEXT): $(mbind_OBJECTS) $(mbind_DEPENDENCIES) $(EXTRA_mbind_DEPENDENCIES) 
 	@rm -f mbind$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(mbind_OBJECTS) $(mbind_LDADD) $(LIBS)
@@ -3744,6 +4009,10 @@
 	@rm -f openat$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(openat_OBJECTS) $(openat_LDADD) $(LIBS)
 
+osf_utimes$(EXEEXT): $(osf_utimes_OBJECTS) $(osf_utimes_DEPENDENCIES) $(EXTRA_osf_utimes_DEPENDENCIES) 
+	@rm -f osf_utimes$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(osf_utimes_OBJECTS) $(osf_utimes_LDADD) $(LIBS)
+
 pause$(EXEEXT): $(pause_OBJECTS) $(pause_DEPENDENCIES) $(EXTRA_pause_DEPENDENCIES) 
 	@rm -f pause$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(pause_OBJECTS) $(pause_LDADD) $(LIBS)
@@ -3796,6 +4065,10 @@
 	@rm -f ppoll$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(ppoll_OBJECTS) $(ppoll_LDADD) $(LIBS)
 
+ppoll-v$(EXEEXT): $(ppoll_v_OBJECTS) $(ppoll_v_DEPENDENCIES) $(EXTRA_ppoll_v_DEPENDENCIES) 
+	@rm -f ppoll-v$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(ppoll_v_OBJECTS) $(ppoll_v_LDADD) $(LIBS)
+
 prctl-arg2-intptr$(EXEEXT): $(prctl_arg2_intptr_OBJECTS) $(prctl_arg2_intptr_DEPENDENCIES) $(EXTRA_prctl_arg2_intptr_DEPENDENCIES) 
 	@rm -f prctl-arg2-intptr$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(prctl_arg2_intptr_OBJECTS) $(prctl_arg2_intptr_LDADD) $(LIBS)
@@ -4004,6 +4277,10 @@
 	@rm -f rt_sigqueueinfo$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(rt_sigqueueinfo_OBJECTS) $(rt_sigqueueinfo_LDADD) $(LIBS)
 
+rt_sigreturn$(EXEEXT): $(rt_sigreturn_OBJECTS) $(rt_sigreturn_DEPENDENCIES) $(EXTRA_rt_sigreturn_DEPENDENCIES) 
+	@rm -f rt_sigreturn$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(rt_sigreturn_OBJECTS) $(rt_sigreturn_LDADD) $(LIBS)
+
 rt_sigsuspend$(EXEEXT): $(rt_sigsuspend_OBJECTS) $(rt_sigsuspend_DEPENDENCIES) $(EXTRA_rt_sigsuspend_DEPENDENCIES) 
 	@rm -f rt_sigsuspend$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(rt_sigsuspend_OBJECTS) $(rt_sigsuspend_LDADD) $(LIBS)
@@ -4204,6 +4481,10 @@
 	@rm -f sigreturn$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(sigreturn_OBJECTS) $(sigreturn_LDADD) $(LIBS)
 
+sigsuspend$(EXEEXT): $(sigsuspend_OBJECTS) $(sigsuspend_DEPENDENCIES) $(EXTRA_sigsuspend_DEPENDENCIES) 
+	@rm -f sigsuspend$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(sigsuspend_OBJECTS) $(sigsuspend_LDADD) $(LIBS)
+
 sleep$(EXEEXT): $(sleep_OBJECTS) $(sleep_DEPENDENCIES) $(EXTRA_sleep_DEPENDENCIES) 
 	@rm -f sleep$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(sleep_OBJECTS) $(sleep_LDADD) $(LIBS)
@@ -4236,10 +4517,18 @@
 	@rm -f statfs64$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(statfs64_OBJECTS) $(statfs64_LDADD) $(LIBS)
 
+statx$(EXEEXT): $(statx_OBJECTS) $(statx_DEPENDENCIES) $(EXTRA_statx_DEPENDENCIES) 
+	@rm -f statx$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(statx_OBJECTS) $(statx_LDADD) $(LIBS)
+
 swap$(EXEEXT): $(swap_OBJECTS) $(swap_DEPENDENCIES) $(EXTRA_swap_DEPENDENCIES) 
 	@rm -f swap$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(swap_OBJECTS) $(swap_LDADD) $(LIBS)
 
+sxetmask$(EXEEXT): $(sxetmask_OBJECTS) $(sxetmask_DEPENDENCIES) $(EXTRA_sxetmask_DEPENDENCIES) 
+	@rm -f sxetmask$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(sxetmask_OBJECTS) $(sxetmask_LDADD) $(LIBS)
+
 symlink$(EXEEXT): $(symlink_OBJECTS) $(symlink_DEPENDENCIES) $(EXTRA_symlink_DEPENDENCIES) 
 	@rm -f symlink$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(symlink_OBJECTS) $(symlink_LDADD) $(LIBS)
@@ -4548,6 +4837,8 @@
 include ./$(DEPDIR)/getgroups32.Po
 include ./$(DEPDIR)/getpeername.Po
 include ./$(DEPDIR)/getpgrp.Po
+include ./$(DEPDIR)/getpid.Po
+include ./$(DEPDIR)/getppid.Po
 include ./$(DEPDIR)/getrandom.Po
 include ./$(DEPDIR)/getresgid.Po
 include ./$(DEPDIR)/getresgid32.Po
@@ -4557,6 +4848,7 @@
 include ./$(DEPDIR)/getrusage.Po
 include ./$(DEPDIR)/getsid.Po
 include ./$(DEPDIR)/getsockname.Po
+include ./$(DEPDIR)/gettid.Po
 include ./$(DEPDIR)/getuid.Po
 include ./$(DEPDIR)/getuid32.Po
 include ./$(DEPDIR)/getxxid.Po
@@ -4564,6 +4856,7 @@
 include ./$(DEPDIR)/init_module.Po
 include ./$(DEPDIR)/inotify.Po
 include ./$(DEPDIR)/inotify_init1.Po
+include ./$(DEPDIR)/int_0x80.Po
 include ./$(DEPDIR)/ioctl.Po
 include ./$(DEPDIR)/ioctl_block.Po
 include ./$(DEPDIR)/ioctl_dm-v.Po
@@ -4574,6 +4867,7 @@
 include ./$(DEPDIR)/ioctl_loop-v.Po
 include ./$(DEPDIR)/ioctl_loop.Po
 include ./$(DEPDIR)/ioctl_mtd.Po
+include ./$(DEPDIR)/ioctl_nsfs.Po
 include ./$(DEPDIR)/ioctl_rtc-v.Po
 include ./$(DEPDIR)/ioctl_rtc.Po
 include ./$(DEPDIR)/ioctl_scsi.Po
@@ -4603,6 +4897,7 @@
 include ./$(DEPDIR)/libtests_a-error_msg.Po
 include ./$(DEPDIR)/libtests_a-fill_memory.Po
 include ./$(DEPDIR)/libtests_a-get_page_size.Po
+include ./$(DEPDIR)/libtests_a-get_sigset_size.Po
 include ./$(DEPDIR)/libtests_a-hexdump_strdup.Po
 include ./$(DEPDIR)/libtests_a-hexquote_strndup.Po
 include ./$(DEPDIR)/libtests_a-inode_of_sockfd.Po
@@ -4611,9 +4906,11 @@
 include ./$(DEPDIR)/libtests_a-overflowuid.Po
 include ./$(DEPDIR)/libtests_a-pipe_maxfd.Po
 include ./$(DEPDIR)/libtests_a-print_quoted_string.Po
+include ./$(DEPDIR)/libtests_a-print_time.Po
 include ./$(DEPDIR)/libtests_a-printflags.Po
 include ./$(DEPDIR)/libtests_a-printxval.Po
 include ./$(DEPDIR)/libtests_a-signal2name.Po
+include ./$(DEPDIR)/libtests_a-skip_unavailable.Po
 include ./$(DEPDIR)/libtests_a-sprintrc.Po
 include ./$(DEPDIR)/libtests_a-tail_alloc.Po
 include ./$(DEPDIR)/libtests_a-tprintf.Po
@@ -4624,6 +4921,7 @@
 include ./$(DEPDIR)/lseek.Po
 include ./$(DEPDIR)/lstat.Po
 include ./$(DEPDIR)/lstat64-lstat64.Po
+include ./$(DEPDIR)/madvise.Po
 include ./$(DEPDIR)/mbind.Po
 include ./$(DEPDIR)/membarrier.Po
 include ./$(DEPDIR)/memfd_create.Po
@@ -4673,6 +4971,7 @@
 include ./$(DEPDIR)/oldstat.Po
 include ./$(DEPDIR)/open.Po
 include ./$(DEPDIR)/openat.Po
+include ./$(DEPDIR)/osf_utimes.Po
 include ./$(DEPDIR)/pause.Po
 include ./$(DEPDIR)/pc.Po
 include ./$(DEPDIR)/perf_event_open.Po
@@ -4685,6 +4984,7 @@
 include ./$(DEPDIR)/pkey_free.Po
 include ./$(DEPDIR)/pkey_mprotect.Po
 include ./$(DEPDIR)/poll.Po
+include ./$(DEPDIR)/ppoll-v.Po
 include ./$(DEPDIR)/ppoll.Po
 include ./$(DEPDIR)/prctl-arg2-intptr.Po
 include ./$(DEPDIR)/prctl-dumpable.Po
@@ -4738,6 +5038,7 @@
 include ./$(DEPDIR)/rt_sigpending.Po
 include ./$(DEPDIR)/rt_sigprocmask.Po
 include ./$(DEPDIR)/rt_sigqueueinfo.Po
+include ./$(DEPDIR)/rt_sigreturn.Po
 include ./$(DEPDIR)/rt_sigsuspend.Po
 include ./$(DEPDIR)/rt_sigtimedwait.Po
 include ./$(DEPDIR)/rt_tgsigqueueinfo.Po
@@ -4788,6 +5089,7 @@
 include ./$(DEPDIR)/signal_receive.Po
 include ./$(DEPDIR)/signalfd4.Po
 include ./$(DEPDIR)/sigreturn.Po
+include ./$(DEPDIR)/sigsuspend.Po
 include ./$(DEPDIR)/sleep.Po
 include ./$(DEPDIR)/socketcall.Po
 include ./$(DEPDIR)/splice.Po
@@ -4800,7 +5102,9 @@
 include ./$(DEPDIR)/stat64-stat64.Po
 include ./$(DEPDIR)/statfs-statfs.Po
 include ./$(DEPDIR)/statfs64.Po
+include ./$(DEPDIR)/statx.Po
 include ./$(DEPDIR)/swap.Po
+include ./$(DEPDIR)/sxetmask.Po
 include ./$(DEPDIR)/symlink.Po
 include ./$(DEPDIR)/symlinkat.Po
 include ./$(DEPDIR)/sync.Po
@@ -4925,6 +5229,20 @@
 #	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
 #	$(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtests_a-get_page_size.obj `if test -f 'get_page_size.c'; then $(CYGPATH_W) 'get_page_size.c'; else $(CYGPATH_W) '$(srcdir)/get_page_size.c'; fi`
 
+libtests_a-get_sigset_size.o: get_sigset_size.c
+	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtests_a-get_sigset_size.o -MD -MP -MF $(DEPDIR)/libtests_a-get_sigset_size.Tpo -c -o libtests_a-get_sigset_size.o `test -f 'get_sigset_size.c' || echo '$(srcdir)/'`get_sigset_size.c
+	$(AM_V_at)$(am__mv) $(DEPDIR)/libtests_a-get_sigset_size.Tpo $(DEPDIR)/libtests_a-get_sigset_size.Po
+#	$(AM_V_CC)source='get_sigset_size.c' object='libtests_a-get_sigset_size.o' libtool=no \
+#	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
+#	$(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtests_a-get_sigset_size.o `test -f 'get_sigset_size.c' || echo '$(srcdir)/'`get_sigset_size.c
+
+libtests_a-get_sigset_size.obj: get_sigset_size.c
+	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtests_a-get_sigset_size.obj -MD -MP -MF $(DEPDIR)/libtests_a-get_sigset_size.Tpo -c -o libtests_a-get_sigset_size.obj `if test -f 'get_sigset_size.c'; then $(CYGPATH_W) 'get_sigset_size.c'; else $(CYGPATH_W) '$(srcdir)/get_sigset_size.c'; fi`
+	$(AM_V_at)$(am__mv) $(DEPDIR)/libtests_a-get_sigset_size.Tpo $(DEPDIR)/libtests_a-get_sigset_size.Po
+#	$(AM_V_CC)source='get_sigset_size.c' object='libtests_a-get_sigset_size.obj' libtool=no \
+#	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
+#	$(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtests_a-get_sigset_size.obj `if test -f 'get_sigset_size.c'; then $(CYGPATH_W) 'get_sigset_size.c'; else $(CYGPATH_W) '$(srcdir)/get_sigset_size.c'; fi`
+
 libtests_a-hexdump_strdup.o: hexdump_strdup.c
 	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtests_a-hexdump_strdup.o -MD -MP -MF $(DEPDIR)/libtests_a-hexdump_strdup.Tpo -c -o libtests_a-hexdump_strdup.o `test -f 'hexdump_strdup.c' || echo '$(srcdir)/'`hexdump_strdup.c
 	$(AM_V_at)$(am__mv) $(DEPDIR)/libtests_a-hexdump_strdup.Tpo $(DEPDIR)/libtests_a-hexdump_strdup.Po
@@ -5037,6 +5355,20 @@
 #	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
 #	$(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtests_a-print_quoted_string.obj `if test -f 'print_quoted_string.c'; then $(CYGPATH_W) 'print_quoted_string.c'; else $(CYGPATH_W) '$(srcdir)/print_quoted_string.c'; fi`
 
+libtests_a-print_time.o: print_time.c
+	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtests_a-print_time.o -MD -MP -MF $(DEPDIR)/libtests_a-print_time.Tpo -c -o libtests_a-print_time.o `test -f 'print_time.c' || echo '$(srcdir)/'`print_time.c
+	$(AM_V_at)$(am__mv) $(DEPDIR)/libtests_a-print_time.Tpo $(DEPDIR)/libtests_a-print_time.Po
+#	$(AM_V_CC)source='print_time.c' object='libtests_a-print_time.o' libtool=no \
+#	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
+#	$(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtests_a-print_time.o `test -f 'print_time.c' || echo '$(srcdir)/'`print_time.c
+
+libtests_a-print_time.obj: print_time.c
+	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtests_a-print_time.obj -MD -MP -MF $(DEPDIR)/libtests_a-print_time.Tpo -c -o libtests_a-print_time.obj `if test -f 'print_time.c'; then $(CYGPATH_W) 'print_time.c'; else $(CYGPATH_W) '$(srcdir)/print_time.c'; fi`
+	$(AM_V_at)$(am__mv) $(DEPDIR)/libtests_a-print_time.Tpo $(DEPDIR)/libtests_a-print_time.Po
+#	$(AM_V_CC)source='print_time.c' object='libtests_a-print_time.obj' libtool=no \
+#	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
+#	$(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtests_a-print_time.obj `if test -f 'print_time.c'; then $(CYGPATH_W) 'print_time.c'; else $(CYGPATH_W) '$(srcdir)/print_time.c'; fi`
+
 libtests_a-printflags.o: printflags.c
 	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtests_a-printflags.o -MD -MP -MF $(DEPDIR)/libtests_a-printflags.Tpo -c -o libtests_a-printflags.o `test -f 'printflags.c' || echo '$(srcdir)/'`printflags.c
 	$(AM_V_at)$(am__mv) $(DEPDIR)/libtests_a-printflags.Tpo $(DEPDIR)/libtests_a-printflags.Po
@@ -5079,6 +5411,20 @@
 #	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
 #	$(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtests_a-signal2name.obj `if test -f 'signal2name.c'; then $(CYGPATH_W) 'signal2name.c'; else $(CYGPATH_W) '$(srcdir)/signal2name.c'; fi`
 
+libtests_a-skip_unavailable.o: skip_unavailable.c
+	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtests_a-skip_unavailable.o -MD -MP -MF $(DEPDIR)/libtests_a-skip_unavailable.Tpo -c -o libtests_a-skip_unavailable.o `test -f 'skip_unavailable.c' || echo '$(srcdir)/'`skip_unavailable.c
+	$(AM_V_at)$(am__mv) $(DEPDIR)/libtests_a-skip_unavailable.Tpo $(DEPDIR)/libtests_a-skip_unavailable.Po
+#	$(AM_V_CC)source='skip_unavailable.c' object='libtests_a-skip_unavailable.o' libtool=no \
+#	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
+#	$(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtests_a-skip_unavailable.o `test -f 'skip_unavailable.c' || echo '$(srcdir)/'`skip_unavailable.c
+
+libtests_a-skip_unavailable.obj: skip_unavailable.c
+	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtests_a-skip_unavailable.obj -MD -MP -MF $(DEPDIR)/libtests_a-skip_unavailable.Tpo -c -o libtests_a-skip_unavailable.obj `if test -f 'skip_unavailable.c'; then $(CYGPATH_W) 'skip_unavailable.c'; else $(CYGPATH_W) '$(srcdir)/skip_unavailable.c'; fi`
+	$(AM_V_at)$(am__mv) $(DEPDIR)/libtests_a-skip_unavailable.Tpo $(DEPDIR)/libtests_a-skip_unavailable.Po
+#	$(AM_V_CC)source='skip_unavailable.c' object='libtests_a-skip_unavailable.obj' libtool=no \
+#	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
+#	$(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtests_a-skip_unavailable.obj `if test -f 'skip_unavailable.c'; then $(CYGPATH_W) 'skip_unavailable.c'; else $(CYGPATH_W) '$(srcdir)/skip_unavailable.c'; fi`
+
 libtests_a-sprintrc.o: sprintrc.c
 	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtests_a-sprintrc.o -MD -MP -MF $(DEPDIR)/libtests_a-sprintrc.Tpo -c -o libtests_a-sprintrc.o `test -f 'sprintrc.c' || echo '$(srcdir)/'`sprintrc.c
 	$(AM_V_at)$(am__mv) $(DEPDIR)/libtests_a-sprintrc.Tpo $(DEPDIR)/libtests_a-sprintrc.Po
@@ -5603,7 +5949,7 @@
 clean: clean-am
 
 clean-am: clean-checkLIBRARIES clean-checkPROGRAMS clean-generic \
-	mostlyclean-am
+	clean-local mostlyclean-am
 
 distclean: distclean-am
 	-rm -rf ./$(DEPDIR)
@@ -5675,19 +6021,982 @@
 .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am \
 	check-valgrind-am check-valgrind-local clean \
 	clean-checkLIBRARIES clean-checkPROGRAMS clean-generic \
-	cscopelist-am ctags ctags-am distclean distclean-compile \
-	distclean-generic distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-man install-pdf install-pdf-am \
-	install-ps install-ps-am install-strip installcheck \
-	installcheck-am installdirs maintainer-clean \
+	clean-local cscopelist-am ctags ctags-am distclean \
+	distclean-compile distclean-generic distclean-tags distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
 	maintainer-clean-generic mostlyclean mostlyclean-compile \
 	mostlyclean-generic pdf pdf-am ps ps-am recheck tags tags-am \
 	uninstall uninstall-am
 
 
+$(srcdir)/_newselect.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/accept.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/accept4.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/access.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/acct.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/add_key.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/adjtimex.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/aio.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/alarm.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/bpf.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/btrfs.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/chmod.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/chown.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/chown32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/chroot.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/clock.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/clock_adjtime.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/clock_nanosleep.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/clock_xettime.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/copy_file_range.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/creat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/delete_module.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/dup.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/dup2.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/dup3.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/epoll_create.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/epoll_create1.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/epoll_ctl.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/epoll_pwait.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/epoll_wait.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/erestartsys.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/execveat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/execveat-v.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/faccessat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fadvise64_64.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fallocate.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fanotify_init.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fanotify_mark.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fchdir.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fchmod.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fchmodat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fchown.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fchown32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fchownat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fcntl.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fcntl64.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fdatasync.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/file_handle.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/file_ioctl.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/finit_module.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/flock.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fork-f.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fstat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fstat64.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fstatat64.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fstatfs.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fstatfs64.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fsync.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ftruncate.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ftruncate64.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/futimesat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/get_mempolicy.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getcpu.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getcwd.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getdents.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getdents64.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getegid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getegid32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/geteuid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/geteuid32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getgid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getgid32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getgroups.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getgroups32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getpeername.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getpgrp.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getpid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getppid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getrandom.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getresgid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getresgid32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getresuid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getresuid32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getrlimit.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getrusage.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getsid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getsockname.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/gettid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getuid32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getxxid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/inet-cmsg.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/init_module.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/inotify.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/inotify_init1.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/int_0x80.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ioctl_block.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ioctl_evdev.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ioctl_evdev-v.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ioctl_loop.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ioctl_loop-v.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ioctl_mtd.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ioctl_rtc.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ioctl_rtc-v.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ioctl_scsi.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ioctl_sg_io_v3.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ioctl_sg_io_v4.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ioctl_uffdio.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ioctl_v4l2.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ioperm.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/iopl.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ioprio.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ip_mreq.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ipc.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ipc_msg.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ipc_sem.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ipc_shm.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/kcmp.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/kexec_file_load.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/kexec_load.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/keyctl.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/kill.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/lchown.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/lchown32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/link.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/linkat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/lookup_dcookie.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/lstat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/lstat64.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/madvise.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mbind.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/membarrier.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/memfd_create.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/migrate_pages.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mincore.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mkdir.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mkdirat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mknod.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mknodat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mlock.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mlock2.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mlockall.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mmap64.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mmsg.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mmsg-silent.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mmsg_name.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mmsg_name-v.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mount.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/move_pages.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mq.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mq_sendrecv.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mq_sendrecv-read.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mq_sendrecv-write.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/msg_control.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/msg_control-v.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/msg_name.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/munlockall.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/nanosleep.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/net-icmp_filter.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/net-sockaddr.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/netlink_protocol.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/newfstatat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/old_mmap.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/oldfstat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/oldlstat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/oldstat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/open.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/openat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/osf_utimes.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/pause.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/perf_event_open.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/perf_event_open_nonverbose.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/perf_event_open_unabbrev.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/pipe2.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/pkey_alloc.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/pkey_free.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/pkey_mprotect.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ppoll.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ppoll-v.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/pread64-pwrite64.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/preadv.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/preadv-pwritev.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/preadv2-pwritev2.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/printstr.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/prlimit64.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/process_vm_readv.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/process_vm_writev.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/pselect6.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ptrace.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/pwritev.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/quotactl.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/quotactl-v.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/quotactl-xfs.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/quotactl-xfs-v.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/read-write.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/readahead.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/readdir.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/readlink.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/readlinkat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/reboot.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/recvfrom.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/recvmmsg-timeout.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/recvmsg.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/regex.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/remap_file_pages.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/rename.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/renameat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/renameat2.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/request_key.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/rmdir.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/rt_sigpending.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/rt_sigprocmask.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/rt_sigqueueinfo.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/rt_sigreturn.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/rt_sigsuspend.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/rt_sigtimedwait.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/rt_tgsigqueueinfo.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sched.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sched_get_priority_mxx.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sched_rr_get_interval.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sched_xetaffinity.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sched_xetattr.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sched_xetparam.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sched_xetscheduler.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sched_yield.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/seccomp-filter.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/seccomp-filter-v.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/select.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/semop.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sendfile.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sendfile64.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/set_mempolicy.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setdomainname.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setfsgid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setfsgid32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setfsuid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setfsuid32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setgid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setgid32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setgroups.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setgroups32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sethostname.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setns.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setregid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setregid32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setresgid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setresgid32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setresuid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setresuid32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setreuid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setreuid32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setrlimit.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setuid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setuid32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/shmxt.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/shutdown.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/siginfo.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/signal_receive.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/signalfd4.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sigreturn.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sigsuspend.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/socketcall.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/splice.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/stat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/stat64.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/statfs.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/statfs64.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/statx.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/swap.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sxetmask.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/symlink.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/symlinkat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sync.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sync_file_range.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sync_file_range2.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sysinfo.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/syslog.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/tee.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/time.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/timer_create.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/timer_xettime.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/timerfd_xettime.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/times.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/times-fail.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/trace_fstat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/trace_fstatfs.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/trace_lstat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/trace_question.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/trace_stat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/trace_stat_like.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/trace_statfs.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/trace_statfs_like.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/truncate.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/truncate64.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ugetrlimit.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/umask.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/umoven-illptr.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/umovestr-illptr.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/umovestr3.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/unlink.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/unlinkat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/unshare.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/userfaultfd.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ustat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/utime.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/utimensat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/utimes.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/vfork-f.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/vhangup.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/vmsplice.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/wait4.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/wait4-v.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/waitid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/waitid-v.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/waitpid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/xattr.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/xattr-strings.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/xet_robust_list.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/xetitimer.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/xetpgid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/xetpriority.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/xettimeofday.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
 
 # Valgrind check
 #
@@ -5786,6 +7095,11 @@
 ksysent.$(OBJEXT): ksysent.h
 $(objects): scno.h
 
+clean-local: clean-local-check
+.PHONY: clean-local-check
+clean-local-check:
+	-rm -rf -- $(TESTS:.test=.dir) $(GEN_TESTS:.gen.test=.dir)
+
 syscallent.i: $(top_srcdir)/$(OS)/$(ARCH)/syscallent.h
 	$(CPP) -P $(SCNO_CPPFLAGS) $^ -o $@
 
diff --git a/tests/Makefile.am b/tests/Makefile.am
deleted file mode 100644
index 311d3bb..0000000
--- a/tests/Makefile.am
+++ /dev/null
@@ -1,962 +0,0 @@
-# Automake input for strace tests.
-#
-# Copyright (c) 2011-2016 Dmitry V. Levin <[email protected]>
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-#    notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-#    notice, this list of conditions and the following disclaimer in the
-#    documentation and/or other materials provided with the distribution.
-# 3. The name of the author may not be used to endorse or promote products
-#    derived from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-OS = linux
-ARCH = @arch@
-MPERS_NAME =
-ARCH_MFLAGS =
-AM_CFLAGS = $(WARN_CFLAGS)
-AM_CPPFLAGS = $(ARCH_MFLAGS) \
-	      -I$(builddir) \
-	      -I$(top_builddir)/$(OS)/$(ARCH) \
-	      -I$(top_srcdir)/$(OS)/$(ARCH) \
-	      -I$(top_builddir)/$(OS) \
-	      -I$(top_srcdir)/$(OS) \
-	      -I$(top_builddir) \
-	      -I$(top_srcdir)
-AM_LDFLAGS = $(ARCH_MFLAGS)
-
-libtests_a_SOURCES = \
-	errno2name.c \
-	error_msg.c \
-	fill_memory.c \
-	get_page_size.c \
-	hexdump_strdup.c \
-	hexquote_strndup.c \
-	inode_of_sockfd.c \
-	libmmsg.c \
-	libsocketcall.c \
-	overflowuid.c \
-	pipe_maxfd.c \
-	print_quoted_string.c \
-	printflags.c \
-	printxval.c \
-	signal2name.c \
-	sprintrc.c \
-	tail_alloc.c \
-	tests.h \
-	tprintf.c \
-	# end of libtests_a_SOURCES
-libtests_a_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
-check_LIBRARIES = libtests.a
-LDADD = libtests.a
-
-check_PROGRAMS = \
-	_newselect \
-	accept \
-	accept4 \
-	access \
-	acct \
-	add_key \
-	adjtimex \
-	aio \
-	alarm \
-	answer \
-	attach-f-p \
-	attach-f-p-cmd \
-	attach-p-cmd-cmd \
-	attach-p-cmd-p \
-	bpf \
-	brk \
-	btrfs \
-	caps \
-	caps-abbrev \
-	chmod \
-	chown \
-	chown32 \
-	chroot \
-	clock_adjtime \
-	clock_nanosleep \
-	clock_xettime \
-	copy_file_range \
-	count-f \
-	creat \
-	delete_module \
-	dup \
-	dup2 \
-	dup3 \
-	epoll_create \
-	epoll_create1 \
-	epoll_ctl \
-	epoll_pwait \
-	epoll_wait \
-	erestartsys \
-	eventfd \
-	execve \
-	execve-v \
-	execveat \
-	execveat-v \
-	faccessat \
-	fadvise64 \
-	fadvise64_64 \
-	fallocate \
-	fanotify_init \
-	fanotify_mark \
-	fchdir \
-	fchmod \
-	fchmodat \
-	fchown \
-	fchown32 \
-	fchownat \
-	fcntl \
-	fcntl64 \
-	fdatasync \
-	file_handle \
-	file_ioctl \
-	filter-unavailable \
-	finit_module \
-	flock \
-	fork-f \
-	fstat \
-	fstat64 \
-	fstatat64 \
-	fstatfs \
-	fstatfs64 \
-	fsync \
-	ftruncate \
-	ftruncate64 \
-	futex \
-	futimesat \
-	get_mempolicy \
-	getcpu \
-	getcwd \
-	getdents \
-	getdents64 \
-	getegid \
-	getegid32 \
-	geteuid \
-	geteuid32 \
-	getgid \
-	getgid32 \
-	getgroups \
-	getgroups32 \
-	getpeername \
-	getpgrp \
-	getrandom \
-	getresgid \
-	getresgid32 \
-	getresuid \
-	getresuid32 \
-	getrlimit \
-	getrusage \
-	getsid \
-	getsockname \
-	getuid \
-	getuid32 \
-	getxxid \
-	inet-cmsg \
-	init_module \
-	inotify \
-	inotify_init1 \
-	ioctl \
-	ioctl_block \
-	ioctl_dm \
-	ioctl_dm-v \
-	ioctl_evdev \
-	ioctl_evdev-v \
-	ioctl_loop \
-	ioctl_loop-nv \
-	ioctl_loop-v \
-	ioctl_mtd \
-	ioctl_rtc \
-	ioctl_rtc-v \
-	ioctl_scsi \
-	ioctl_sg_io_v3 \
-	ioctl_sg_io_v4 \
-	ioctl_sock_gifconf \
-	ioctl_uffdio \
-	ioctl_v4l2 \
-	ioperm \
-	iopl \
-	ioprio \
-	ip_mreq \
-	ipc \
-	ipc_msg \
-	ipc_msgbuf \
-	ipc_sem \
-	ipc_shm \
-	kcmp \
-	kexec_file_load \
-	kexec_load \
-	keyctl \
-	kill \
-	ksysent \
-	lchown \
-	lchown32 \
-	link \
-	linkat \
-	llseek \
-	lookup_dcookie \
-	lseek \
-	lstat \
-	lstat64 \
-	mbind \
-	membarrier \
-	memfd_create \
-	migrate_pages \
-	mincore \
-	mkdir \
-	mkdirat \
-	mknod \
-	mknodat \
-	mlock \
-	mlock2 \
-	mlockall \
-	mmap \
-	mmap64 \
-	mmsg \
-	mmsg-silent \
-	mmsg_name \
-	mmsg_name-v \
-	mount \
-	move_pages \
-	mq \
-	mq_sendrecv \
-	mq_sendrecv-read \
-	mq_sendrecv-write \
-	msg_control \
-	msg_control-v \
-	msg_name \
-	munlockall \
-	nanosleep \
-	net-accept-connect \
-	net-icmp_filter \
-	net-sockaddr \
-	net-y-unix \
-	net-yy-inet \
-	net-yy-netlink \
-	net-yy-unix \
-	netlink_inet_diag \
-	netlink_netlink_diag \
-	netlink_protocol \
-	netlink_unix_diag \
-	newfstatat \
-	nsyscalls \
-	old_mmap \
-	oldfstat \
-	oldlstat \
-	oldselect \
-	oldstat \
-	open \
-	openat \
-	pause \
-	pc \
-	perf_event_open \
-	perf_event_open_nonverbose \
-	perf_event_open_unabbrev \
-	personality \
-	pipe \
-	pipe2 \
-	pkey_alloc \
-	pkey_free \
-	pkey_mprotect \
-	poll \
-	ppoll \
-	prctl-arg2-intptr \
-	prctl-dumpable \
-	prctl-name \
-	prctl-no-args \
-	prctl-pdeathsig \
-	prctl-seccomp-filter-v \
-	prctl-seccomp-strict \
-	prctl-securebits \
-	prctl-tid_address \
-	prctl-tsc \
-	pread64-pwrite64 \
-	preadv \
-	preadv-pwritev \
-	preadv2-pwritev2 \
-	print_maxfd \
-	printstr \
-	prlimit64 \
-	process_vm_readv \
-	process_vm_writev \
-	pselect6 \
-	ptrace \
-	pwritev \
-	qual_fault \
-	qual_inject-error-signal \
-	qual_inject-retval \
-	qual_inject-signal \
-	qual_signal \
-	quotactl \
-	quotactl-v \
-	quotactl-xfs \
-	quotactl-xfs-v \
-	read-write \
-	readahead \
-	readdir \
-	readlink \
-	readlinkat \
-	readv \
-	reboot \
-	recvfrom \
-	recvmmsg-timeout \
-	recvmsg \
-	redirect-fds \
-	remap_file_pages \
-	rename \
-	renameat \
-	renameat2 \
-	request_key \
-	restart_syscall \
-	rmdir \
-	rt_sigpending \
-	rt_sigprocmask \
-	rt_sigqueueinfo \
-	rt_sigsuspend \
-	rt_sigtimedwait \
-	rt_tgsigqueueinfo \
-	sched_get_priority_mxx \
-	sched_rr_get_interval \
-	sched_xetaffinity \
-	sched_xetattr \
-	sched_xetparam \
-	sched_xetscheduler \
-	sched_yield \
-	scm_rights \
-	seccomp-filter \
-	seccomp-filter-v \
-	seccomp-strict \
-	select \
-	semop \
-	sendfile \
-	sendfile64 \
-	set_mempolicy \
-	set_ptracer_any \
-	setdomainname \
-	setfsgid \
-	setfsgid32 \
-	setfsuid \
-	setfsuid32 \
-	setgid \
-	setgid32 \
-	setgroups \
-	setgroups32 \
-	sethostname \
-	setns \
-	setregid \
-	setregid32 \
-	setresgid \
-	setresgid32 \
-	setresuid \
-	setresuid32 \
-	setreuid \
-	setreuid32 \
-	setrlimit \
-	setuid \
-	setuid32 \
-	shmxt \
-	shutdown \
-	sigaction \
-	sigaltstack \
-	siginfo \
-	signal_receive \
-	signalfd4 \
-	sigreturn \
-	sleep \
-	socketcall \
-	splice \
-	stack-fcall \
-	stat \
-	stat64 \
-	statfs \
-	statfs64 \
-	swap \
-	symlink \
-	symlinkat \
-	sync \
-	sync_file_range \
-	sync_file_range2 \
-	sysinfo \
-	syslog \
-	tee \
-	threads-execve \
-	time \
-	timer_create \
-	timer_xettime \
-	timerfd_xettime \
-	times \
-	times-fail \
-	truncate \
-	truncate64 \
-	ugetrlimit \
-	uio \
-	umask \
-	umount \
-	umount2 \
-	umoven-illptr \
-	umovestr \
-	umovestr-illptr \
-	umovestr2 \
-	umovestr3 \
-	uname \
-	unix-pair-send-recv \
-	unix-pair-sendto-recvfrom \
-	unlink \
-	unlinkat \
-	unshare \
-	userfaultfd \
-	ustat \
-	utime \
-	utimensat \
-	utimes \
-	vfork-f \
-	vhangup \
-	vmsplice \
-	wait4 \
-	wait4-v \
-	waitid \
-	waitid-v \
-	waitpid \
-	xattr \
-	xattr-strings \
-	xet_robust_list \
-	xetitimer \
-	xetpgid \
-	xetpriority \
-	xettimeofday \
-	# end of check_PROGRAMS
-
-attach_f_p_LDADD = -lrt -lpthread $(LDADD)
-clock_xettime_LDADD = -lrt $(LDADD)
-count_f_LDADD = -lpthread $(LDADD)
-filter_unavailable_LDADD = -lpthread $(LDADD)
-fstat64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
-fstatat64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
-ftruncate64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
-lstat64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
-mmap64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
-mq_LDADD = -lrt $(LDADD)
-mq_sendrecv_LDADD = -lrt $(LDADD)
-mq_sendrecv_read_LDADD = -lrt $(LDADD)
-mq_sendrecv_write_LDADD = -lrt $(LDADD)
-newfstatat_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
-pc_LDADD = $(dl_LIBS) $(LDADD)
-pread64_pwrite64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
-preadv_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
-preadv_pwritev_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
-pwritev_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
-stat64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
-statfs_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
-threads_execve_LDADD = -lrt -lpthread $(LDADD)
-times_LDADD = -lrt $(LDADD)
-truncate64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
-uio_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
-
-stack_fcall_SOURCES = stack-fcall.c \
-	stack-fcall-0.c stack-fcall-1.c stack-fcall-2.c stack-fcall-3.c
-
-if USE_LIBUNWIND
-LIBUNWIND_TESTS = strace-k.test
-else
-LIBUNWIND_TESTS =
-endif
-
-DECODER_TESTS = \
-	_newselect.test \
-	accept.test \
-	accept4.test \
-	access.test \
-	acct.test \
-	add_key.test \
-	adjtimex.test \
-	aio.test \
-	alarm.test \
-	bpf.test \
-	brk.test \
-	btrfs-v.test \
-	btrfs-vw.test \
-	btrfs-w.test \
-	btrfs.test \
-	caps-abbrev.test \
-	caps.test \
-	chmod.test \
-	chown.test \
-	chown32.test \
-	chroot.test \
-	clock_adjtime.test \
-	clock_nanosleep.test \
-	clock_xettime.test \
-	copy_file_range.test \
-	creat.test \
-	delete_module.test \
-	dup.test \
-	dup2.test \
-	dup3.test \
-	epoll_create.test \
-	epoll_create1.test \
-	epoll_ctl.test \
-	epoll_pwait.test \
-	epoll_wait.test \
-	erestartsys.test \
-	eventfd.test \
-	execve-v.test \
-	execve.test \
-	execveat-v.test \
-	execveat.test \
-	faccessat.test \
-	fadvise64.test \
-	fadvise64_64.test \
-	fallocate.test \
-	fanotify_init.test \
-	fanotify_mark.test \
-	fchdir.test \
-	fchmod.test \
-	fchmodat.test \
-	fchown.test \
-	fchown32.test \
-	fchownat.test \
-	fcntl.test \
-	fcntl64.test \
-	fdatasync.test \
-	file_handle.test \
-	file_ioctl.test \
-	finit_module.test \
-	flock.test \
-	fstat.test \
-	fstat64.test \
-	fstatat64.test \
-	fstatfs.test \
-	fstatfs64.test \
-	fsync.test \
-	ftruncate.test \
-	ftruncate64.test \
-	futex.test \
-	futimesat.test \
-	get_mempolicy.test \
-	getcpu.test \
-	getcwd.test \
-	getdents.test \
-	getdents64.test \
-	getegid.test \
-	getegid32.test \
-	geteuid.test \
-	geteuid32.test \
-	getgid.test \
-	getgid32.test \
-	getgroups.test \
-	getgroups32.test \
-	getpeername.test \
-	getpgrp.test \
-	getrandom.test \
-	getresgid.test \
-	getresgid32.test \
-	getresuid.test \
-	getresuid32.test \
-	getrlimit.test \
-	getrusage.test \
-	getsid.test \
-	getsockname.test \
-	getuid.test \
-	getuid32.test \
-	getxxid.test \
-	inet-cmsg.test \
-	init_module.test \
-	inotify.test \
-	inotify_init1.test \
-	ioctl.test \
-	ioctl_block.test \
-	ioctl_dm-v.test \
-	ioctl_dm.test \
-	ioctl_evdev-v.test \
-	ioctl_evdev.test \
-	ioctl_loop-nv.test \
-	ioctl_loop-v.test \
-	ioctl_loop.test \
-	ioctl_mtd.test \
-	ioctl_rtc-v.test \
-	ioctl_rtc.test \
-	ioctl_scsi.test \
-	ioctl_sg_io_v3.test \
-	ioctl_sg_io_v4.test \
-	ioctl_sock_gifconf.test \
-	ioctl_uffdio.test \
-	ioctl_v4l2.test \
-	ioperm.test \
-	iopl.test \
-	ioprio.test \
-	ip_mreq.test \
-	ipc.test \
-	ipc_msg.test \
-	ipc_msgbuf.test \
-	ipc_sem.test \
-	ipc_shm.test \
-	kcmp.test \
-	kexec_file_load.test \
-	kexec_load.test \
-	keyctl.test \
-	kill.test \
-	lchown.test \
-	lchown32.test \
-	link.test \
-	linkat.test \
-	llseek.test \
-	lookup_dcookie.test \
-	lseek.test \
-	lstat.test \
-	lstat64.test \
-	mbind.test \
-	membarrier.test \
-	memfd_create.test \
-	migrate_pages.test \
-	mincore.test \
-	mkdir.test \
-	mkdirat.test \
-	mknod.test \
-	mknodat.test \
-	mlock.test \
-	mlock2.test \
-	mlockall.test \
-	mmap.test \
-	mmap64.test \
-	mmsg-silent.test \
-	mmsg.test \
-	mmsg_name-v.test \
-	mmsg_name.test \
-	mount.test \
-	move_pages.test \
-	mq.test \
-	mq_sendrecv-read.test \
-	mq_sendrecv-write.test \
-	mq_sendrecv.test \
-	msg_control-v.test \
-	msg_control.test \
-	msg_name.test \
-	munlockall.test \
-	nanosleep.test \
-	net-icmp_filter.test \
-	net-sockaddr.test \
-	net-y-unix.test \
-	net-yy-inet.test \
-	net-yy-netlink.test \
-	net-yy-unix.test \
-	net.test \
-	netlink_protocol.test \
-	newfstatat.test \
-	nsyscalls.test \
-	old_mmap.test \
-	oldfstat.test \
-	oldlstat.test \
-	oldselect.test \
-	oldstat.test \
-	open.test \
-	openat.test \
-	pause.test \
-	perf_event_open.test \
-	perf_event_open_nonverbose.test \
-	perf_event_open_unabbrev.test \
-	personality.test \
-	pipe.test \
-	pipe2.test \
-	pkey_alloc.test \
-	pkey_free.test \
-	pkey_mprotect.test \
-	poll.test \
-	ppoll.test \
-	prctl-arg2-intptr.test \
-	prctl-dumpable.test \
-	prctl-name.test \
-	prctl-no-args.test \
-	prctl-pdeathsig.test \
-	prctl-seccomp-filter-v.test \
-	prctl-seccomp-strict.test \
-	prctl-securebits.test \
-	prctl-tid_address.test \
-	prctl-tsc.test \
-	pread64-pwrite64.test \
-	preadv-pwritev.test \
-	preadv.test \
-	preadv2-pwritev2.test \
-	printstr.test \
-	prlimit64.test \
-	process_vm_readv.test \
-	process_vm_writev.test \
-	pselect6.test \
-	ptrace.test \
-	pwritev.test \
-	qual_fault-exit_group.test \
-	quotactl-v.test \
-	quotactl-xfs-v.test \
-	quotactl-xfs.test \
-	quotactl.test \
-	read-write.test \
-	readahead.test \
-	readdir.test \
-	readlink.test \
-	readlinkat.test \
-	readv.test \
-	reboot.test \
-	recvfrom.test \
-	recvmmsg-timeout.test \
-	recvmsg.test \
-	remap_file_pages.test \
-	rename.test \
-	renameat.test \
-	renameat2.test \
-	request_key.test \
-	rmdir.test \
-	rt_sigpending.test \
-	rt_sigprocmask.test \
-	rt_sigqueueinfo.test \
-	rt_sigsuspend.test \
-	rt_sigtimedwait.test \
-	rt_tgsigqueueinfo.test \
-	sched_get_priority_mxx.test \
-	sched_rr_get_interval.test \
-	sched_xetaffinity.test \
-	sched_xetattr.test \
-	sched_xetparam.test \
-	sched_xetscheduler.test \
-	sched_yield.test \
-	scm_rights-fd.test \
-	seccomp-filter-v.test \
-	seccomp-filter.test \
-	seccomp-strict.test \
-	select.test \
-	semop.test \
-	sendfile.test \
-	sendfile64.test \
-	set_mempolicy.test \
-	setdomainname.test \
-	setfsgid.test \
-	setfsgid32.test \
-	setfsuid.test \
-	setfsuid32.test \
-	setgid.test \
-	setgid32.test \
-	setgroups.test \
-	setgroups32.test \
-	sethostname.test \
-	setns.test \
-	setregid.test \
-	setregid32.test \
-	setresgid.test \
-	setresgid32.test \
-	setresuid.test \
-	setresuid32.test \
-	setreuid.test \
-	setreuid32.test \
-	setrlimit.test \
-	setuid.test \
-	setuid32.test \
-	shmxt.test \
-	shutdown.test \
-	sigaction.test \
-	sigaltstack.test \
-	siginfo.test \
-	signalfd4.test \
-	sigreturn.test \
-	socketcall.test \
-	splice.test \
-	stat.test \
-	stat64.test \
-	statfs.test \
-	statfs64.test \
-	sun_path.test \
-	swap.test \
-	symlink.test \
-	symlinkat.test \
-	sync.test \
-	sync_file_range.test \
-	sync_file_range2.test \
-	sysinfo.test \
-	syslog.test \
-	tee.test \
-	time.test \
-	timer_create.test \
-	timer_xettime.test \
-	timerfd_xettime.test \
-	times-fail.test \
-	times.test \
-	truncate.test \
-	truncate64.test \
-	ugetrlimit.test \
-	uio.test \
-	umask.test \
-	umount.test \
-	umount2.test \
-	umoven-illptr.test \
-	umovestr-illptr.test \
-	umovestr.test \
-	umovestr2.test \
-	umovestr3.test \
-	uname.test \
-	unix-pair-send-recv.test \
-	unix-pair-sendto-recvfrom.test \
-	unlink.test \
-	unlinkat.test \
-	unshare.test \
-	userfaultfd.test \
-	ustat.test \
-	utime.test \
-	utimensat.test \
-	utimes.test \
-	vhangup.test \
-	vmsplice.test \
-	wait4-v.test \
-	wait4.test \
-	waitid-v.test \
-	waitid.test \
-	waitpid.test \
-	xattr-strings.test \
-	xattr.test \
-	xet_robust_list.test \
-	xetitimer.test \
-	xetpgid.test \
-	xetpriority.test \
-	xettimeofday.test \
-	# end of DECODER_TESTS
-
-MISC_TESTS = \
-	attach-f-p.test \
-	attach-p-cmd.test \
-	bexecve.test \
-	count-f.test \
-	count.test \
-	detach-running.test \
-	detach-sleeping.test \
-	detach-stopped.test \
-	filter-unavailable.test \
-	fork-f.test \
-	ksysent.test \
-	opipe.test \
-	options-syntax.test \
-	pc.test \
-	qual_fault-syntax.test \
-	qual_fault.test \
-	qual_inject-error-signal.test \
-	qual_inject-retval.test \
-	qual_inject-signal.test \
-	qual_inject-syntax.test \
-	qual_signal.test \
-	qual_syscall.test \
-	redirect-fds.test \
-	redirect.test \
-	restart_syscall.test \
-	signal_receive.test \
-	strace-C.test \
-	strace-E.test \
-	strace-S.test \
-	strace-T.test \
-	strace-V.test \
-	strace-ff.test \
-	strace-r.test \
-	strace-t.test \
-	strace-tt.test \
-	strace-ttt.test \
-	threads-execve.test \
-	vfork-f.test \
-	# end of MISC_TESTS
-
-TESTS = $(DECODER_TESTS) $(MISC_TESTS) $(LIBUNWIND_TESTS)
-
-XFAIL_TESTS_ =
-XFAIL_TESTS_m32 = $(LIBUNWIND_TESTS)
-XFAIL_TESTS_mx32 = $(LIBUNWIND_TESTS)
-XFAIL_TESTS = $(XFAIL_TESTS_$(MPERS_NAME))
-
-TEST_LOG_COMPILER = env
-AM_TEST_LOG_FLAGS = STRACE_ARCH=$(ARCH) MIPS_ABI=$(MIPS_ABI) $(srcdir)/run.sh
-
-@VALGRIND_CHECK_RULES@
-VALGRIND_FLAGS = --quiet
-VALGRIND_SUPPRESSIONS_FILES = $(srcdir)/strace.supp
-
-EXTRA_DIST = init.sh run.sh match.awk \
-	     caps-abbrev.awk \
-	     caps.awk \
-	     count-f.expected \
-	     eventfd.expected \
-	     fadvise.h \
-	     filter-unavailable.expected \
-	     fstatat.c \
-	     fstatx.c \
-	     getresugid.c \
-	     init_delete_module.h \
-	     ipc.sh \
-	     ipc_msgbuf.expected \
-	     ksysent.sed \
-	     lstatx.c \
-	     net.expected \
-	     oldselect.expected \
-	     pipe.expected \
-	     ppoll-v.expected \
-	     ppoll.expected \
-	     process_vm_readv_writev.c \
-	     qual_fault-exit_group.expected \
-	     qual_inject-error-signal.expected \
-	     qual_inject-signal.expected \
-	     quotactl.h \
-	     scno_tampering.sh \
-	     setfsugid.c \
-	     setresugid.c \
-	     setreugid.c \
-	     setugid.c \
-	     sigaction.awk \
-	     sigaltstack.expected \
-	     sockname.c \
-	     statfs.expected \
-	     statx.sh \
-	     strace-C.expected \
-	     strace-E.expected \
-	     strace-T.expected \
-	     strace-ff.expected \
-	     strace-k.test \
-	     strace-r.expected \
-	     strace.supp \
-	     struct_flock.c \
-	     sun_path.expected \
-	     uio.expected \
-	     umode_t.c \
-	     umovestr.expected \
-	     unix-pair-send-recv.expected \
-	     unix-pair-sendto-recvfrom.expected \
-	     xchownx.c \
-	     xgetrlimit.c \
-	     xselect.c \
-	     xstatfs.c \
-	     xstatfs64.c \
-	     xstatfsx.c \
-	     xstatx.c \
-	     $(TESTS)
-
-ksysent.h: $(srcdir)/ksysent.sed
-	echo '#include <asm/unistd.h>' | \
-		$(CPP) $(AM_CPPFLAGS) $(CPPFLAGS) -dM - > [email protected]
-	LC_COLLATE=C sed -r -n -f $(srcdir)/ksysent.sed < [email protected] > [email protected]
-	mv -f [email protected] $@
-	rm -f [email protected]
-
-ksysent.$(OBJEXT): ksysent.h
-
-objects = $(filter %.$(OBJEXT),$(SOURCES:.c=.$(OBJEXT)))
-$(objects): scno.h
-
-CLEANFILES = ksysent.h $(TESTS:=.tmp)
-
-include ../scno.am
diff --git a/tests/Makefile.in b/tests/Makefile.in
index 3a4d792..4a51782 100644
--- a/tests/Makefile.in
+++ b/tests/Makefile.in
@@ -17,6 +17,7 @@
 # Automake input for strace tests.
 #
 # Copyright (c) 2011-2016 Dmitry V. Levin <[email protected]>
+# Copyright (c) 2011-2017 The strace developers.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -131,148 +132,38 @@
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-check_PROGRAMS = _newselect$(EXEEXT) accept$(EXEEXT) accept4$(EXEEXT) \
-	access$(EXEEXT) acct$(EXEEXT) add_key$(EXEEXT) \
-	adjtimex$(EXEEXT) aio$(EXEEXT) alarm$(EXEEXT) answer$(EXEEXT) \
-	attach-f-p$(EXEEXT) attach-f-p-cmd$(EXEEXT) \
-	attach-p-cmd-cmd$(EXEEXT) attach-p-cmd-p$(EXEEXT) bpf$(EXEEXT) \
-	brk$(EXEEXT) btrfs$(EXEEXT) caps$(EXEEXT) caps-abbrev$(EXEEXT) \
-	chmod$(EXEEXT) chown$(EXEEXT) chown32$(EXEEXT) chroot$(EXEEXT) \
-	clock_adjtime$(EXEEXT) clock_nanosleep$(EXEEXT) \
-	clock_xettime$(EXEEXT) copy_file_range$(EXEEXT) \
-	count-f$(EXEEXT) creat$(EXEEXT) delete_module$(EXEEXT) \
-	dup$(EXEEXT) dup2$(EXEEXT) dup3$(EXEEXT) epoll_create$(EXEEXT) \
-	epoll_create1$(EXEEXT) epoll_ctl$(EXEEXT) epoll_pwait$(EXEEXT) \
-	epoll_wait$(EXEEXT) erestartsys$(EXEEXT) eventfd$(EXEEXT) \
-	execve$(EXEEXT) execve-v$(EXEEXT) execveat$(EXEEXT) \
-	execveat-v$(EXEEXT) faccessat$(EXEEXT) fadvise64$(EXEEXT) \
-	fadvise64_64$(EXEEXT) fallocate$(EXEEXT) \
-	fanotify_init$(EXEEXT) fanotify_mark$(EXEEXT) fchdir$(EXEEXT) \
-	fchmod$(EXEEXT) fchmodat$(EXEEXT) fchown$(EXEEXT) \
-	fchown32$(EXEEXT) fchownat$(EXEEXT) fcntl$(EXEEXT) \
-	fcntl64$(EXEEXT) fdatasync$(EXEEXT) file_handle$(EXEEXT) \
-	file_ioctl$(EXEEXT) filter-unavailable$(EXEEXT) \
-	finit_module$(EXEEXT) flock$(EXEEXT) fork-f$(EXEEXT) \
-	fstat$(EXEEXT) fstat64$(EXEEXT) fstatat64$(EXEEXT) \
-	fstatfs$(EXEEXT) fstatfs64$(EXEEXT) fsync$(EXEEXT) \
-	ftruncate$(EXEEXT) ftruncate64$(EXEEXT) futex$(EXEEXT) \
-	futimesat$(EXEEXT) get_mempolicy$(EXEEXT) getcpu$(EXEEXT) \
-	getcwd$(EXEEXT) getdents$(EXEEXT) getdents64$(EXEEXT) \
-	getegid$(EXEEXT) getegid32$(EXEEXT) geteuid$(EXEEXT) \
-	geteuid32$(EXEEXT) getgid$(EXEEXT) getgid32$(EXEEXT) \
-	getgroups$(EXEEXT) getgroups32$(EXEEXT) getpeername$(EXEEXT) \
-	getpgrp$(EXEEXT) getrandom$(EXEEXT) getresgid$(EXEEXT) \
-	getresgid32$(EXEEXT) getresuid$(EXEEXT) getresuid32$(EXEEXT) \
-	getrlimit$(EXEEXT) getrusage$(EXEEXT) getsid$(EXEEXT) \
-	getsockname$(EXEEXT) getuid$(EXEEXT) getuid32$(EXEEXT) \
-	getxxid$(EXEEXT) inet-cmsg$(EXEEXT) init_module$(EXEEXT) \
-	inotify$(EXEEXT) inotify_init1$(EXEEXT) ioctl$(EXEEXT) \
-	ioctl_block$(EXEEXT) ioctl_dm$(EXEEXT) ioctl_dm-v$(EXEEXT) \
-	ioctl_evdev$(EXEEXT) ioctl_evdev-v$(EXEEXT) \
-	ioctl_loop$(EXEEXT) ioctl_loop-nv$(EXEEXT) \
-	ioctl_loop-v$(EXEEXT) ioctl_mtd$(EXEEXT) ioctl_rtc$(EXEEXT) \
-	ioctl_rtc-v$(EXEEXT) ioctl_scsi$(EXEEXT) \
-	ioctl_sg_io_v3$(EXEEXT) ioctl_sg_io_v4$(EXEEXT) \
-	ioctl_sock_gifconf$(EXEEXT) ioctl_uffdio$(EXEEXT) \
-	ioctl_v4l2$(EXEEXT) ioperm$(EXEEXT) iopl$(EXEEXT) \
-	ioprio$(EXEEXT) ip_mreq$(EXEEXT) ipc$(EXEEXT) ipc_msg$(EXEEXT) \
-	ipc_msgbuf$(EXEEXT) ipc_sem$(EXEEXT) ipc_shm$(EXEEXT) \
-	kcmp$(EXEEXT) kexec_file_load$(EXEEXT) kexec_load$(EXEEXT) \
-	keyctl$(EXEEXT) kill$(EXEEXT) ksysent$(EXEEXT) lchown$(EXEEXT) \
-	lchown32$(EXEEXT) link$(EXEEXT) linkat$(EXEEXT) \
-	llseek$(EXEEXT) lookup_dcookie$(EXEEXT) lseek$(EXEEXT) \
-	lstat$(EXEEXT) lstat64$(EXEEXT) mbind$(EXEEXT) \
-	membarrier$(EXEEXT) memfd_create$(EXEEXT) \
-	migrate_pages$(EXEEXT) mincore$(EXEEXT) mkdir$(EXEEXT) \
-	mkdirat$(EXEEXT) mknod$(EXEEXT) mknodat$(EXEEXT) \
-	mlock$(EXEEXT) mlock2$(EXEEXT) mlockall$(EXEEXT) mmap$(EXEEXT) \
-	mmap64$(EXEEXT) mmsg$(EXEEXT) mmsg-silent$(EXEEXT) \
-	mmsg_name$(EXEEXT) mmsg_name-v$(EXEEXT) mount$(EXEEXT) \
-	move_pages$(EXEEXT) mq$(EXEEXT) mq_sendrecv$(EXEEXT) \
-	mq_sendrecv-read$(EXEEXT) mq_sendrecv-write$(EXEEXT) \
-	msg_control$(EXEEXT) msg_control-v$(EXEEXT) msg_name$(EXEEXT) \
-	munlockall$(EXEEXT) nanosleep$(EXEEXT) \
-	net-accept-connect$(EXEEXT) net-icmp_filter$(EXEEXT) \
-	net-sockaddr$(EXEEXT) net-y-unix$(EXEEXT) net-yy-inet$(EXEEXT) \
-	net-yy-netlink$(EXEEXT) net-yy-unix$(EXEEXT) \
-	netlink_inet_diag$(EXEEXT) netlink_netlink_diag$(EXEEXT) \
-	netlink_protocol$(EXEEXT) netlink_unix_diag$(EXEEXT) \
-	newfstatat$(EXEEXT) nsyscalls$(EXEEXT) old_mmap$(EXEEXT) \
-	oldfstat$(EXEEXT) oldlstat$(EXEEXT) oldselect$(EXEEXT) \
-	oldstat$(EXEEXT) open$(EXEEXT) openat$(EXEEXT) pause$(EXEEXT) \
-	pc$(EXEEXT) perf_event_open$(EXEEXT) \
-	perf_event_open_nonverbose$(EXEEXT) \
-	perf_event_open_unabbrev$(EXEEXT) personality$(EXEEXT) \
-	pipe$(EXEEXT) pipe2$(EXEEXT) pkey_alloc$(EXEEXT) \
-	pkey_free$(EXEEXT) pkey_mprotect$(EXEEXT) poll$(EXEEXT) \
-	ppoll$(EXEEXT) prctl-arg2-intptr$(EXEEXT) \
-	prctl-dumpable$(EXEEXT) prctl-name$(EXEEXT) \
-	prctl-no-args$(EXEEXT) prctl-pdeathsig$(EXEEXT) \
-	prctl-seccomp-filter-v$(EXEEXT) prctl-seccomp-strict$(EXEEXT) \
-	prctl-securebits$(EXEEXT) prctl-tid_address$(EXEEXT) \
-	prctl-tsc$(EXEEXT) pread64-pwrite64$(EXEEXT) preadv$(EXEEXT) \
-	preadv-pwritev$(EXEEXT) preadv2-pwritev2$(EXEEXT) \
-	print_maxfd$(EXEEXT) printstr$(EXEEXT) prlimit64$(EXEEXT) \
-	process_vm_readv$(EXEEXT) process_vm_writev$(EXEEXT) \
-	pselect6$(EXEEXT) ptrace$(EXEEXT) pwritev$(EXEEXT) \
-	qual_fault$(EXEEXT) qual_inject-error-signal$(EXEEXT) \
-	qual_inject-retval$(EXEEXT) qual_inject-signal$(EXEEXT) \
-	qual_signal$(EXEEXT) quotactl$(EXEEXT) quotactl-v$(EXEEXT) \
-	quotactl-xfs$(EXEEXT) quotactl-xfs-v$(EXEEXT) \
-	read-write$(EXEEXT) readahead$(EXEEXT) readdir$(EXEEXT) \
-	readlink$(EXEEXT) readlinkat$(EXEEXT) readv$(EXEEXT) \
-	reboot$(EXEEXT) recvfrom$(EXEEXT) recvmmsg-timeout$(EXEEXT) \
-	recvmsg$(EXEEXT) redirect-fds$(EXEEXT) \
-	remap_file_pages$(EXEEXT) rename$(EXEEXT) renameat$(EXEEXT) \
-	renameat2$(EXEEXT) request_key$(EXEEXT) \
-	restart_syscall$(EXEEXT) rmdir$(EXEEXT) rt_sigpending$(EXEEXT) \
-	rt_sigprocmask$(EXEEXT) rt_sigqueueinfo$(EXEEXT) \
-	rt_sigsuspend$(EXEEXT) rt_sigtimedwait$(EXEEXT) \
-	rt_tgsigqueueinfo$(EXEEXT) sched_get_priority_mxx$(EXEEXT) \
-	sched_rr_get_interval$(EXEEXT) sched_xetaffinity$(EXEEXT) \
-	sched_xetattr$(EXEEXT) sched_xetparam$(EXEEXT) \
-	sched_xetscheduler$(EXEEXT) sched_yield$(EXEEXT) \
-	scm_rights$(EXEEXT) seccomp-filter$(EXEEXT) \
-	seccomp-filter-v$(EXEEXT) seccomp-strict$(EXEEXT) \
-	select$(EXEEXT) semop$(EXEEXT) sendfile$(EXEEXT) \
-	sendfile64$(EXEEXT) set_mempolicy$(EXEEXT) \
-	set_ptracer_any$(EXEEXT) setdomainname$(EXEEXT) \
-	setfsgid$(EXEEXT) setfsgid32$(EXEEXT) setfsuid$(EXEEXT) \
-	setfsuid32$(EXEEXT) setgid$(EXEEXT) setgid32$(EXEEXT) \
-	setgroups$(EXEEXT) setgroups32$(EXEEXT) sethostname$(EXEEXT) \
-	setns$(EXEEXT) setregid$(EXEEXT) setregid32$(EXEEXT) \
-	setresgid$(EXEEXT) setresgid32$(EXEEXT) setresuid$(EXEEXT) \
-	setresuid32$(EXEEXT) setreuid$(EXEEXT) setreuid32$(EXEEXT) \
-	setrlimit$(EXEEXT) setuid$(EXEEXT) setuid32$(EXEEXT) \
-	shmxt$(EXEEXT) shutdown$(EXEEXT) sigaction$(EXEEXT) \
-	sigaltstack$(EXEEXT) siginfo$(EXEEXT) signal_receive$(EXEEXT) \
-	signalfd4$(EXEEXT) sigreturn$(EXEEXT) sleep$(EXEEXT) \
-	socketcall$(EXEEXT) splice$(EXEEXT) stack-fcall$(EXEEXT) \
-	stat$(EXEEXT) stat64$(EXEEXT) statfs$(EXEEXT) \
-	statfs64$(EXEEXT) swap$(EXEEXT) symlink$(EXEEXT) \
-	symlinkat$(EXEEXT) sync$(EXEEXT) sync_file_range$(EXEEXT) \
-	sync_file_range2$(EXEEXT) sysinfo$(EXEEXT) syslog$(EXEEXT) \
-	tee$(EXEEXT) threads-execve$(EXEEXT) time$(EXEEXT) \
-	timer_create$(EXEEXT) timer_xettime$(EXEEXT) \
-	timerfd_xettime$(EXEEXT) times$(EXEEXT) times-fail$(EXEEXT) \
-	truncate$(EXEEXT) truncate64$(EXEEXT) ugetrlimit$(EXEEXT) \
-	uio$(EXEEXT) umask$(EXEEXT) umount$(EXEEXT) umount2$(EXEEXT) \
-	umoven-illptr$(EXEEXT) umovestr$(EXEEXT) \
-	umovestr-illptr$(EXEEXT) umovestr2$(EXEEXT) umovestr3$(EXEEXT) \
-	uname$(EXEEXT) unix-pair-send-recv$(EXEEXT) \
-	unix-pair-sendto-recvfrom$(EXEEXT) unlink$(EXEEXT) \
-	unlinkat$(EXEEXT) unshare$(EXEEXT) userfaultfd$(EXEEXT) \
-	ustat$(EXEEXT) utime$(EXEEXT) utimensat$(EXEEXT) \
-	utimes$(EXEEXT) vfork-f$(EXEEXT) vhangup$(EXEEXT) \
-	vmsplice$(EXEEXT) wait4$(EXEEXT) wait4-v$(EXEEXT) \
-	waitid$(EXEEXT) waitid-v$(EXEEXT) waitpid$(EXEEXT) \
-	xattr$(EXEEXT) xattr-strings$(EXEEXT) xet_robust_list$(EXEEXT) \
-	xetitimer$(EXEEXT) xetpgid$(EXEEXT) xetpriority$(EXEEXT) \
-	xettimeofday$(EXEEXT)
-TESTS = $(DECODER_TESTS) $(MISC_TESTS) $(am__EXEEXT_1)
-DIST_COMMON = $(srcdir)/../scno.am $(srcdir)/Makefile.in \
+DIST_COMMON = $(srcdir)/pure_executables.am $(srcdir)/gen_tests.am \
+	$(srcdir)/../scno.am $(srcdir)/Makefile.in \
 	$(srcdir)/Makefile.am $(top_srcdir)/depcomp \
 	$(top_srcdir)/test-driver
+check_PROGRAMS = $(am__EXEEXT_1) answer$(EXEEXT) attach-f-p$(EXEEXT) \
+	attach-f-p-cmd$(EXEEXT) attach-p-cmd-cmd$(EXEEXT) \
+	attach-p-cmd-p$(EXEEXT) caps-abbrev$(EXEEXT) count-f$(EXEEXT) \
+	execve-v$(EXEEXT) execveat-v$(EXEEXT) \
+	filter-unavailable$(EXEEXT) fork-f$(EXEEXT) getpid$(EXEEXT) \
+	getppid$(EXEEXT) gettid$(EXEEXT) int_0x80$(EXEEXT) \
+	ioctl_dm-v$(EXEEXT) ioctl_evdev-v$(EXEEXT) \
+	ioctl_loop-nv$(EXEEXT) ioctl_loop-v$(EXEEXT) \
+	ioctl_nsfs$(EXEEXT) ioctl_rtc-v$(EXEEXT) ksysent$(EXEEXT) \
+	mmsg-silent$(EXEEXT) mmsg_name-v$(EXEEXT) \
+	msg_control-v$(EXEEXT) net-accept-connect$(EXEEXT) \
+	netlink_inet_diag$(EXEEXT) netlink_netlink_diag$(EXEEXT) \
+	netlink_unix_diag$(EXEEXT) nsyscalls$(EXEEXT) pc$(EXEEXT) \
+	perf_event_open_nonverbose$(EXEEXT) \
+	perf_event_open_unabbrev$(EXEEXT) ppoll-v$(EXEEXT) \
+	prctl-seccomp-filter-v$(EXEEXT) prctl-seccomp-strict$(EXEEXT) \
+	print_maxfd$(EXEEXT) qual_fault$(EXEEXT) \
+	qual_inject-error-signal$(EXEEXT) qual_inject-retval$(EXEEXT) \
+	qual_inject-signal$(EXEEXT) qual_signal$(EXEEXT) \
+	quotactl-v$(EXEEXT) quotactl-xfs-v$(EXEEXT) \
+	redirect-fds$(EXEEXT) restart_syscall$(EXEEXT) \
+	scm_rights$(EXEEXT) seccomp-filter-v$(EXEEXT) \
+	seccomp-strict$(EXEEXT) set_ptracer_any$(EXEEXT) \
+	signal_receive$(EXEEXT) sleep$(EXEEXT) stack-fcall$(EXEEXT) \
+	threads-execve$(EXEEXT) unix-pair-send-recv$(EXEEXT) \
+	unix-pair-sendto-recvfrom$(EXEEXT) vfork-f$(EXEEXT) \
+	wait4-v$(EXEEXT) waitid-v$(EXEEXT)
+TESTS = $(GEN_TESTS) $(DECODER_TESTS) $(MISC_TESTS) $(am__EXEEXT_2)
 subdir = tests
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
@@ -300,6 +191,7 @@
 	libtests_a-error_msg.$(OBJEXT) \
 	libtests_a-fill_memory.$(OBJEXT) \
 	libtests_a-get_page_size.$(OBJEXT) \
+	libtests_a-get_sigset_size.$(OBJEXT) \
 	libtests_a-hexdump_strdup.$(OBJEXT) \
 	libtests_a-hexquote_strndup.$(OBJEXT) \
 	libtests_a-inode_of_sockfd.$(OBJEXT) \
@@ -308,10 +200,130 @@
 	libtests_a-overflowuid.$(OBJEXT) \
 	libtests_a-pipe_maxfd.$(OBJEXT) \
 	libtests_a-print_quoted_string.$(OBJEXT) \
+	libtests_a-print_time.$(OBJEXT) \
 	libtests_a-printflags.$(OBJEXT) libtests_a-printxval.$(OBJEXT) \
-	libtests_a-signal2name.$(OBJEXT) libtests_a-sprintrc.$(OBJEXT) \
-	libtests_a-tail_alloc.$(OBJEXT) libtests_a-tprintf.$(OBJEXT)
+	libtests_a-signal2name.$(OBJEXT) \
+	libtests_a-skip_unavailable.$(OBJEXT) \
+	libtests_a-sprintrc.$(OBJEXT) libtests_a-tail_alloc.$(OBJEXT) \
+	libtests_a-tprintf.$(OBJEXT)
 libtests_a_OBJECTS = $(am_libtests_a_OBJECTS)
+am__EXEEXT_1 = _newselect$(EXEEXT) accept$(EXEEXT) accept4$(EXEEXT) \
+	access$(EXEEXT) acct$(EXEEXT) add_key$(EXEEXT) \
+	adjtimex$(EXEEXT) aio$(EXEEXT) alarm$(EXEEXT) bpf$(EXEEXT) \
+	brk$(EXEEXT) btrfs$(EXEEXT) caps$(EXEEXT) chmod$(EXEEXT) \
+	chown$(EXEEXT) chown32$(EXEEXT) chroot$(EXEEXT) \
+	clock_adjtime$(EXEEXT) clock_nanosleep$(EXEEXT) \
+	clock_xettime$(EXEEXT) copy_file_range$(EXEEXT) creat$(EXEEXT) \
+	delete_module$(EXEEXT) dup$(EXEEXT) dup2$(EXEEXT) \
+	dup3$(EXEEXT) epoll_create$(EXEEXT) epoll_create1$(EXEEXT) \
+	epoll_ctl$(EXEEXT) epoll_pwait$(EXEEXT) epoll_wait$(EXEEXT) \
+	erestartsys$(EXEEXT) eventfd$(EXEEXT) execve$(EXEEXT) \
+	execveat$(EXEEXT) faccessat$(EXEEXT) fadvise64$(EXEEXT) \
+	fadvise64_64$(EXEEXT) fallocate$(EXEEXT) \
+	fanotify_init$(EXEEXT) fanotify_mark$(EXEEXT) fchdir$(EXEEXT) \
+	fchmod$(EXEEXT) fchmodat$(EXEEXT) fchown$(EXEEXT) \
+	fchown32$(EXEEXT) fchownat$(EXEEXT) fcntl$(EXEEXT) \
+	fcntl64$(EXEEXT) fdatasync$(EXEEXT) file_handle$(EXEEXT) \
+	file_ioctl$(EXEEXT) finit_module$(EXEEXT) flock$(EXEEXT) \
+	fstat$(EXEEXT) fstat64$(EXEEXT) fstatat64$(EXEEXT) \
+	fstatfs$(EXEEXT) fstatfs64$(EXEEXT) fsync$(EXEEXT) \
+	ftruncate$(EXEEXT) ftruncate64$(EXEEXT) futex$(EXEEXT) \
+	futimesat$(EXEEXT) get_mempolicy$(EXEEXT) getcpu$(EXEEXT) \
+	getcwd$(EXEEXT) getdents$(EXEEXT) getdents64$(EXEEXT) \
+	getegid$(EXEEXT) getegid32$(EXEEXT) geteuid$(EXEEXT) \
+	geteuid32$(EXEEXT) getgid$(EXEEXT) getgid32$(EXEEXT) \
+	getgroups$(EXEEXT) getgroups32$(EXEEXT) getpeername$(EXEEXT) \
+	getpgrp$(EXEEXT) getpid$(EXEEXT) getppid$(EXEEXT) \
+	getrandom$(EXEEXT) getresgid$(EXEEXT) getresgid32$(EXEEXT) \
+	getresuid$(EXEEXT) getresuid32$(EXEEXT) getrlimit$(EXEEXT) \
+	getrusage$(EXEEXT) getsid$(EXEEXT) getsockname$(EXEEXT) \
+	getuid$(EXEEXT) getuid32$(EXEEXT) getxxid$(EXEEXT) \
+	inet-cmsg$(EXEEXT) init_module$(EXEEXT) inotify$(EXEEXT) \
+	inotify_init1$(EXEEXT) ioctl$(EXEEXT) ioctl_block$(EXEEXT) \
+	ioctl_dm$(EXEEXT) ioctl_evdev$(EXEEXT) ioctl_loop$(EXEEXT) \
+	ioctl_mtd$(EXEEXT) ioctl_rtc$(EXEEXT) ioctl_scsi$(EXEEXT) \
+	ioctl_sg_io_v3$(EXEEXT) ioctl_sg_io_v4$(EXEEXT) \
+	ioctl_sock_gifconf$(EXEEXT) ioctl_uffdio$(EXEEXT) \
+	ioctl_v4l2$(EXEEXT) ioperm$(EXEEXT) iopl$(EXEEXT) \
+	ioprio$(EXEEXT) ip_mreq$(EXEEXT) ipc$(EXEEXT) ipc_msg$(EXEEXT) \
+	ipc_msgbuf$(EXEEXT) ipc_sem$(EXEEXT) ipc_shm$(EXEEXT) \
+	kcmp$(EXEEXT) kexec_file_load$(EXEEXT) kexec_load$(EXEEXT) \
+	keyctl$(EXEEXT) kill$(EXEEXT) lchown$(EXEEXT) \
+	lchown32$(EXEEXT) link$(EXEEXT) linkat$(EXEEXT) \
+	llseek$(EXEEXT) lookup_dcookie$(EXEEXT) lseek$(EXEEXT) \
+	lstat$(EXEEXT) lstat64$(EXEEXT) madvise$(EXEEXT) \
+	mbind$(EXEEXT) membarrier$(EXEEXT) memfd_create$(EXEEXT) \
+	migrate_pages$(EXEEXT) mincore$(EXEEXT) mkdir$(EXEEXT) \
+	mkdirat$(EXEEXT) mknod$(EXEEXT) mknodat$(EXEEXT) \
+	mlock$(EXEEXT) mlock2$(EXEEXT) mlockall$(EXEEXT) mmap$(EXEEXT) \
+	mmap64$(EXEEXT) mmsg$(EXEEXT) mmsg_name$(EXEEXT) \
+	mount$(EXEEXT) move_pages$(EXEEXT) mq$(EXEEXT) \
+	mq_sendrecv$(EXEEXT) mq_sendrecv-read$(EXEEXT) \
+	mq_sendrecv-write$(EXEEXT) msg_control$(EXEEXT) \
+	msg_name$(EXEEXT) munlockall$(EXEEXT) nanosleep$(EXEEXT) \
+	net-icmp_filter$(EXEEXT) net-sockaddr$(EXEEXT) \
+	net-y-unix$(EXEEXT) net-yy-inet$(EXEEXT) \
+	net-yy-netlink$(EXEEXT) net-yy-unix$(EXEEXT) \
+	netlink_protocol$(EXEEXT) newfstatat$(EXEEXT) \
+	old_mmap$(EXEEXT) oldfstat$(EXEEXT) oldlstat$(EXEEXT) \
+	oldselect$(EXEEXT) oldstat$(EXEEXT) open$(EXEEXT) \
+	openat$(EXEEXT) osf_utimes$(EXEEXT) pause$(EXEEXT) \
+	perf_event_open$(EXEEXT) personality$(EXEEXT) pipe$(EXEEXT) \
+	pipe2$(EXEEXT) pkey_alloc$(EXEEXT) pkey_free$(EXEEXT) \
+	pkey_mprotect$(EXEEXT) poll$(EXEEXT) ppoll$(EXEEXT) \
+	prctl-arg2-intptr$(EXEEXT) prctl-dumpable$(EXEEXT) \
+	prctl-name$(EXEEXT) prctl-no-args$(EXEEXT) \
+	prctl-pdeathsig$(EXEEXT) prctl-securebits$(EXEEXT) \
+	prctl-tid_address$(EXEEXT) prctl-tsc$(EXEEXT) \
+	pread64-pwrite64$(EXEEXT) preadv$(EXEEXT) \
+	preadv-pwritev$(EXEEXT) preadv2-pwritev2$(EXEEXT) \
+	printstr$(EXEEXT) prlimit64$(EXEEXT) process_vm_readv$(EXEEXT) \
+	process_vm_writev$(EXEEXT) pselect6$(EXEEXT) ptrace$(EXEEXT) \
+	pwritev$(EXEEXT) quotactl$(EXEEXT) quotactl-xfs$(EXEEXT) \
+	read-write$(EXEEXT) readahead$(EXEEXT) readdir$(EXEEXT) \
+	readlink$(EXEEXT) readlinkat$(EXEEXT) readv$(EXEEXT) \
+	reboot$(EXEEXT) recvfrom$(EXEEXT) recvmmsg-timeout$(EXEEXT) \
+	recvmsg$(EXEEXT) remap_file_pages$(EXEEXT) rename$(EXEEXT) \
+	renameat$(EXEEXT) renameat2$(EXEEXT) request_key$(EXEEXT) \
+	rmdir$(EXEEXT) rt_sigpending$(EXEEXT) rt_sigprocmask$(EXEEXT) \
+	rt_sigqueueinfo$(EXEEXT) rt_sigreturn$(EXEEXT) \
+	rt_sigsuspend$(EXEEXT) rt_sigtimedwait$(EXEEXT) \
+	rt_tgsigqueueinfo$(EXEEXT) sched_get_priority_mxx$(EXEEXT) \
+	sched_rr_get_interval$(EXEEXT) sched_xetaffinity$(EXEEXT) \
+	sched_xetattr$(EXEEXT) sched_xetparam$(EXEEXT) \
+	sched_xetscheduler$(EXEEXT) sched_yield$(EXEEXT) \
+	seccomp-filter$(EXEEXT) select$(EXEEXT) semop$(EXEEXT) \
+	sendfile$(EXEEXT) sendfile64$(EXEEXT) set_mempolicy$(EXEEXT) \
+	setdomainname$(EXEEXT) setfsgid$(EXEEXT) setfsgid32$(EXEEXT) \
+	setfsuid$(EXEEXT) setfsuid32$(EXEEXT) setgid$(EXEEXT) \
+	setgid32$(EXEEXT) setgroups$(EXEEXT) setgroups32$(EXEEXT) \
+	sethostname$(EXEEXT) setns$(EXEEXT) setregid$(EXEEXT) \
+	setregid32$(EXEEXT) setresgid$(EXEEXT) setresgid32$(EXEEXT) \
+	setresuid$(EXEEXT) setresuid32$(EXEEXT) setreuid$(EXEEXT) \
+	setreuid32$(EXEEXT) setrlimit$(EXEEXT) setuid$(EXEEXT) \
+	setuid32$(EXEEXT) shmxt$(EXEEXT) shutdown$(EXEEXT) \
+	sigaction$(EXEEXT) sigaltstack$(EXEEXT) siginfo$(EXEEXT) \
+	signalfd4$(EXEEXT) sigreturn$(EXEEXT) sigsuspend$(EXEEXT) \
+	socketcall$(EXEEXT) splice$(EXEEXT) stat$(EXEEXT) \
+	stat64$(EXEEXT) statfs$(EXEEXT) statfs64$(EXEEXT) \
+	statx$(EXEEXT) swap$(EXEEXT) sxetmask$(EXEEXT) \
+	symlink$(EXEEXT) symlinkat$(EXEEXT) sync$(EXEEXT) \
+	sync_file_range$(EXEEXT) sync_file_range2$(EXEEXT) \
+	sysinfo$(EXEEXT) syslog$(EXEEXT) tee$(EXEEXT) time$(EXEEXT) \
+	timer_create$(EXEEXT) timer_xettime$(EXEEXT) \
+	timerfd_xettime$(EXEEXT) times$(EXEEXT) times-fail$(EXEEXT) \
+	truncate$(EXEEXT) truncate64$(EXEEXT) ugetrlimit$(EXEEXT) \
+	uio$(EXEEXT) umask$(EXEEXT) umount$(EXEEXT) umount2$(EXEEXT) \
+	umoven-illptr$(EXEEXT) umovestr$(EXEEXT) \
+	umovestr-illptr$(EXEEXT) umovestr2$(EXEEXT) umovestr3$(EXEEXT) \
+	uname$(EXEEXT) unlink$(EXEEXT) unlinkat$(EXEEXT) \
+	unshare$(EXEEXT) userfaultfd$(EXEEXT) ustat$(EXEEXT) \
+	utime$(EXEEXT) utimensat$(EXEEXT) utimes$(EXEEXT) \
+	vhangup$(EXEEXT) vmsplice$(EXEEXT) wait4$(EXEEXT) \
+	waitid$(EXEEXT) waitpid$(EXEEXT) xattr$(EXEEXT) \
+	xattr-strings$(EXEEXT) xet_robust_list$(EXEEXT) \
+	xetitimer$(EXEEXT) xetpgid$(EXEEXT) xetpriority$(EXEEXT) \
+	xettimeofday$(EXEEXT)
 _newselect_SOURCES = _newselect.c
 _newselect_OBJECTS = _newselect.$(OBJEXT)
 _newselect_LDADD = $(LDADD)
@@ -668,6 +680,14 @@
 getpgrp_OBJECTS = getpgrp.$(OBJEXT)
 getpgrp_LDADD = $(LDADD)
 getpgrp_DEPENDENCIES = libtests.a
+getpid_SOURCES = getpid.c
+getpid_OBJECTS = getpid.$(OBJEXT)
+getpid_LDADD = $(LDADD)
+getpid_DEPENDENCIES = libtests.a
+getppid_SOURCES = getppid.c
+getppid_OBJECTS = getppid.$(OBJEXT)
+getppid_LDADD = $(LDADD)
+getppid_DEPENDENCIES = libtests.a
 getrandom_SOURCES = getrandom.c
 getrandom_OBJECTS = getrandom.$(OBJEXT)
 getrandom_LDADD = $(LDADD)
@@ -704,6 +724,10 @@
 getsockname_OBJECTS = getsockname.$(OBJEXT)
 getsockname_LDADD = $(LDADD)
 getsockname_DEPENDENCIES = libtests.a
+gettid_SOURCES = gettid.c
+gettid_OBJECTS = gettid.$(OBJEXT)
+gettid_LDADD = $(LDADD)
+gettid_DEPENDENCIES = libtests.a
 getuid_SOURCES = getuid.c
 getuid_OBJECTS = getuid.$(OBJEXT)
 getuid_LDADD = $(LDADD)
@@ -732,6 +756,10 @@
 inotify_init1_OBJECTS = inotify_init1.$(OBJEXT)
 inotify_init1_LDADD = $(LDADD)
 inotify_init1_DEPENDENCIES = libtests.a
+int_0x80_SOURCES = int_0x80.c
+int_0x80_OBJECTS = int_0x80.$(OBJEXT)
+int_0x80_LDADD = $(LDADD)
+int_0x80_DEPENDENCIES = libtests.a
 ioctl_SOURCES = ioctl.c
 ioctl_OBJECTS = ioctl.$(OBJEXT)
 ioctl_LDADD = $(LDADD)
@@ -772,6 +800,10 @@
 ioctl_mtd_OBJECTS = ioctl_mtd.$(OBJEXT)
 ioctl_mtd_LDADD = $(LDADD)
 ioctl_mtd_DEPENDENCIES = libtests.a
+ioctl_nsfs_SOURCES = ioctl_nsfs.c
+ioctl_nsfs_OBJECTS = ioctl_nsfs.$(OBJEXT)
+ioctl_nsfs_LDADD = $(LDADD)
+ioctl_nsfs_DEPENDENCIES = libtests.a
 ioctl_rtc_SOURCES = ioctl_rtc.c
 ioctl_rtc_OBJECTS = ioctl_rtc.$(OBJEXT)
 ioctl_rtc_LDADD = $(LDADD)
@@ -900,6 +932,10 @@
 lstat64_OBJECTS = lstat64-lstat64.$(OBJEXT)
 lstat64_LDADD = $(LDADD)
 lstat64_DEPENDENCIES = libtests.a
+madvise_SOURCES = madvise.c
+madvise_OBJECTS = madvise.$(OBJEXT)
+madvise_LDADD = $(LDADD)
+madvise_DEPENDENCIES = libtests.a
 mbind_SOURCES = mbind.c
 mbind_OBJECTS = mbind.$(OBJEXT)
 mbind_LDADD = $(LDADD)
@@ -1092,6 +1128,10 @@
 openat_OBJECTS = openat.$(OBJEXT)
 openat_LDADD = $(LDADD)
 openat_DEPENDENCIES = libtests.a
+osf_utimes_SOURCES = osf_utimes.c
+osf_utimes_OBJECTS = osf_utimes.$(OBJEXT)
+osf_utimes_LDADD = $(LDADD)
+osf_utimes_DEPENDENCIES = libtests.a
 pause_SOURCES = pause.c
 pause_OBJECTS = pause.$(OBJEXT)
 pause_LDADD = $(LDADD)
@@ -1145,6 +1185,10 @@
 ppoll_OBJECTS = ppoll.$(OBJEXT)
 ppoll_LDADD = $(LDADD)
 ppoll_DEPENDENCIES = libtests.a
+ppoll_v_SOURCES = ppoll-v.c
+ppoll_v_OBJECTS = ppoll-v.$(OBJEXT)
+ppoll_v_LDADD = $(LDADD)
+ppoll_v_DEPENDENCIES = libtests.a
 prctl_arg2_intptr_SOURCES = prctl-arg2-intptr.c
 prctl_arg2_intptr_OBJECTS = prctl-arg2-intptr.$(OBJEXT)
 prctl_arg2_intptr_LDADD = $(LDADD)
@@ -1354,6 +1398,10 @@
 rt_sigqueueinfo_OBJECTS = rt_sigqueueinfo.$(OBJEXT)
 rt_sigqueueinfo_LDADD = $(LDADD)
 rt_sigqueueinfo_DEPENDENCIES = libtests.a
+rt_sigreturn_SOURCES = rt_sigreturn.c
+rt_sigreturn_OBJECTS = rt_sigreturn.$(OBJEXT)
+rt_sigreturn_LDADD = $(LDADD)
+rt_sigreturn_DEPENDENCIES = libtests.a
 rt_sigsuspend_SOURCES = rt_sigsuspend.c
 rt_sigsuspend_OBJECTS = rt_sigsuspend.$(OBJEXT)
 rt_sigsuspend_LDADD = $(LDADD)
@@ -1554,6 +1602,10 @@
 sigreturn_OBJECTS = sigreturn.$(OBJEXT)
 sigreturn_LDADD = $(LDADD)
 sigreturn_DEPENDENCIES = libtests.a
+sigsuspend_SOURCES = sigsuspend.c
+sigsuspend_OBJECTS = sigsuspend.$(OBJEXT)
+sigsuspend_LDADD = $(LDADD)
+sigsuspend_DEPENDENCIES = libtests.a
 sleep_SOURCES = sleep.c
 sleep_OBJECTS = sleep.$(OBJEXT)
 sleep_LDADD = $(LDADD)
@@ -1588,10 +1640,18 @@
 statfs64_OBJECTS = statfs64.$(OBJEXT)
 statfs64_LDADD = $(LDADD)
 statfs64_DEPENDENCIES = libtests.a
+statx_SOURCES = statx.c
+statx_OBJECTS = statx.$(OBJEXT)
+statx_LDADD = $(LDADD)
+statx_DEPENDENCIES = libtests.a
 swap_SOURCES = swap.c
 swap_OBJECTS = swap.$(OBJEXT)
 swap_LDADD = $(LDADD)
 swap_DEPENDENCIES = libtests.a
+sxetmask_SOURCES = sxetmask.c
+sxetmask_OBJECTS = sxetmask.$(OBJEXT)
+sxetmask_LDADD = $(LDADD)
+sxetmask_DEPENDENCIES = libtests.a
 symlink_SOURCES = symlink.c
 symlink_OBJECTS = symlink.$(OBJEXT)
 symlink_LDADD = $(LDADD)
@@ -1853,35 +1913,36 @@
 	futex.c futimesat.c get_mempolicy.c getcpu.c getcwd.c \
 	getdents.c getdents64.c getegid.c getegid32.c geteuid.c \
 	geteuid32.c getgid.c getgid32.c getgroups.c getgroups32.c \
-	getpeername.c getpgrp.c getrandom.c getresgid.c getresgid32.c \
-	getresuid.c getresuid32.c getrlimit.c getrusage.c getsid.c \
-	getsockname.c getuid.c getuid32.c getxxid.c inet-cmsg.c \
-	init_module.c inotify.c inotify_init1.c ioctl.c ioctl_block.c \
+	getpeername.c getpgrp.c getpid.c getppid.c getrandom.c \
+	getresgid.c getresgid32.c getresuid.c getresuid32.c \
+	getrlimit.c getrusage.c getsid.c getsockname.c gettid.c \
+	getuid.c getuid32.c getxxid.c inet-cmsg.c init_module.c \
+	inotify.c inotify_init1.c int_0x80.c ioctl.c ioctl_block.c \
 	ioctl_dm.c ioctl_dm-v.c ioctl_evdev.c ioctl_evdev-v.c \
 	ioctl_loop.c ioctl_loop-nv.c ioctl_loop-v.c ioctl_mtd.c \
-	ioctl_rtc.c ioctl_rtc-v.c ioctl_scsi.c ioctl_sg_io_v3.c \
-	ioctl_sg_io_v4.c ioctl_sock_gifconf.c ioctl_uffdio.c \
-	ioctl_v4l2.c ioperm.c iopl.c ioprio.c ip_mreq.c ipc.c \
-	ipc_msg.c ipc_msgbuf.c ipc_sem.c ipc_shm.c kcmp.c \
+	ioctl_nsfs.c ioctl_rtc.c ioctl_rtc-v.c ioctl_scsi.c \
+	ioctl_sg_io_v3.c ioctl_sg_io_v4.c ioctl_sock_gifconf.c \
+	ioctl_uffdio.c ioctl_v4l2.c ioperm.c iopl.c ioprio.c ip_mreq.c \
+	ipc.c ipc_msg.c ipc_msgbuf.c ipc_sem.c ipc_shm.c kcmp.c \
 	kexec_file_load.c kexec_load.c keyctl.c kill.c ksysent.c \
 	lchown.c lchown32.c link.c linkat.c llseek.c lookup_dcookie.c \
-	lseek.c lstat.c lstat64.c mbind.c membarrier.c memfd_create.c \
-	migrate_pages.c mincore.c mkdir.c mkdirat.c mknod.c mknodat.c \
-	mlock.c mlock2.c mlockall.c mmap.c mmap64.c mmsg.c \
-	mmsg-silent.c mmsg_name.c mmsg_name-v.c mount.c move_pages.c \
-	mq.c mq_sendrecv.c mq_sendrecv-read.c mq_sendrecv-write.c \
-	msg_control.c msg_control-v.c msg_name.c munlockall.c \
-	nanosleep.c net-accept-connect.c net-icmp_filter.c \
-	net-sockaddr.c net-y-unix.c net-yy-inet.c net-yy-netlink.c \
-	net-yy-unix.c netlink_inet_diag.c netlink_netlink_diag.c \
-	netlink_protocol.c netlink_unix_diag.c newfstatat.c \
-	nsyscalls.c old_mmap.c oldfstat.c oldlstat.c oldselect.c \
-	oldstat.c open.c openat.c pause.c pc.c perf_event_open.c \
-	perf_event_open_nonverbose.c perf_event_open_unabbrev.c \
-	personality.c pipe.c pipe2.c pkey_alloc.c pkey_free.c \
-	pkey_mprotect.c poll.c ppoll.c prctl-arg2-intptr.c \
-	prctl-dumpable.c prctl-name.c prctl-no-args.c \
-	prctl-pdeathsig.c prctl-seccomp-filter-v.c \
+	lseek.c lstat.c lstat64.c madvise.c mbind.c membarrier.c \
+	memfd_create.c migrate_pages.c mincore.c mkdir.c mkdirat.c \
+	mknod.c mknodat.c mlock.c mlock2.c mlockall.c mmap.c mmap64.c \
+	mmsg.c mmsg-silent.c mmsg_name.c mmsg_name-v.c mount.c \
+	move_pages.c mq.c mq_sendrecv.c mq_sendrecv-read.c \
+	mq_sendrecv-write.c msg_control.c msg_control-v.c msg_name.c \
+	munlockall.c nanosleep.c net-accept-connect.c \
+	net-icmp_filter.c net-sockaddr.c net-y-unix.c net-yy-inet.c \
+	net-yy-netlink.c net-yy-unix.c netlink_inet_diag.c \
+	netlink_netlink_diag.c netlink_protocol.c netlink_unix_diag.c \
+	newfstatat.c nsyscalls.c old_mmap.c oldfstat.c oldlstat.c \
+	oldselect.c oldstat.c open.c openat.c osf_utimes.c pause.c \
+	pc.c perf_event_open.c perf_event_open_nonverbose.c \
+	perf_event_open_unabbrev.c personality.c pipe.c pipe2.c \
+	pkey_alloc.c pkey_free.c pkey_mprotect.c poll.c ppoll.c \
+	ppoll-v.c prctl-arg2-intptr.c prctl-dumpable.c prctl-name.c \
+	prctl-no-args.c prctl-pdeathsig.c prctl-seccomp-filter-v.c \
 	prctl-seccomp-strict.c prctl-securebits.c prctl-tid_address.c \
 	prctl-tsc.c pread64-pwrite64.c preadv.c preadv-pwritev.c \
 	preadv2-pwritev2.c print_maxfd.c printstr.c prlimit64.c \
@@ -1894,21 +1955,22 @@
 	redirect-fds.c remap_file_pages.c rename.c renameat.c \
 	renameat2.c request_key.c restart_syscall.c rmdir.c \
 	rt_sigpending.c rt_sigprocmask.c rt_sigqueueinfo.c \
-	rt_sigsuspend.c rt_sigtimedwait.c rt_tgsigqueueinfo.c \
-	sched_get_priority_mxx.c sched_rr_get_interval.c \
-	sched_xetaffinity.c sched_xetattr.c sched_xetparam.c \
-	sched_xetscheduler.c sched_yield.c scm_rights.c \
-	seccomp-filter.c seccomp-filter-v.c seccomp-strict.c select.c \
-	semop.c sendfile.c sendfile64.c set_mempolicy.c \
-	set_ptracer_any.c setdomainname.c setfsgid.c setfsgid32.c \
-	setfsuid.c setfsuid32.c setgid.c setgid32.c setgroups.c \
-	setgroups32.c sethostname.c setns.c setregid.c setregid32.c \
-	setresgid.c setresgid32.c setresuid.c setresuid32.c setreuid.c \
-	setreuid32.c setrlimit.c setuid.c setuid32.c shmxt.c \
-	shutdown.c sigaction.c sigaltstack.c siginfo.c \
-	signal_receive.c signalfd4.c sigreturn.c sleep.c socketcall.c \
-	splice.c $(stack_fcall_SOURCES) stat.c stat64.c statfs.c \
-	statfs64.c swap.c symlink.c symlinkat.c sync.c \
+	rt_sigreturn.c rt_sigsuspend.c rt_sigtimedwait.c \
+	rt_tgsigqueueinfo.c sched_get_priority_mxx.c \
+	sched_rr_get_interval.c sched_xetaffinity.c sched_xetattr.c \
+	sched_xetparam.c sched_xetscheduler.c sched_yield.c \
+	scm_rights.c seccomp-filter.c seccomp-filter-v.c \
+	seccomp-strict.c select.c semop.c sendfile.c sendfile64.c \
+	set_mempolicy.c set_ptracer_any.c setdomainname.c setfsgid.c \
+	setfsgid32.c setfsuid.c setfsuid32.c setgid.c setgid32.c \
+	setgroups.c setgroups32.c sethostname.c setns.c setregid.c \
+	setregid32.c setresgid.c setresgid32.c setresuid.c \
+	setresuid32.c setreuid.c setreuid32.c setrlimit.c setuid.c \
+	setuid32.c shmxt.c shutdown.c sigaction.c sigaltstack.c \
+	siginfo.c signal_receive.c signalfd4.c sigreturn.c \
+	sigsuspend.c sleep.c socketcall.c splice.c \
+	$(stack_fcall_SOURCES) stat.c stat64.c statfs.c statfs64.c \
+	statx.c swap.c sxetmask.c symlink.c symlinkat.c sync.c \
 	sync_file_range.c sync_file_range2.c sysinfo.c syslog.c tee.c \
 	threads-execve.c time.c timer_create.c timer_xettime.c \
 	timerfd_xettime.c times.c times-fail.c truncate.c truncate64.c \
@@ -1938,35 +2000,36 @@
 	futex.c futimesat.c get_mempolicy.c getcpu.c getcwd.c \
 	getdents.c getdents64.c getegid.c getegid32.c geteuid.c \
 	geteuid32.c getgid.c getgid32.c getgroups.c getgroups32.c \
-	getpeername.c getpgrp.c getrandom.c getresgid.c getresgid32.c \
-	getresuid.c getresuid32.c getrlimit.c getrusage.c getsid.c \
-	getsockname.c getuid.c getuid32.c getxxid.c inet-cmsg.c \
-	init_module.c inotify.c inotify_init1.c ioctl.c ioctl_block.c \
+	getpeername.c getpgrp.c getpid.c getppid.c getrandom.c \
+	getresgid.c getresgid32.c getresuid.c getresuid32.c \
+	getrlimit.c getrusage.c getsid.c getsockname.c gettid.c \
+	getuid.c getuid32.c getxxid.c inet-cmsg.c init_module.c \
+	inotify.c inotify_init1.c int_0x80.c ioctl.c ioctl_block.c \
 	ioctl_dm.c ioctl_dm-v.c ioctl_evdev.c ioctl_evdev-v.c \
 	ioctl_loop.c ioctl_loop-nv.c ioctl_loop-v.c ioctl_mtd.c \
-	ioctl_rtc.c ioctl_rtc-v.c ioctl_scsi.c ioctl_sg_io_v3.c \
-	ioctl_sg_io_v4.c ioctl_sock_gifconf.c ioctl_uffdio.c \
-	ioctl_v4l2.c ioperm.c iopl.c ioprio.c ip_mreq.c ipc.c \
-	ipc_msg.c ipc_msgbuf.c ipc_sem.c ipc_shm.c kcmp.c \
+	ioctl_nsfs.c ioctl_rtc.c ioctl_rtc-v.c ioctl_scsi.c \
+	ioctl_sg_io_v3.c ioctl_sg_io_v4.c ioctl_sock_gifconf.c \
+	ioctl_uffdio.c ioctl_v4l2.c ioperm.c iopl.c ioprio.c ip_mreq.c \
+	ipc.c ipc_msg.c ipc_msgbuf.c ipc_sem.c ipc_shm.c kcmp.c \
 	kexec_file_load.c kexec_load.c keyctl.c kill.c ksysent.c \
 	lchown.c lchown32.c link.c linkat.c llseek.c lookup_dcookie.c \
-	lseek.c lstat.c lstat64.c mbind.c membarrier.c memfd_create.c \
-	migrate_pages.c mincore.c mkdir.c mkdirat.c mknod.c mknodat.c \
-	mlock.c mlock2.c mlockall.c mmap.c mmap64.c mmsg.c \
-	mmsg-silent.c mmsg_name.c mmsg_name-v.c mount.c move_pages.c \
-	mq.c mq_sendrecv.c mq_sendrecv-read.c mq_sendrecv-write.c \
-	msg_control.c msg_control-v.c msg_name.c munlockall.c \
-	nanosleep.c net-accept-connect.c net-icmp_filter.c \
-	net-sockaddr.c net-y-unix.c net-yy-inet.c net-yy-netlink.c \
-	net-yy-unix.c netlink_inet_diag.c netlink_netlink_diag.c \
-	netlink_protocol.c netlink_unix_diag.c newfstatat.c \
-	nsyscalls.c old_mmap.c oldfstat.c oldlstat.c oldselect.c \
-	oldstat.c open.c openat.c pause.c pc.c perf_event_open.c \
-	perf_event_open_nonverbose.c perf_event_open_unabbrev.c \
-	personality.c pipe.c pipe2.c pkey_alloc.c pkey_free.c \
-	pkey_mprotect.c poll.c ppoll.c prctl-arg2-intptr.c \
-	prctl-dumpable.c prctl-name.c prctl-no-args.c \
-	prctl-pdeathsig.c prctl-seccomp-filter-v.c \
+	lseek.c lstat.c lstat64.c madvise.c mbind.c membarrier.c \
+	memfd_create.c migrate_pages.c mincore.c mkdir.c mkdirat.c \
+	mknod.c mknodat.c mlock.c mlock2.c mlockall.c mmap.c mmap64.c \
+	mmsg.c mmsg-silent.c mmsg_name.c mmsg_name-v.c mount.c \
+	move_pages.c mq.c mq_sendrecv.c mq_sendrecv-read.c \
+	mq_sendrecv-write.c msg_control.c msg_control-v.c msg_name.c \
+	munlockall.c nanosleep.c net-accept-connect.c \
+	net-icmp_filter.c net-sockaddr.c net-y-unix.c net-yy-inet.c \
+	net-yy-netlink.c net-yy-unix.c netlink_inet_diag.c \
+	netlink_netlink_diag.c netlink_protocol.c netlink_unix_diag.c \
+	newfstatat.c nsyscalls.c old_mmap.c oldfstat.c oldlstat.c \
+	oldselect.c oldstat.c open.c openat.c osf_utimes.c pause.c \
+	pc.c perf_event_open.c perf_event_open_nonverbose.c \
+	perf_event_open_unabbrev.c personality.c pipe.c pipe2.c \
+	pkey_alloc.c pkey_free.c pkey_mprotect.c poll.c ppoll.c \
+	ppoll-v.c prctl-arg2-intptr.c prctl-dumpable.c prctl-name.c \
+	prctl-no-args.c prctl-pdeathsig.c prctl-seccomp-filter-v.c \
 	prctl-seccomp-strict.c prctl-securebits.c prctl-tid_address.c \
 	prctl-tsc.c pread64-pwrite64.c preadv.c preadv-pwritev.c \
 	preadv2-pwritev2.c print_maxfd.c printstr.c prlimit64.c \
@@ -1979,21 +2042,22 @@
 	redirect-fds.c remap_file_pages.c rename.c renameat.c \
 	renameat2.c request_key.c restart_syscall.c rmdir.c \
 	rt_sigpending.c rt_sigprocmask.c rt_sigqueueinfo.c \
-	rt_sigsuspend.c rt_sigtimedwait.c rt_tgsigqueueinfo.c \
-	sched_get_priority_mxx.c sched_rr_get_interval.c \
-	sched_xetaffinity.c sched_xetattr.c sched_xetparam.c \
-	sched_xetscheduler.c sched_yield.c scm_rights.c \
-	seccomp-filter.c seccomp-filter-v.c seccomp-strict.c select.c \
-	semop.c sendfile.c sendfile64.c set_mempolicy.c \
-	set_ptracer_any.c setdomainname.c setfsgid.c setfsgid32.c \
-	setfsuid.c setfsuid32.c setgid.c setgid32.c setgroups.c \
-	setgroups32.c sethostname.c setns.c setregid.c setregid32.c \
-	setresgid.c setresgid32.c setresuid.c setresuid32.c setreuid.c \
-	setreuid32.c setrlimit.c setuid.c setuid32.c shmxt.c \
-	shutdown.c sigaction.c sigaltstack.c siginfo.c \
-	signal_receive.c signalfd4.c sigreturn.c sleep.c socketcall.c \
-	splice.c $(stack_fcall_SOURCES) stat.c stat64.c statfs.c \
-	statfs64.c swap.c symlink.c symlinkat.c sync.c \
+	rt_sigreturn.c rt_sigsuspend.c rt_sigtimedwait.c \
+	rt_tgsigqueueinfo.c sched_get_priority_mxx.c \
+	sched_rr_get_interval.c sched_xetaffinity.c sched_xetattr.c \
+	sched_xetparam.c sched_xetscheduler.c sched_yield.c \
+	scm_rights.c seccomp-filter.c seccomp-filter-v.c \
+	seccomp-strict.c select.c semop.c sendfile.c sendfile64.c \
+	set_mempolicy.c set_ptracer_any.c setdomainname.c setfsgid.c \
+	setfsgid32.c setfsuid.c setfsuid32.c setgid.c setgid32.c \
+	setgroups.c setgroups32.c sethostname.c setns.c setregid.c \
+	setregid32.c setresgid.c setresgid32.c setresuid.c \
+	setresuid32.c setreuid.c setreuid32.c setrlimit.c setuid.c \
+	setuid32.c shmxt.c shutdown.c sigaction.c sigaltstack.c \
+	siginfo.c signal_receive.c signalfd4.c sigreturn.c \
+	sigsuspend.c sleep.c socketcall.c splice.c \
+	$(stack_fcall_SOURCES) stat.c stat64.c statfs.c statfs64.c \
+	statx.c swap.c sxetmask.c symlink.c symlinkat.c sync.c \
 	sync_file_range.c sync_file_range2.c sysinfo.c syslog.c tee.c \
 	threads-execve.c time.c timer_create.c timer_xettime.c \
 	timerfd_xettime.c times.c times-fail.c truncate.c truncate64.c \
@@ -2214,7 +2278,7 @@
   bases=`echo $$bases`
 RECHECK_LOGS = $(TEST_LOGS)
 AM_RECURSIVE_TARGETS = check recheck
-@USE_LIBUNWIND_TRUE@am__EXEEXT_1 = strace-k.test
+@USE_LIBUNWIND_TRUE@am__EXEEXT_2 = strace-k.test
 TEST_SUITE_LOG = test-suite.log
 TEST_EXTENSIONS = @EXEEXT@ .test
 am__test_logs1 = $(TESTS:=.log)
@@ -2253,6 +2317,7 @@
 CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
 CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
 CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
+COPYRIGHT_YEAR = @COPYRIGHT_YEAR@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CPPFLAGS_FOR_BUILD = @CPPFLAGS_FOR_BUILD@
@@ -2389,6 +2454,7 @@
 	error_msg.c \
 	fill_memory.c \
 	get_page_size.c \
+	get_sigset_size.c \
 	hexdump_strdup.c \
 	hexquote_strndup.c \
 	inode_of_sockfd.c \
@@ -2397,9 +2463,11 @@
 	overflowuid.c \
 	pipe_maxfd.c \
 	print_quoted_string.c \
+	print_time.c \
 	printflags.c \
 	printxval.c \
 	signal2name.c \
+	skip_unavailable.c \
 	sprintrc.c \
 	tail_alloc.c \
 	tests.h \
@@ -2409,6 +2477,340 @@
 libtests_a_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
 check_LIBRARIES = libtests.a
 LDADD = libtests.a
+
+# Generated by ./tests/gen_pure_executables.sh from ./tests/pure_executables.list; do not edit.
+PURE_EXECUTABLES = \
+  _newselect \
+  accept \
+  accept4 \
+  access \
+  acct \
+  add_key \
+  adjtimex \
+  aio \
+  alarm \
+  bpf \
+  brk \
+  btrfs \
+  caps \
+  chmod \
+  chown \
+  chown32 \
+  chroot \
+  clock_adjtime \
+  clock_nanosleep \
+  clock_xettime \
+  copy_file_range \
+  creat \
+  delete_module \
+  dup \
+  dup2 \
+  dup3 \
+  epoll_create \
+  epoll_create1 \
+  epoll_ctl \
+  epoll_pwait \
+  epoll_wait \
+  erestartsys \
+  eventfd \
+  execve \
+  execveat \
+  faccessat \
+  fadvise64 \
+  fadvise64_64 \
+  fallocate \
+  fanotify_init \
+  fanotify_mark \
+  fchdir \
+  fchmod \
+  fchmodat \
+  fchown \
+  fchown32 \
+  fchownat \
+  fcntl \
+  fcntl64 \
+  fdatasync \
+  file_handle \
+  file_ioctl \
+  finit_module \
+  flock \
+  fstat \
+  fstat64 \
+  fstatat64 \
+  fstatfs \
+  fstatfs64 \
+  fsync \
+  ftruncate \
+  ftruncate64 \
+  futex \
+  futimesat \
+  get_mempolicy \
+  getcpu \
+  getcwd \
+  getdents \
+  getdents64 \
+  getegid \
+  getegid32 \
+  geteuid \
+  geteuid32 \
+  getgid \
+  getgid32 \
+  getgroups \
+  getgroups32 \
+  getpeername \
+  getpgrp \
+  getpid \
+  getppid \
+  getrandom \
+  getresgid \
+  getresgid32 \
+  getresuid \
+  getresuid32 \
+  getrlimit \
+  getrusage \
+  getsid \
+  getsockname \
+  getuid \
+  getuid32 \
+  getxxid \
+  inet-cmsg \
+  init_module \
+  inotify \
+  inotify_init1 \
+  ioctl \
+  ioctl_block \
+  ioctl_dm \
+  ioctl_evdev \
+  ioctl_loop \
+  ioctl_mtd \
+  ioctl_rtc \
+  ioctl_scsi \
+  ioctl_sg_io_v3 \
+  ioctl_sg_io_v4 \
+  ioctl_sock_gifconf \
+  ioctl_uffdio \
+  ioctl_v4l2 \
+  ioperm \
+  iopl \
+  ioprio \
+  ip_mreq \
+  ipc \
+  ipc_msg \
+  ipc_msgbuf \
+  ipc_sem \
+  ipc_shm \
+  kcmp \
+  kexec_file_load \
+  kexec_load \
+  keyctl \
+  kill \
+  lchown \
+  lchown32 \
+  link \
+  linkat \
+  llseek \
+  lookup_dcookie \
+  lseek \
+  lstat \
+  lstat64 \
+  madvise \
+  mbind \
+  membarrier \
+  memfd_create \
+  migrate_pages \
+  mincore \
+  mkdir \
+  mkdirat \
+  mknod \
+  mknodat \
+  mlock \
+  mlock2 \
+  mlockall \
+  mmap \
+  mmap64 \
+  mmsg \
+  mmsg_name \
+  mount \
+  move_pages \
+  mq \
+  mq_sendrecv \
+  mq_sendrecv-read \
+  mq_sendrecv-write \
+  msg_control \
+  msg_name \
+  munlockall \
+  nanosleep \
+  net-icmp_filter \
+  net-sockaddr \
+  net-y-unix \
+  net-yy-inet \
+  net-yy-netlink \
+  net-yy-unix \
+  netlink_protocol \
+  newfstatat \
+  old_mmap \
+  oldfstat \
+  oldlstat \
+  oldselect \
+  oldstat \
+  open \
+  openat \
+  osf_utimes \
+  pause \
+  perf_event_open \
+  personality \
+  pipe \
+  pipe2 \
+  pkey_alloc \
+  pkey_free \
+  pkey_mprotect \
+  poll \
+  ppoll \
+  prctl-arg2-intptr \
+  prctl-dumpable \
+  prctl-name \
+  prctl-no-args \
+  prctl-pdeathsig \
+  prctl-securebits \
+  prctl-tid_address \
+  prctl-tsc \
+  pread64-pwrite64 \
+  preadv \
+  preadv-pwritev \
+  preadv2-pwritev2 \
+  printstr \
+  prlimit64 \
+  process_vm_readv \
+  process_vm_writev \
+  pselect6 \
+  ptrace \
+  pwritev \
+  quotactl \
+  quotactl-xfs \
+  read-write \
+  readahead \
+  readdir \
+  readlink \
+  readlinkat \
+  readv \
+  reboot \
+  recvfrom \
+  recvmmsg-timeout \
+  recvmsg \
+  remap_file_pages \
+  rename \
+  renameat \
+  renameat2 \
+  request_key \
+  rmdir \
+  rt_sigpending \
+  rt_sigprocmask \
+  rt_sigqueueinfo \
+  rt_sigreturn \
+  rt_sigsuspend \
+  rt_sigtimedwait \
+  rt_tgsigqueueinfo \
+  sched_get_priority_mxx \
+  sched_rr_get_interval \
+  sched_xetaffinity \
+  sched_xetattr \
+  sched_xetparam \
+  sched_xetscheduler \
+  sched_yield \
+  seccomp-filter \
+  select \
+  semop \
+  sendfile \
+  sendfile64 \
+  set_mempolicy \
+  setdomainname \
+  setfsgid \
+  setfsgid32 \
+  setfsuid \
+  setfsuid32 \
+  setgid \
+  setgid32 \
+  setgroups \
+  setgroups32 \
+  sethostname \
+  setns \
+  setregid \
+  setregid32 \
+  setresgid \
+  setresgid32 \
+  setresuid \
+  setresuid32 \
+  setreuid \
+  setreuid32 \
+  setrlimit \
+  setuid \
+  setuid32 \
+  shmxt \
+  shutdown \
+  sigaction \
+  sigaltstack \
+  siginfo \
+  signalfd4 \
+  sigreturn \
+  sigsuspend \
+  socketcall \
+  splice \
+  stat \
+  stat64 \
+  statfs \
+  statfs64 \
+  statx \
+  swap \
+  sxetmask \
+  symlink \
+  symlinkat \
+  sync \
+  sync_file_range \
+  sync_file_range2 \
+  sysinfo \
+  syslog \
+  tee \
+  time \
+  timer_create \
+  timer_xettime \
+  timerfd_xettime \
+  times \
+  times-fail \
+  truncate \
+  truncate64 \
+  ugetrlimit \
+  uio \
+  umask \
+  umount \
+  umount2 \
+  umoven-illptr \
+  umovestr \
+  umovestr-illptr \
+  umovestr2 \
+  umovestr3 \
+  uname \
+  unlink \
+  unlinkat \
+  unshare \
+  userfaultfd \
+  ustat \
+  utime \
+  utimensat \
+  utimes \
+  vhangup \
+  vmsplice \
+  wait4 \
+  waitid \
+  waitpid \
+  xattr \
+  xattr-strings \
+  xet_robust_list \
+  xetitimer \
+  xetpgid \
+  xetpriority \
+  xettimeofday \
+  #
+
 attach_f_p_LDADD = -lrt -lpthread $(LDADD)
 clock_xettime_LDADD = -lrt $(LDADD)
 count_f_LDADD = -lpthread $(LDADD)
@@ -2437,209 +2839,159 @@
 stack_fcall_SOURCES = stack-fcall.c \
 	stack-fcall-0.c stack-fcall-1.c stack-fcall-2.c stack-fcall-3.c
 
+
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in; do not edit.
+GEN_TESTS = _newselect.gen.test accept.gen.test accept4.gen.test \
+	access.gen.test acct.gen.test add_key.gen.test \
+	adjtimex.gen.test aio.gen.test alarm.gen.test bpf.gen.test \
+	btrfs.gen.test chmod.gen.test chown.gen.test chown32.gen.test \
+	chroot.gen.test clock.gen.test clock_adjtime.gen.test \
+	clock_nanosleep.gen.test clock_xettime.gen.test \
+	copy_file_range.gen.test creat.gen.test delete_module.gen.test \
+	dup.gen.test dup2.gen.test dup3.gen.test epoll_create.gen.test \
+	epoll_create1.gen.test epoll_ctl.gen.test epoll_pwait.gen.test \
+	epoll_wait.gen.test erestartsys.gen.test execveat.gen.test \
+	execveat-v.gen.test faccessat.gen.test fadvise64_64.gen.test \
+	fallocate.gen.test fanotify_init.gen.test \
+	fanotify_mark.gen.test fchdir.gen.test fchmod.gen.test \
+	fchmodat.gen.test fchown.gen.test fchown32.gen.test \
+	fchownat.gen.test fcntl.gen.test fcntl64.gen.test \
+	fdatasync.gen.test file_handle.gen.test file_ioctl.gen.test \
+	finit_module.gen.test flock.gen.test fork-f.gen.test \
+	fstat.gen.test fstat64.gen.test fstatat64.gen.test \
+	fstatfs.gen.test fstatfs64.gen.test fsync.gen.test \
+	ftruncate.gen.test ftruncate64.gen.test futimesat.gen.test \
+	get_mempolicy.gen.test getcpu.gen.test getcwd.gen.test \
+	getdents.gen.test getdents64.gen.test getegid.gen.test \
+	getegid32.gen.test geteuid.gen.test geteuid32.gen.test \
+	getgid.gen.test getgid32.gen.test getgroups.gen.test \
+	getgroups32.gen.test getpeername.gen.test getpgrp.gen.test \
+	getpid.gen.test getppid.gen.test getrandom.gen.test \
+	getresgid.gen.test getresgid32.gen.test getresuid.gen.test \
+	getresuid32.gen.test getrlimit.gen.test getrusage.gen.test \
+	getsid.gen.test getsockname.gen.test gettid.gen.test \
+	getuid32.gen.test getxxid.gen.test inet-cmsg.gen.test \
+	init_module.gen.test inotify.gen.test inotify_init1.gen.test \
+	int_0x80.gen.test ioctl_block.gen.test ioctl_evdev.gen.test \
+	ioctl_evdev-v.gen.test ioctl_loop.gen.test \
+	ioctl_loop-v.gen.test ioctl_mtd.gen.test ioctl_rtc.gen.test \
+	ioctl_rtc-v.gen.test ioctl_scsi.gen.test \
+	ioctl_sg_io_v3.gen.test ioctl_sg_io_v4.gen.test \
+	ioctl_uffdio.gen.test ioctl_v4l2.gen.test ioperm.gen.test \
+	iopl.gen.test ioprio.gen.test ip_mreq.gen.test ipc.gen.test \
+	ipc_msg.gen.test ipc_sem.gen.test ipc_shm.gen.test \
+	kcmp.gen.test kexec_file_load.gen.test kexec_load.gen.test \
+	keyctl.gen.test kill.gen.test lchown.gen.test \
+	lchown32.gen.test link.gen.test linkat.gen.test \
+	lookup_dcookie.gen.test lstat.gen.test lstat64.gen.test \
+	madvise.gen.test mbind.gen.test membarrier.gen.test \
+	memfd_create.gen.test migrate_pages.gen.test mincore.gen.test \
+	mkdir.gen.test mkdirat.gen.test mknod.gen.test \
+	mknodat.gen.test mlock.gen.test mlock2.gen.test \
+	mlockall.gen.test mmap64.gen.test mmsg.gen.test \
+	mmsg-silent.gen.test mmsg_name.gen.test mmsg_name-v.gen.test \
+	mount.gen.test move_pages.gen.test mq.gen.test \
+	mq_sendrecv.gen.test mq_sendrecv-read.gen.test \
+	mq_sendrecv-write.gen.test msg_control.gen.test \
+	msg_control-v.gen.test msg_name.gen.test munlockall.gen.test \
+	nanosleep.gen.test net-icmp_filter.gen.test \
+	net-sockaddr.gen.test netlink_protocol.gen.test \
+	newfstatat.gen.test old_mmap.gen.test oldfstat.gen.test \
+	oldlstat.gen.test oldstat.gen.test open.gen.test \
+	openat.gen.test osf_utimes.gen.test pause.gen.test \
+	perf_event_open.gen.test perf_event_open_nonverbose.gen.test \
+	perf_event_open_unabbrev.gen.test pipe2.gen.test \
+	pkey_alloc.gen.test pkey_free.gen.test pkey_mprotect.gen.test \
+	ppoll.gen.test ppoll-v.gen.test pread64-pwrite64.gen.test \
+	preadv.gen.test preadv-pwritev.gen.test \
+	preadv2-pwritev2.gen.test printstr.gen.test prlimit64.gen.test \
+	process_vm_readv.gen.test process_vm_writev.gen.test \
+	pselect6.gen.test ptrace.gen.test pwritev.gen.test \
+	quotactl.gen.test quotactl-v.gen.test quotactl-xfs.gen.test \
+	quotactl-xfs-v.gen.test read-write.gen.test readahead.gen.test \
+	readdir.gen.test readlink.gen.test readlinkat.gen.test \
+	reboot.gen.test recvfrom.gen.test recvmmsg-timeout.gen.test \
+	recvmsg.gen.test regex.gen.test remap_file_pages.gen.test \
+	rename.gen.test renameat.gen.test renameat2.gen.test \
+	request_key.gen.test rmdir.gen.test rt_sigpending.gen.test \
+	rt_sigprocmask.gen.test rt_sigqueueinfo.gen.test \
+	rt_sigreturn.gen.test rt_sigsuspend.gen.test \
+	rt_sigtimedwait.gen.test rt_tgsigqueueinfo.gen.test \
+	sched.gen.test sched_get_priority_mxx.gen.test \
+	sched_rr_get_interval.gen.test sched_xetaffinity.gen.test \
+	sched_xetattr.gen.test sched_xetparam.gen.test \
+	sched_xetscheduler.gen.test sched_yield.gen.test \
+	seccomp-filter.gen.test seccomp-filter-v.gen.test \
+	select.gen.test semop.gen.test sendfile.gen.test \
+	sendfile64.gen.test set_mempolicy.gen.test \
+	setdomainname.gen.test setfsgid.gen.test setfsgid32.gen.test \
+	setfsuid.gen.test setfsuid32.gen.test setgid.gen.test \
+	setgid32.gen.test setgroups.gen.test setgroups32.gen.test \
+	sethostname.gen.test setns.gen.test setregid.gen.test \
+	setregid32.gen.test setresgid.gen.test setresgid32.gen.test \
+	setresuid.gen.test setresuid32.gen.test setreuid.gen.test \
+	setreuid32.gen.test setrlimit.gen.test setuid.gen.test \
+	setuid32.gen.test shmxt.gen.test shutdown.gen.test \
+	siginfo.gen.test signal_receive.gen.test signalfd4.gen.test \
+	sigreturn.gen.test sigsuspend.gen.test socketcall.gen.test \
+	splice.gen.test stat.gen.test stat64.gen.test statfs.gen.test \
+	statfs64.gen.test statx.gen.test swap.gen.test \
+	sxetmask.gen.test symlink.gen.test symlinkat.gen.test \
+	sync.gen.test sync_file_range.gen.test \
+	sync_file_range2.gen.test sysinfo.gen.test syslog.gen.test \
+	tee.gen.test time.gen.test timer_create.gen.test \
+	timer_xettime.gen.test timerfd_xettime.gen.test times.gen.test \
+	times-fail.gen.test trace_fstat.gen.test \
+	trace_fstatfs.gen.test trace_lstat.gen.test \
+	trace_question.gen.test trace_stat.gen.test \
+	trace_stat_like.gen.test trace_statfs.gen.test \
+	trace_statfs_like.gen.test truncate.gen.test \
+	truncate64.gen.test ugetrlimit.gen.test umask.gen.test \
+	umoven-illptr.gen.test umovestr-illptr.gen.test \
+	umovestr3.gen.test unlink.gen.test unlinkat.gen.test \
+	unshare.gen.test userfaultfd.gen.test ustat.gen.test \
+	utime.gen.test utimensat.gen.test utimes.gen.test \
+	vfork-f.gen.test vhangup.gen.test vmsplice.gen.test \
+	wait4.gen.test wait4-v.gen.test waitid.gen.test \
+	waitid-v.gen.test waitpid.gen.test xattr.gen.test \
+	xattr-strings.gen.test xet_robust_list.gen.test \
+	xetitimer.gen.test xetpgid.gen.test xetpriority.gen.test \
+	xettimeofday.gen.test
 @USE_LIBUNWIND_FALSE@LIBUNWIND_TESTS = 
 @USE_LIBUNWIND_TRUE@LIBUNWIND_TESTS = strace-k.test
 DECODER_TESTS = \
-	_newselect.test \
-	accept.test \
-	accept4.test \
-	access.test \
-	acct.test \
-	add_key.test \
-	adjtimex.test \
-	aio.test \
-	alarm.test \
-	bpf.test \
 	brk.test \
 	btrfs-v.test \
 	btrfs-vw.test \
 	btrfs-w.test \
-	btrfs.test \
 	caps-abbrev.test \
 	caps.test \
-	chmod.test \
-	chown.test \
-	chown32.test \
-	chroot.test \
-	clock_adjtime.test \
-	clock_nanosleep.test \
-	clock_xettime.test \
-	copy_file_range.test \
-	creat.test \
-	delete_module.test \
-	dup.test \
-	dup2.test \
-	dup3.test \
-	epoll_create.test \
-	epoll_create1.test \
-	epoll_ctl.test \
-	epoll_pwait.test \
-	epoll_wait.test \
-	erestartsys.test \
 	eventfd.test \
 	execve-v.test \
 	execve.test \
-	execveat-v.test \
-	execveat.test \
-	faccessat.test \
 	fadvise64.test \
-	fadvise64_64.test \
-	fallocate.test \
-	fanotify_init.test \
-	fanotify_mark.test \
-	fchdir.test \
-	fchmod.test \
-	fchmodat.test \
-	fchown.test \
-	fchown32.test \
-	fchownat.test \
-	fcntl.test \
-	fcntl64.test \
-	fdatasync.test \
-	file_handle.test \
-	file_ioctl.test \
-	finit_module.test \
-	flock.test \
-	fstat.test \
-	fstat64.test \
-	fstatat64.test \
-	fstatfs.test \
-	fstatfs64.test \
-	fsync.test \
-	ftruncate.test \
-	ftruncate64.test \
 	futex.test \
-	futimesat.test \
-	get_mempolicy.test \
-	getcpu.test \
-	getcwd.test \
-	getdents.test \
-	getdents64.test \
-	getegid.test \
-	getegid32.test \
-	geteuid.test \
-	geteuid32.test \
-	getgid.test \
-	getgid32.test \
-	getgroups.test \
-	getgroups32.test \
-	getpeername.test \
-	getpgrp.test \
-	getrandom.test \
-	getresgid.test \
-	getresgid32.test \
-	getresuid.test \
-	getresuid32.test \
-	getrlimit.test \
-	getrusage.test \
-	getsid.test \
-	getsockname.test \
 	getuid.test \
-	getuid32.test \
-	getxxid.test \
-	inet-cmsg.test \
-	init_module.test \
-	inotify.test \
-	inotify_init1.test \
 	ioctl.test \
-	ioctl_block.test \
 	ioctl_dm-v.test \
 	ioctl_dm.test \
-	ioctl_evdev-v.test \
-	ioctl_evdev.test \
 	ioctl_loop-nv.test \
-	ioctl_loop-v.test \
-	ioctl_loop.test \
-	ioctl_mtd.test \
-	ioctl_rtc-v.test \
-	ioctl_rtc.test \
-	ioctl_scsi.test \
-	ioctl_sg_io_v3.test \
-	ioctl_sg_io_v4.test \
+	ioctl_nsfs.test \
 	ioctl_sock_gifconf.test \
-	ioctl_uffdio.test \
-	ioctl_v4l2.test \
-	ioperm.test \
-	iopl.test \
-	ioprio.test \
-	ip_mreq.test \
-	ipc.test \
-	ipc_msg.test \
 	ipc_msgbuf.test \
-	ipc_sem.test \
-	ipc_shm.test \
-	kcmp.test \
-	kexec_file_load.test \
-	kexec_load.test \
-	keyctl.test \
-	kill.test \
-	lchown.test \
-	lchown32.test \
-	link.test \
-	linkat.test \
 	llseek.test \
-	lookup_dcookie.test \
 	lseek.test \
-	lstat.test \
-	lstat64.test \
-	mbind.test \
-	membarrier.test \
-	memfd_create.test \
-	migrate_pages.test \
-	mincore.test \
-	mkdir.test \
-	mkdirat.test \
-	mknod.test \
-	mknodat.test \
-	mlock.test \
-	mlock2.test \
-	mlockall.test \
 	mmap.test \
-	mmap64.test \
-	mmsg-silent.test \
-	mmsg.test \
-	mmsg_name-v.test \
-	mmsg_name.test \
-	mount.test \
-	move_pages.test \
-	mq.test \
-	mq_sendrecv-read.test \
-	mq_sendrecv-write.test \
-	mq_sendrecv.test \
-	msg_control-v.test \
-	msg_control.test \
-	msg_name.test \
-	munlockall.test \
-	nanosleep.test \
-	net-icmp_filter.test \
-	net-sockaddr.test \
 	net-y-unix.test \
 	net-yy-inet.test \
 	net-yy-netlink.test \
 	net-yy-unix.test \
 	net.test \
-	netlink_protocol.test \
-	newfstatat.test \
 	nsyscalls.test \
-	old_mmap.test \
-	oldfstat.test \
-	oldlstat.test \
 	oldselect.test \
-	oldstat.test \
-	open.test \
-	openat.test \
-	pause.test \
-	perf_event_open.test \
-	perf_event_open_nonverbose.test \
-	perf_event_open_unabbrev.test \
 	personality.test \
 	pipe.test \
-	pipe2.test \
-	pkey_alloc.test \
-	pkey_free.test \
-	pkey_mprotect.test \
 	poll.test \
-	ppoll.test \
 	prctl-arg2-intptr.test \
 	prctl-dumpable.test \
 	prctl-name.test \
@@ -2650,148 +3002,21 @@
 	prctl-securebits.test \
 	prctl-tid_address.test \
 	prctl-tsc.test \
-	pread64-pwrite64.test \
-	preadv-pwritev.test \
-	preadv.test \
-	preadv2-pwritev2.test \
-	printstr.test \
-	prlimit64.test \
-	process_vm_readv.test \
-	process_vm_writev.test \
-	pselect6.test \
-	ptrace.test \
-	pwritev.test \
 	qual_fault-exit_group.test \
-	quotactl-v.test \
-	quotactl-xfs-v.test \
-	quotactl-xfs.test \
-	quotactl.test \
-	read-write.test \
-	readahead.test \
-	readdir.test \
-	readlink.test \
-	readlinkat.test \
 	readv.test \
-	reboot.test \
-	recvfrom.test \
-	recvmmsg-timeout.test \
-	recvmsg.test \
-	remap_file_pages.test \
-	rename.test \
-	renameat.test \
-	renameat2.test \
-	request_key.test \
-	rmdir.test \
-	rt_sigpending.test \
-	rt_sigprocmask.test \
-	rt_sigqueueinfo.test \
-	rt_sigsuspend.test \
-	rt_sigtimedwait.test \
-	rt_tgsigqueueinfo.test \
-	sched_get_priority_mxx.test \
-	sched_rr_get_interval.test \
-	sched_xetaffinity.test \
-	sched_xetattr.test \
-	sched_xetparam.test \
-	sched_xetscheduler.test \
-	sched_yield.test \
 	scm_rights-fd.test \
-	seccomp-filter-v.test \
-	seccomp-filter.test \
 	seccomp-strict.test \
-	select.test \
-	semop.test \
-	sendfile.test \
-	sendfile64.test \
-	set_mempolicy.test \
-	setdomainname.test \
-	setfsgid.test \
-	setfsgid32.test \
-	setfsuid.test \
-	setfsuid32.test \
-	setgid.test \
-	setgid32.test \
-	setgroups.test \
-	setgroups32.test \
-	sethostname.test \
-	setns.test \
-	setregid.test \
-	setregid32.test \
-	setresgid.test \
-	setresgid32.test \
-	setresuid.test \
-	setresuid32.test \
-	setreuid.test \
-	setreuid32.test \
-	setrlimit.test \
-	setuid.test \
-	setuid32.test \
-	shmxt.test \
-	shutdown.test \
 	sigaction.test \
 	sigaltstack.test \
-	siginfo.test \
-	signalfd4.test \
-	sigreturn.test \
-	socketcall.test \
-	splice.test \
-	stat.test \
-	stat64.test \
-	statfs.test \
-	statfs64.test \
 	sun_path.test \
-	swap.test \
-	symlink.test \
-	symlinkat.test \
-	sync.test \
-	sync_file_range.test \
-	sync_file_range2.test \
-	sysinfo.test \
-	syslog.test \
-	tee.test \
-	time.test \
-	timer_create.test \
-	timer_xettime.test \
-	timerfd_xettime.test \
-	times-fail.test \
-	times.test \
-	truncate.test \
-	truncate64.test \
-	ugetrlimit.test \
 	uio.test \
-	umask.test \
 	umount.test \
 	umount2.test \
-	umoven-illptr.test \
-	umovestr-illptr.test \
 	umovestr.test \
 	umovestr2.test \
-	umovestr3.test \
 	uname.test \
 	unix-pair-send-recv.test \
 	unix-pair-sendto-recvfrom.test \
-	unlink.test \
-	unlinkat.test \
-	unshare.test \
-	userfaultfd.test \
-	ustat.test \
-	utime.test \
-	utimensat.test \
-	utimes.test \
-	vhangup.test \
-	vmsplice.test \
-	wait4-v.test \
-	wait4.test \
-	waitid-v.test \
-	waitid.test \
-	waitpid.test \
-	xattr-strings.test \
-	xattr.test \
-	xet_robust_list.test \
-	xetitimer.test \
-	xetpgid.test \
-	xetpriority.test \
-	xettimeofday.test \
 	# end of DECODER_TESTS
 
 MISC_TESTS = \
@@ -2804,7 +3029,7 @@
 	detach-sleeping.test \
 	detach-stopped.test \
 	filter-unavailable.test \
-	fork-f.test \
+	get_regs.test \
 	ksysent.test \
 	opipe.test \
 	options-syntax.test \
@@ -2820,7 +3045,6 @@
 	redirect-fds.test \
 	redirect.test \
 	restart_syscall.test \
-	signal_receive.test \
 	strace-C.test \
 	strace-E.test \
 	strace-S.test \
@@ -2832,77 +3056,94 @@
 	strace-tt.test \
 	strace-ttt.test \
 	threads-execve.test \
-	vfork-f.test \
 	# end of MISC_TESTS
 
 XFAIL_TESTS_ = 
 XFAIL_TESTS_m32 = $(LIBUNWIND_TESTS)
 XFAIL_TESTS_mx32 = $(LIBUNWIND_TESTS)
-XFAIL_TESTS = $(XFAIL_TESTS_$(MPERS_NAME))
+XFAIL_TESTS_x86_64 = int_0x80.gen.test
+XFAIL_TESTS_x32 = int_0x80.gen.test
+XFAIL_TESTS = $(XFAIL_TESTS_$(MPERS_NAME)) $(XFAIL_TESTS_$(ARCH))
 TEST_LOG_COMPILER = env
 AM_TEST_LOG_FLAGS = STRACE_ARCH=$(ARCH) MIPS_ABI=$(MIPS_ABI) $(srcdir)/run.sh
 VALGRIND_FLAGS = --quiet
 VALGRIND_SUPPRESSIONS_FILES = $(srcdir)/strace.supp
-EXTRA_DIST = init.sh run.sh match.awk \
-	     caps-abbrev.awk \
-	     caps.awk \
-	     count-f.expected \
-	     eventfd.expected \
-	     fadvise.h \
-	     filter-unavailable.expected \
-	     fstatat.c \
-	     fstatx.c \
-	     getresugid.c \
-	     init_delete_module.h \
-	     ipc.sh \
-	     ipc_msgbuf.expected \
-	     ksysent.sed \
-	     lstatx.c \
-	     net.expected \
-	     oldselect.expected \
-	     pipe.expected \
-	     ppoll-v.expected \
-	     ppoll.expected \
-	     process_vm_readv_writev.c \
-	     qual_fault-exit_group.expected \
-	     qual_inject-error-signal.expected \
-	     qual_inject-signal.expected \
-	     quotactl.h \
-	     scno_tampering.sh \
-	     setfsugid.c \
-	     setresugid.c \
-	     setreugid.c \
-	     setugid.c \
-	     sigaction.awk \
-	     sigaltstack.expected \
-	     sockname.c \
-	     statfs.expected \
-	     statx.sh \
-	     strace-C.expected \
-	     strace-E.expected \
-	     strace-T.expected \
-	     strace-ff.expected \
-	     strace-k.test \
-	     strace-r.expected \
-	     strace.supp \
-	     struct_flock.c \
-	     sun_path.expected \
-	     uio.expected \
-	     umode_t.c \
-	     umovestr.expected \
-	     unix-pair-send-recv.expected \
-	     unix-pair-sendto-recvfrom.expected \
-	     xchownx.c \
-	     xgetrlimit.c \
-	     xselect.c \
-	     xstatfs.c \
-	     xstatfs64.c \
-	     xstatfsx.c \
-	     xstatx.c \
-	     $(TESTS)
+EXTRA_DIST = \
+	caps-abbrev.awk \
+	caps.awk \
+	clock.in \
+	count-f.expected \
+	eventfd.expected \
+	fadvise.h \
+	filter-unavailable.expected \
+	fstatat.c \
+	fstatx.c \
+	gen_pure_executables.sh \
+	gen_tests.in \
+	gen_tests.sh \
+	getresugid.c \
+	init.sh \
+	init_delete_module.h \
+	ioctl-v.sh \
+	ipc.sh \
+	ipc_msgbuf.expected \
+	ksysent.sed \
+	lstatx.c \
+	match.awk \
+	net.expected \
+	oldselect.expected \
+	pipe.expected \
+	process_vm_readv_writev.c \
+	pure_executables.list \
+	qual_fault-exit_group.expected \
+	qual_inject-error-signal.expected \
+	qual_inject-signal.expected \
+	quotactl.h \
+	regex.in \
+	run.sh \
+	sched.in \
+	scno_tampering.sh \
+	setfsugid.c \
+	setresugid.c \
+	setreugid.c \
+	setugid.c \
+	sigaction.awk \
+	sigaltstack.expected \
+	sockname.c \
+	strace-C.expected \
+	strace-E.expected \
+	strace-T.expected \
+	strace-ff.expected \
+	strace-k.test \
+	strace-r.expected \
+	strace.supp \
+	struct_flock.c \
+	sun_path.expected \
+	trace_fstat.in \
+	trace_fstatfs.in \
+	trace_lstat.in \
+	trace_question.in \
+	trace_stat.in \
+	trace_stat_like.in \
+	trace_statfs.in \
+	trace_statfs_like.in \
+	uio.expected \
+	umode_t.c \
+	umovestr.expected \
+	unix-pair-send-recv.expected \
+	unix-pair-sendto-recvfrom.expected \
+	xchownx.c \
+	xgetrlimit.c \
+	xselect.c \
+	xstatfs.c \
+	xstatfs64.c \
+	xstatfsx.c \
+	xstatx.c \
+	xutimes.c \
+	$(TESTS)
 
 objects = $(filter %.$(OBJEXT),$(SOURCES:.c=.$(OBJEXT)))
-CLEANFILES = ksysent.h $(TESTS:=.tmp) syscallent.i scno.h
+CLEANFILES = ksysent.h syscallent.i scno.h
 SCNO_CPPFLAGS = $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
 		$(ARCH_MFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS)
 
@@ -2913,7 +3154,7 @@
 
 .SUFFIXES:
 .SUFFIXES: .c .log .o .obj .test .test$(EXEEXT) .trs
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/../scno.am $(am__configure_deps)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/pure_executables.am $(srcdir)/gen_tests.am $(srcdir)/../scno.am $(am__configure_deps)
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
@@ -2934,7 +3175,7 @@
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(srcdir)/../scno.am:
+$(srcdir)/pure_executables.am $(srcdir)/gen_tests.am $(srcdir)/../scno.am:
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -3316,6 +3557,14 @@
 	@rm -f getpgrp$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(getpgrp_OBJECTS) $(getpgrp_LDADD) $(LIBS)
 
+getpid$(EXEEXT): $(getpid_OBJECTS) $(getpid_DEPENDENCIES) $(EXTRA_getpid_DEPENDENCIES) 
+	@rm -f getpid$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(getpid_OBJECTS) $(getpid_LDADD) $(LIBS)
+
+getppid$(EXEEXT): $(getppid_OBJECTS) $(getppid_DEPENDENCIES) $(EXTRA_getppid_DEPENDENCIES) 
+	@rm -f getppid$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(getppid_OBJECTS) $(getppid_LDADD) $(LIBS)
+
 getrandom$(EXEEXT): $(getrandom_OBJECTS) $(getrandom_DEPENDENCIES) $(EXTRA_getrandom_DEPENDENCIES) 
 	@rm -f getrandom$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(getrandom_OBJECTS) $(getrandom_LDADD) $(LIBS)
@@ -3352,6 +3601,10 @@
 	@rm -f getsockname$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(getsockname_OBJECTS) $(getsockname_LDADD) $(LIBS)
 
+gettid$(EXEEXT): $(gettid_OBJECTS) $(gettid_DEPENDENCIES) $(EXTRA_gettid_DEPENDENCIES) 
+	@rm -f gettid$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(gettid_OBJECTS) $(gettid_LDADD) $(LIBS)
+
 getuid$(EXEEXT): $(getuid_OBJECTS) $(getuid_DEPENDENCIES) $(EXTRA_getuid_DEPENDENCIES) 
 	@rm -f getuid$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(getuid_OBJECTS) $(getuid_LDADD) $(LIBS)
@@ -3380,6 +3633,10 @@
 	@rm -f inotify_init1$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(inotify_init1_OBJECTS) $(inotify_init1_LDADD) $(LIBS)
 
+int_0x80$(EXEEXT): $(int_0x80_OBJECTS) $(int_0x80_DEPENDENCIES) $(EXTRA_int_0x80_DEPENDENCIES) 
+	@rm -f int_0x80$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(int_0x80_OBJECTS) $(int_0x80_LDADD) $(LIBS)
+
 ioctl$(EXEEXT): $(ioctl_OBJECTS) $(ioctl_DEPENDENCIES) $(EXTRA_ioctl_DEPENDENCIES) 
 	@rm -f ioctl$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(ioctl_OBJECTS) $(ioctl_LDADD) $(LIBS)
@@ -3420,6 +3677,10 @@
 	@rm -f ioctl_mtd$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(ioctl_mtd_OBJECTS) $(ioctl_mtd_LDADD) $(LIBS)
 
+ioctl_nsfs$(EXEEXT): $(ioctl_nsfs_OBJECTS) $(ioctl_nsfs_DEPENDENCIES) $(EXTRA_ioctl_nsfs_DEPENDENCIES) 
+	@rm -f ioctl_nsfs$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(ioctl_nsfs_OBJECTS) $(ioctl_nsfs_LDADD) $(LIBS)
+
 ioctl_rtc$(EXEEXT): $(ioctl_rtc_OBJECTS) $(ioctl_rtc_DEPENDENCIES) $(EXTRA_ioctl_rtc_DEPENDENCIES) 
 	@rm -f ioctl_rtc$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(ioctl_rtc_OBJECTS) $(ioctl_rtc_LDADD) $(LIBS)
@@ -3548,6 +3809,10 @@
 	@rm -f lstat64$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(lstat64_OBJECTS) $(lstat64_LDADD) $(LIBS)
 
+madvise$(EXEEXT): $(madvise_OBJECTS) $(madvise_DEPENDENCIES) $(EXTRA_madvise_DEPENDENCIES) 
+	@rm -f madvise$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(madvise_OBJECTS) $(madvise_LDADD) $(LIBS)
+
 mbind$(EXEEXT): $(mbind_OBJECTS) $(mbind_DEPENDENCIES) $(EXTRA_mbind_DEPENDENCIES) 
 	@rm -f mbind$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(mbind_OBJECTS) $(mbind_LDADD) $(LIBS)
@@ -3744,6 +4009,10 @@
 	@rm -f openat$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(openat_OBJECTS) $(openat_LDADD) $(LIBS)
 
+osf_utimes$(EXEEXT): $(osf_utimes_OBJECTS) $(osf_utimes_DEPENDENCIES) $(EXTRA_osf_utimes_DEPENDENCIES) 
+	@rm -f osf_utimes$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(osf_utimes_OBJECTS) $(osf_utimes_LDADD) $(LIBS)
+
 pause$(EXEEXT): $(pause_OBJECTS) $(pause_DEPENDENCIES) $(EXTRA_pause_DEPENDENCIES) 
 	@rm -f pause$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(pause_OBJECTS) $(pause_LDADD) $(LIBS)
@@ -3796,6 +4065,10 @@
 	@rm -f ppoll$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(ppoll_OBJECTS) $(ppoll_LDADD) $(LIBS)
 
+ppoll-v$(EXEEXT): $(ppoll_v_OBJECTS) $(ppoll_v_DEPENDENCIES) $(EXTRA_ppoll_v_DEPENDENCIES) 
+	@rm -f ppoll-v$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(ppoll_v_OBJECTS) $(ppoll_v_LDADD) $(LIBS)
+
 prctl-arg2-intptr$(EXEEXT): $(prctl_arg2_intptr_OBJECTS) $(prctl_arg2_intptr_DEPENDENCIES) $(EXTRA_prctl_arg2_intptr_DEPENDENCIES) 
 	@rm -f prctl-arg2-intptr$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(prctl_arg2_intptr_OBJECTS) $(prctl_arg2_intptr_LDADD) $(LIBS)
@@ -4004,6 +4277,10 @@
 	@rm -f rt_sigqueueinfo$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(rt_sigqueueinfo_OBJECTS) $(rt_sigqueueinfo_LDADD) $(LIBS)
 
+rt_sigreturn$(EXEEXT): $(rt_sigreturn_OBJECTS) $(rt_sigreturn_DEPENDENCIES) $(EXTRA_rt_sigreturn_DEPENDENCIES) 
+	@rm -f rt_sigreturn$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(rt_sigreturn_OBJECTS) $(rt_sigreturn_LDADD) $(LIBS)
+
 rt_sigsuspend$(EXEEXT): $(rt_sigsuspend_OBJECTS) $(rt_sigsuspend_DEPENDENCIES) $(EXTRA_rt_sigsuspend_DEPENDENCIES) 
 	@rm -f rt_sigsuspend$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(rt_sigsuspend_OBJECTS) $(rt_sigsuspend_LDADD) $(LIBS)
@@ -4204,6 +4481,10 @@
 	@rm -f sigreturn$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(sigreturn_OBJECTS) $(sigreturn_LDADD) $(LIBS)
 
+sigsuspend$(EXEEXT): $(sigsuspend_OBJECTS) $(sigsuspend_DEPENDENCIES) $(EXTRA_sigsuspend_DEPENDENCIES) 
+	@rm -f sigsuspend$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(sigsuspend_OBJECTS) $(sigsuspend_LDADD) $(LIBS)
+
 sleep$(EXEEXT): $(sleep_OBJECTS) $(sleep_DEPENDENCIES) $(EXTRA_sleep_DEPENDENCIES) 
 	@rm -f sleep$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(sleep_OBJECTS) $(sleep_LDADD) $(LIBS)
@@ -4236,10 +4517,18 @@
 	@rm -f statfs64$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(statfs64_OBJECTS) $(statfs64_LDADD) $(LIBS)
 
+statx$(EXEEXT): $(statx_OBJECTS) $(statx_DEPENDENCIES) $(EXTRA_statx_DEPENDENCIES) 
+	@rm -f statx$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(statx_OBJECTS) $(statx_LDADD) $(LIBS)
+
 swap$(EXEEXT): $(swap_OBJECTS) $(swap_DEPENDENCIES) $(EXTRA_swap_DEPENDENCIES) 
 	@rm -f swap$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(swap_OBJECTS) $(swap_LDADD) $(LIBS)
 
+sxetmask$(EXEEXT): $(sxetmask_OBJECTS) $(sxetmask_DEPENDENCIES) $(EXTRA_sxetmask_DEPENDENCIES) 
+	@rm -f sxetmask$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(sxetmask_OBJECTS) $(sxetmask_LDADD) $(LIBS)
+
 symlink$(EXEEXT): $(symlink_OBJECTS) $(symlink_DEPENDENCIES) $(EXTRA_symlink_DEPENDENCIES) 
 	@rm -f symlink$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(symlink_OBJECTS) $(symlink_LDADD) $(LIBS)
@@ -4548,6 +4837,8 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getgroups32.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getpeername.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getpgrp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getpid.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getppid.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getrandom.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getresgid.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getresgid32.Po@am__quote@
@@ -4557,6 +4848,7 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getrusage.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getsid.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getsockname.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gettid.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getuid.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getuid32.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getxxid.Po@am__quote@
@@ -4564,6 +4856,7 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init_module.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inotify.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inotify_init1.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/int_0x80.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ioctl.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ioctl_block.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ioctl_dm-v.Po@am__quote@
@@ -4574,6 +4867,7 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ioctl_loop-v.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ioctl_loop.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ioctl_mtd.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ioctl_nsfs.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ioctl_rtc-v.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ioctl_rtc.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ioctl_scsi.Po@am__quote@
@@ -4603,6 +4897,7 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-error_msg.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-fill_memory.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-get_page_size.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-get_sigset_size.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-hexdump_strdup.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-hexquote_strndup.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-inode_of_sockfd.Po@am__quote@
@@ -4611,9 +4906,11 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-overflowuid.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-pipe_maxfd.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-print_quoted_string.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-print_time.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-printflags.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-printxval.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-signal2name.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-skip_unavailable.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-sprintrc.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-tail_alloc.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-tprintf.Po@am__quote@
@@ -4624,6 +4921,7 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lseek.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lstat.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lstat64-lstat64.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/madvise.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbind.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/membarrier.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memfd_create.Po@am__quote@
@@ -4673,6 +4971,7 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oldstat.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/open.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/osf_utimes.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pause.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pc.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/perf_event_open.Po@am__quote@
@@ -4685,6 +4984,7 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pkey_free.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pkey_mprotect.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poll.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppoll-v.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppoll.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prctl-arg2-intptr.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prctl-dumpable.Po@am__quote@
@@ -4738,6 +5038,7 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rt_sigpending.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rt_sigprocmask.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rt_sigqueueinfo.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rt_sigreturn.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rt_sigsuspend.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rt_sigtimedwait.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rt_tgsigqueueinfo.Po@am__quote@
@@ -4788,6 +5089,7 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/signal_receive.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/signalfd4.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sigreturn.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sigsuspend.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sleep.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/socketcall.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/splice.Po@am__quote@
@@ -4800,7 +5102,9 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stat64-stat64.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/statfs-statfs.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/statfs64.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/statx.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/swap.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sxetmask.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/symlink.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/symlinkat.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync.Po@am__quote@
@@ -4925,6 +5229,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtests_a-get_page_size.obj `if test -f 'get_page_size.c'; then $(CYGPATH_W) 'get_page_size.c'; else $(CYGPATH_W) '$(srcdir)/get_page_size.c'; fi`
 
+libtests_a-get_sigset_size.o: get_sigset_size.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtests_a-get_sigset_size.o -MD -MP -MF $(DEPDIR)/libtests_a-get_sigset_size.Tpo -c -o libtests_a-get_sigset_size.o `test -f 'get_sigset_size.c' || echo '$(srcdir)/'`get_sigset_size.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libtests_a-get_sigset_size.Tpo $(DEPDIR)/libtests_a-get_sigset_size.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='get_sigset_size.c' object='libtests_a-get_sigset_size.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtests_a-get_sigset_size.o `test -f 'get_sigset_size.c' || echo '$(srcdir)/'`get_sigset_size.c
+
+libtests_a-get_sigset_size.obj: get_sigset_size.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtests_a-get_sigset_size.obj -MD -MP -MF $(DEPDIR)/libtests_a-get_sigset_size.Tpo -c -o libtests_a-get_sigset_size.obj `if test -f 'get_sigset_size.c'; then $(CYGPATH_W) 'get_sigset_size.c'; else $(CYGPATH_W) '$(srcdir)/get_sigset_size.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libtests_a-get_sigset_size.Tpo $(DEPDIR)/libtests_a-get_sigset_size.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='get_sigset_size.c' object='libtests_a-get_sigset_size.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtests_a-get_sigset_size.obj `if test -f 'get_sigset_size.c'; then $(CYGPATH_W) 'get_sigset_size.c'; else $(CYGPATH_W) '$(srcdir)/get_sigset_size.c'; fi`
+
 libtests_a-hexdump_strdup.o: hexdump_strdup.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtests_a-hexdump_strdup.o -MD -MP -MF $(DEPDIR)/libtests_a-hexdump_strdup.Tpo -c -o libtests_a-hexdump_strdup.o `test -f 'hexdump_strdup.c' || echo '$(srcdir)/'`hexdump_strdup.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libtests_a-hexdump_strdup.Tpo $(DEPDIR)/libtests_a-hexdump_strdup.Po
@@ -5037,6 +5355,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtests_a-print_quoted_string.obj `if test -f 'print_quoted_string.c'; then $(CYGPATH_W) 'print_quoted_string.c'; else $(CYGPATH_W) '$(srcdir)/print_quoted_string.c'; fi`
 
+libtests_a-print_time.o: print_time.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtests_a-print_time.o -MD -MP -MF $(DEPDIR)/libtests_a-print_time.Tpo -c -o libtests_a-print_time.o `test -f 'print_time.c' || echo '$(srcdir)/'`print_time.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libtests_a-print_time.Tpo $(DEPDIR)/libtests_a-print_time.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='print_time.c' object='libtests_a-print_time.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtests_a-print_time.o `test -f 'print_time.c' || echo '$(srcdir)/'`print_time.c
+
+libtests_a-print_time.obj: print_time.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtests_a-print_time.obj -MD -MP -MF $(DEPDIR)/libtests_a-print_time.Tpo -c -o libtests_a-print_time.obj `if test -f 'print_time.c'; then $(CYGPATH_W) 'print_time.c'; else $(CYGPATH_W) '$(srcdir)/print_time.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libtests_a-print_time.Tpo $(DEPDIR)/libtests_a-print_time.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='print_time.c' object='libtests_a-print_time.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtests_a-print_time.obj `if test -f 'print_time.c'; then $(CYGPATH_W) 'print_time.c'; else $(CYGPATH_W) '$(srcdir)/print_time.c'; fi`
+
 libtests_a-printflags.o: printflags.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtests_a-printflags.o -MD -MP -MF $(DEPDIR)/libtests_a-printflags.Tpo -c -o libtests_a-printflags.o `test -f 'printflags.c' || echo '$(srcdir)/'`printflags.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libtests_a-printflags.Tpo $(DEPDIR)/libtests_a-printflags.Po
@@ -5079,6 +5411,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtests_a-signal2name.obj `if test -f 'signal2name.c'; then $(CYGPATH_W) 'signal2name.c'; else $(CYGPATH_W) '$(srcdir)/signal2name.c'; fi`
 
+libtests_a-skip_unavailable.o: skip_unavailable.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtests_a-skip_unavailable.o -MD -MP -MF $(DEPDIR)/libtests_a-skip_unavailable.Tpo -c -o libtests_a-skip_unavailable.o `test -f 'skip_unavailable.c' || echo '$(srcdir)/'`skip_unavailable.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libtests_a-skip_unavailable.Tpo $(DEPDIR)/libtests_a-skip_unavailable.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='skip_unavailable.c' object='libtests_a-skip_unavailable.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtests_a-skip_unavailable.o `test -f 'skip_unavailable.c' || echo '$(srcdir)/'`skip_unavailable.c
+
+libtests_a-skip_unavailable.obj: skip_unavailable.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtests_a-skip_unavailable.obj -MD -MP -MF $(DEPDIR)/libtests_a-skip_unavailable.Tpo -c -o libtests_a-skip_unavailable.obj `if test -f 'skip_unavailable.c'; then $(CYGPATH_W) 'skip_unavailable.c'; else $(CYGPATH_W) '$(srcdir)/skip_unavailable.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libtests_a-skip_unavailable.Tpo $(DEPDIR)/libtests_a-skip_unavailable.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='skip_unavailable.c' object='libtests_a-skip_unavailable.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtests_a-skip_unavailable.obj `if test -f 'skip_unavailable.c'; then $(CYGPATH_W) 'skip_unavailable.c'; else $(CYGPATH_W) '$(srcdir)/skip_unavailable.c'; fi`
+
 libtests_a-sprintrc.o: sprintrc.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtests_a-sprintrc.o -MD -MP -MF $(DEPDIR)/libtests_a-sprintrc.Tpo -c -o libtests_a-sprintrc.o `test -f 'sprintrc.c' || echo '$(srcdir)/'`sprintrc.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libtests_a-sprintrc.Tpo $(DEPDIR)/libtests_a-sprintrc.Po
@@ -5603,7 +5949,7 @@
 clean: clean-am
 
 clean-am: clean-checkLIBRARIES clean-checkPROGRAMS clean-generic \
-	mostlyclean-am
+	clean-local mostlyclean-am
 
 distclean: distclean-am
 	-rm -rf ./$(DEPDIR)
@@ -5675,19 +6021,982 @@
 .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am \
 	check-valgrind-am check-valgrind-local clean \
 	clean-checkLIBRARIES clean-checkPROGRAMS clean-generic \
-	cscopelist-am ctags ctags-am distclean distclean-compile \
-	distclean-generic distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-man install-pdf install-pdf-am \
-	install-ps install-ps-am install-strip installcheck \
-	installcheck-am installdirs maintainer-clean \
+	clean-local cscopelist-am ctags ctags-am distclean \
+	distclean-compile distclean-generic distclean-tags distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
 	maintainer-clean-generic mostlyclean mostlyclean-compile \
 	mostlyclean-generic pdf pdf-am ps ps-am recheck tags tags-am \
 	uninstall uninstall-am
 
 
+$(srcdir)/_newselect.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/accept.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/accept4.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/access.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/acct.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/add_key.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/adjtimex.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/aio.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/alarm.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/bpf.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/btrfs.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/chmod.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/chown.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/chown32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/chroot.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/clock.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/clock_adjtime.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/clock_nanosleep.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/clock_xettime.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/copy_file_range.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/creat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/delete_module.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/dup.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/dup2.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/dup3.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/epoll_create.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/epoll_create1.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/epoll_ctl.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/epoll_pwait.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/epoll_wait.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/erestartsys.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/execveat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/execveat-v.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/faccessat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fadvise64_64.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fallocate.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fanotify_init.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fanotify_mark.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fchdir.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fchmod.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fchmodat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fchown.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fchown32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fchownat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fcntl.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fcntl64.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fdatasync.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/file_handle.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/file_ioctl.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/finit_module.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/flock.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fork-f.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fstat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fstat64.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fstatat64.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fstatfs.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fstatfs64.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/fsync.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ftruncate.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ftruncate64.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/futimesat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/get_mempolicy.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getcpu.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getcwd.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getdents.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getdents64.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getegid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getegid32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/geteuid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/geteuid32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getgid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getgid32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getgroups.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getgroups32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getpeername.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getpgrp.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getpid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getppid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getrandom.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getresgid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getresgid32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getresuid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getresuid32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getrlimit.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getrusage.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getsid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getsockname.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/gettid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getuid32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/getxxid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/inet-cmsg.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/init_module.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/inotify.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/inotify_init1.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/int_0x80.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ioctl_block.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ioctl_evdev.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ioctl_evdev-v.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ioctl_loop.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ioctl_loop-v.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ioctl_mtd.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ioctl_rtc.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ioctl_rtc-v.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ioctl_scsi.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ioctl_sg_io_v3.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ioctl_sg_io_v4.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ioctl_uffdio.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ioctl_v4l2.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ioperm.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/iopl.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ioprio.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ip_mreq.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ipc.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ipc_msg.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ipc_sem.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ipc_shm.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/kcmp.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/kexec_file_load.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/kexec_load.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/keyctl.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/kill.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/lchown.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/lchown32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/link.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/linkat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/lookup_dcookie.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/lstat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/lstat64.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/madvise.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mbind.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/membarrier.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/memfd_create.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/migrate_pages.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mincore.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mkdir.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mkdirat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mknod.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mknodat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mlock.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mlock2.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mlockall.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mmap64.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mmsg.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mmsg-silent.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mmsg_name.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mmsg_name-v.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mount.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/move_pages.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mq.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mq_sendrecv.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mq_sendrecv-read.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/mq_sendrecv-write.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/msg_control.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/msg_control-v.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/msg_name.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/munlockall.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/nanosleep.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/net-icmp_filter.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/net-sockaddr.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/netlink_protocol.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/newfstatat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/old_mmap.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/oldfstat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/oldlstat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/oldstat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/open.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/openat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/osf_utimes.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/pause.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/perf_event_open.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/perf_event_open_nonverbose.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/perf_event_open_unabbrev.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/pipe2.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/pkey_alloc.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/pkey_free.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/pkey_mprotect.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ppoll.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ppoll-v.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/pread64-pwrite64.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/preadv.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/preadv-pwritev.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/preadv2-pwritev2.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/printstr.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/prlimit64.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/process_vm_readv.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/process_vm_writev.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/pselect6.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ptrace.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/pwritev.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/quotactl.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/quotactl-v.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/quotactl-xfs.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/quotactl-xfs-v.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/read-write.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/readahead.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/readdir.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/readlink.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/readlinkat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/reboot.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/recvfrom.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/recvmmsg-timeout.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/recvmsg.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/regex.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/remap_file_pages.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/rename.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/renameat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/renameat2.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/request_key.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/rmdir.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/rt_sigpending.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/rt_sigprocmask.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/rt_sigqueueinfo.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/rt_sigreturn.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/rt_sigsuspend.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/rt_sigtimedwait.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/rt_tgsigqueueinfo.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sched.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sched_get_priority_mxx.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sched_rr_get_interval.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sched_xetaffinity.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sched_xetattr.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sched_xetparam.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sched_xetscheduler.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sched_yield.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/seccomp-filter.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/seccomp-filter-v.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/select.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/semop.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sendfile.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sendfile64.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/set_mempolicy.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setdomainname.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setfsgid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setfsgid32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setfsuid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setfsuid32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setgid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setgid32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setgroups.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setgroups32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sethostname.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setns.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setregid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setregid32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setresgid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setresgid32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setresuid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setresuid32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setreuid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setreuid32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setrlimit.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setuid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/setuid32.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/shmxt.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/shutdown.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/siginfo.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/signal_receive.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/signalfd4.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sigreturn.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sigsuspend.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/socketcall.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/splice.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/stat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/stat64.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/statfs.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/statfs64.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/statx.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/swap.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sxetmask.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/symlink.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/symlinkat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sync.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sync_file_range.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sync_file_range2.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/sysinfo.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/syslog.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/tee.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/time.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/timer_create.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/timer_xettime.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/timerfd_xettime.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/times.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/times-fail.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/trace_fstat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/trace_fstatfs.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/trace_lstat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/trace_question.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/trace_stat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/trace_stat_like.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/trace_statfs.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/trace_statfs_like.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/truncate.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/truncate64.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ugetrlimit.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/umask.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/umoven-illptr.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/umovestr-illptr.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/umovestr3.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/unlink.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/unlinkat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/unshare.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/userfaultfd.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/ustat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/utime.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/utimensat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/utimes.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/vfork-f.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/vhangup.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/vmsplice.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/wait4.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/wait4-v.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/waitid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/waitid-v.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/waitpid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/xattr.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/xattr-strings.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/xet_robust_list.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/xetitimer.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/xetpgid.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/xetpriority.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
+$(srcdir)/xettimeofday.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+	$(AM_V_GEN) $^ $@
+
 @VALGRIND_CHECK_RULES@
 
 ksysent.h: $(srcdir)/ksysent.sed
@@ -5700,6 +7009,11 @@
 ksysent.$(OBJEXT): ksysent.h
 $(objects): scno.h
 
+clean-local: clean-local-check
+.PHONY: clean-local-check
+clean-local-check:
+	-rm -rf -- $(TESTS:.test=.dir) $(GEN_TESTS:.gen.test=.dir)
+
 syscallent.i: $(top_srcdir)/$(OS)/$(ARCH)/syscallent.h
 	$(CPP) -P $(SCNO_CPPFLAGS) $^ -o $@
 
diff --git a/tests/_newselect.gen.test b/tests/_newselect.gen.test
new file mode 100755
index 0000000..490abe4
--- /dev/null
+++ b/tests/_newselect.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (_newselect ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/_newselect.test b/tests/_newselect.test
deleted file mode 100755
index 3371d4d..0000000
--- a/tests/_newselect.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check _newselect syscall decoding.
-
-. "${srcdir=.}/select.test"
diff --git a/tests/accept.gen.test b/tests/accept.gen.test
new file mode 100755
index 0000000..3ebba3b
--- /dev/null
+++ b/tests/accept.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (accept -a22); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a22
diff --git a/tests/accept.test b/tests/accept.test
deleted file mode 100755
index b5e0790..0000000
--- a/tests/accept.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of accept syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a22
diff --git a/tests/accept4.gen.test b/tests/accept4.gen.test
new file mode 100755
index 0000000..5bd7fe6
--- /dev/null
+++ b/tests/accept4.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (accept4 -a37); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a37
diff --git a/tests/accept4.test b/tests/accept4.test
deleted file mode 100755
index 722f25a..0000000
--- a/tests/accept4.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of accept4 syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a37
diff --git a/tests/access.c b/tests/access.c
index e6f169b..4420ba3 100644
--- a/tests/access.c
+++ b/tests/access.c
@@ -19,6 +19,7 @@
 	printf("access(\"%s\", R_OK|W_OK|X_OK) = %ld %s (%m)\n",
 	       sample, rc, errno2name());
 
+	puts("+++ exited with 0 +++");
 	return 0;
 }
 
diff --git a/tests/access.gen.test b/tests/access.gen.test
new file mode 100755
index 0000000..7d80e6f
--- /dev/null
+++ b/tests/access.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (access -a30 -P access_sample); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a30 -P access_sample
diff --git a/tests/access.test b/tests/access.test
deleted file mode 100755
index 3ab2eb4..0000000
--- a/tests/access.test
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/sh
-
-# Check access syscall decoding.
-
-. "${srcdir=.}/init.sh"
-
-check_prog grep
-run_prog > /dev/null
-run_strace -eaccess -a30 $args > "$EXP"
-
-# Filter out access() calls made by libc.
-grep -F access_sample < "$LOG" > "$OUT"
-match_diff "$OUT" "$EXP"
-
-rm -f "$EXP" "$OUT"
diff --git a/tests/acct.gen.test b/tests/acct.gen.test
new file mode 100755
index 0000000..fa14e85
--- /dev/null
+++ b/tests/acct.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (acct -a20); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a20
diff --git a/tests/acct.test b/tests/acct.test
deleted file mode 100755
index b9bca75..0000000
--- a/tests/acct.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check acct syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a20
diff --git a/tests/add_key.gen.test b/tests/add_key.gen.test
new file mode 100755
index 0000000..d6ffbc8
--- /dev/null
+++ b/tests/add_key.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (add_key -a30 -s12); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a30 -s12
diff --git a/tests/add_key.test b/tests/add_key.test
deleted file mode 100755
index eadd8c2..0000000
--- a/tests/add_key.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of add_key syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a30 -s12
diff --git a/tests/adjtimex.c b/tests/adjtimex.c
index 1638b53..4d68ea1 100644
--- a/tests/adjtimex.c
+++ b/tests/adjtimex.c
@@ -1,7 +1,7 @@
 /*
  * This file is part of adjtimex strace test.
  *
- * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 Dmitry V. Levin <[email protected]>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -33,38 +33,46 @@
 #include <string.h>
 #include <sys/timex.h>
 
+#include "xlat.h"
+#include "xlat/adjtimex_state.h"
+#include "xlat/adjtimex_status.h"
+
 int
 main(void)
 {
-	adjtimex(NULL);
-	printf("adjtimex\\(NULL\\) = -1 EFAULT \\(%m\\)\n");
+	int state = adjtimex(NULL);
+	printf("adjtimex(NULL) = %s\n", sprintrc(state));
 
-	struct timex * const tx = tail_alloc(sizeof(*tx));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct timex, tx);
 	memset(tx, 0, sizeof(*tx));
 
-	int state = adjtimex(tx);
+	state = adjtimex(tx);
 	if (state < 0)
 		perror_msg_and_skip("adjtimex");
 
-	printf("adjtimex\\(\\{modes=0, offset=%jd, freq=%jd, maxerror=%jd"
-	       ", esterror=%jd, status=%s, constant=%jd, precision=%jd"
-	       ", tolerance=%jd, time=\\{tv_sec=%jd, tv_usec=%jd\\}, tick=%jd, "
-	       "ppsfreq=%jd, jitter=%jd, shift=%d, stabil=%jd, jitcnt=%jd, "
-	       "calcnt=%jd, errcnt=%jd, stbcnt=%jd"
-#ifdef HAVE_STRUCT_TIMEX_TAI
-	       ", tai=%d"
-#endif
-	       "\\}\\) = %d \\(TIME_[A-Z]+\\)\n",
+	printf("adjtimex({modes=0, offset=%jd, freq=%jd, maxerror=%jd"
+	       ", esterror=%jd, status=",
 	       (intmax_t) tx->offset,
 	       (intmax_t) tx->freq,
 	       (intmax_t) tx->maxerror,
-	       (intmax_t) tx->esterror,
-	       tx->status ? "STA_[A-Z]+(\\|STA_[A-Z]+)*" : "0",
+	       (intmax_t) tx->esterror);
+	if (tx->status)
+		printflags(adjtimex_status, (unsigned int) tx->status, NULL);
+	else
+		putchar('0');
+	printf(", constant=%jd, precision=%jd"
+	       ", tolerance=%jd, time={tv_sec=%lld, tv_usec=%llu}, tick=%jd"
+	       ", ppsfreq=%jd, jitter=%jd, shift=%d, stabil=%jd, jitcnt=%jd"
+	       ", calcnt=%jd, errcnt=%jd, stbcnt=%jd"
+#ifdef HAVE_STRUCT_TIMEX_TAI
+	       ", tai=%d"
+#endif
+	       "}) = %d (",
 	       (intmax_t) tx->constant,
 	       (intmax_t) tx->precision,
 	       (intmax_t) tx->tolerance,
-	       (intmax_t) tx->time.tv_sec,
-	       (intmax_t) tx->time.tv_usec,
+	       (long long) tx->time.tv_sec,
+	       zero_extend_signed_to_ull(tx->time.tv_usec),
 	       (intmax_t) tx->tick,
 	       (intmax_t) tx->ppsfreq,
 	       (intmax_t) tx->jitter,
@@ -78,6 +86,9 @@
 	       tx->tai,
 #endif
 	       state);
+	printxval(adjtimex_state, (unsigned int) state, NULL);
+	puts(")");
 
+	puts("+++ exited with 0 +++");
 	return 0;
 }
diff --git a/tests/adjtimex.gen.test b/tests/adjtimex.gen.test
new file mode 100755
index 0000000..8db59f2
--- /dev/null
+++ b/tests/adjtimex.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (adjtimex -a15); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a15
diff --git a/tests/adjtimex.test b/tests/adjtimex.test
deleted file mode 100755
index 0140550..0000000
--- a/tests/adjtimex.test
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-
-# Check adjtimex syscall decoding.
-
-. "${srcdir=.}/init.sh"
-
-run_prog > /dev/null
-run_strace -a 15 -e adjtimex $args > "$OUT"
-match_grep "$LOG" "$OUT"
-rm -f "$OUT"
-
-exit 0
diff --git a/tests/aio.c b/tests/aio.c
index 0766d23..677a02b 100644
--- a/tests/aio.c
+++ b/tests/aio.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -198,15 +199,14 @@
 	};
 	const long *cbvs2 = tail_memdup(proto_cbvs2, sizeof(proto_cbvs2));
 
-	unsigned long *ctx = tail_alloc(sizeof(unsigned long));
+	TAIL_ALLOC_OBJECT_CONST_PTR(unsigned long, ctx);
 	*ctx = 0;
 
 	const unsigned int nr = ARRAY_SIZE(proto_cb);
 	const unsigned long lnr = (unsigned long) (0xdeadbeef00000000ULL | nr);
 
 	const struct io_event *ev = tail_alloc(nr * sizeof(struct io_event));
-	const struct timespec proto_ts = { .tv_nsec = 123456789 };
-	const struct timespec *ts = tail_memdup(&proto_ts, sizeof(proto_ts));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct timespec, ts);
 
 	(void) close(0);
 	if (open("/dev/zero", O_RDONLY))
@@ -263,6 +263,24 @@
 	       bogus_ctx, (long) 0xca7faceddeadf00dLL,
 	       (long) 0xba5e1e505ca571e0LL, ts + 1, sprintrc(rc));
 
+	ts->tv_sec = 0xdeadbeefU;
+	ts->tv_nsec = 0xfacefeedU;
+	rc = syscall(__NR_io_getevents, bogus_ctx, 0, 0, 0, ts);
+	printf("io_getevents(%#lx, 0, 0, NULL"
+	       ", {tv_sec=%lld, tv_nsec=%llu}) = %s\n",
+	       bogus_ctx, (long long) ts->tv_sec,
+	       zero_extend_signed_to_ull(ts->tv_nsec), sprintrc(rc));
+
+	ts->tv_sec = (time_t) 0xcafef00ddeadbeefLL;
+	ts->tv_nsec = (long) 0xbadc0dedfacefeedLL;
+	rc = syscall(__NR_io_getevents, bogus_ctx, 0, 0, 0, ts);
+	printf("io_getevents(%#lx, 0, 0, NULL"
+	       ", {tv_sec=%lld, tv_nsec=%llu}) = %s\n",
+	       bogus_ctx, (long long) ts->tv_sec,
+	       zero_extend_signed_to_ull(ts->tv_nsec), sprintrc(rc));
+
+	ts->tv_sec = 0;
+	ts->tv_nsec = 123456789;
 	rc = syscall(__NR_io_getevents, *ctx, nr, nr + 1, ev, ts);
 	printf("io_getevents(%#lx, %ld, %ld, ["
 	       "{data=%#" PRI__x64 ", obj=%p, res=%u, res2=0}, "
diff --git a/tests/aio.gen.test b/tests/aio.gen.test
new file mode 100755
index 0000000..8c8cbd5
--- /dev/null
+++ b/tests/aio.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (aio -a14 -e trace=io_setup,io_submit,io_getevents,io_cancel,io_destroy); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a14 -e trace=io_setup,io_submit,io_getevents,io_cancel,io_destroy
diff --git a/tests/aio.test b/tests/aio.test
deleted file mode 100755
index 2ba90da..0000000
--- a/tests/aio.test
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/sh
-
-# Check io_* syscalls decoding.
-
-. "${srcdir=.}/init.sh"
-
-syscalls=io_setup,io_submit,io_getevents,io_cancel,io_destroy
-run_strace_match_diff -a14 -e trace=$syscalls
diff --git a/tests/alarm.gen.test b/tests/alarm.gen.test
new file mode 100755
index 0000000..ba1dea8
--- /dev/null
+++ b/tests/alarm.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (alarm -a10); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a10
diff --git a/tests/alarm.test b/tests/alarm.test
deleted file mode 100755
index 267b223..0000000
--- a/tests/alarm.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check alarm syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a10
diff --git a/tests/attach-f-p-cmd.c b/tests/attach-f-p-cmd.c
index 77594be..1e9ed99 100644
--- a/tests/attach-f-p-cmd.c
+++ b/tests/attach-f-p-cmd.c
@@ -2,6 +2,7 @@
  * This file is part of attach-f-p strace test.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -34,6 +35,8 @@
 int
 main(void)
 {
+	skip_if_unavailable("/proc/self/task/");
+
 	static const char dir[] = "attach-f-p.test cmd";
 	pid_t pid = getpid();
 	int rc = chdir(dir);
diff --git a/tests/attach-f-p.test b/tests/attach-f-p.test
index f417074..368c775 100755
--- a/tests/attach-f-p.test
+++ b/tests/attach-f-p.test
@@ -3,6 +3,7 @@
 # Check that -f -p attaches to threads properly.
 #
 # Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+# Copyright (c) 2016-2017 The strace developers.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -29,22 +30,17 @@
 
 . "${srcdir=.}/init.sh"
 
-# strace -f -p is implemented using /proc/$pid/task/
-[ -d /proc/self/task/ ] ||
-	framework_skip_ '/proc/self/task/ is not available'
 run_prog_skip_if_failed \
 	kill -0 $$
-run_prog ./attach-f-p-cmd > /dev/null
+run_prog ../attach-f-p-cmd > /dev/null
 
-rm -f "$OUT"
-./set_ptracer_any sh -c "exec ./attach-f-p >> $OUT" > /dev/null &
+../set_ptracer_any sh -c "exec ../attach-f-p >> $EXP" > /dev/null &
 tracee_pid=$!
 
-while ! [ -s "$OUT" ]; do
+while ! [ -s "$EXP" ]; do
 	kill -0 $tracee_pid 2> /dev/null ||
 		fail_ 'set_ptracer_any sh failed'
 done
 
-run_strace -a32 -f -echdir -p $tracee_pid ./attach-f-p-cmd > "$OUT"
-match_diff "$LOG" "$OUT"
-rm -f "$OUT"
+run_strace -a32 -f -echdir -p $tracee_pid ../attach-f-p-cmd > "$EXP"
+match_diff "$LOG" "$EXP"
diff --git a/tests/attach-p-cmd.test b/tests/attach-p-cmd.test
index 2068cf1..e7c1bfa 100755
--- a/tests/attach-p-cmd.test
+++ b/tests/attach-p-cmd.test
@@ -3,6 +3,7 @@
 # Check that simultaneous use of -p option and tracing of a command works.
 #
 # Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+# Copyright (c) 2016-2017 The strace developers.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -32,16 +33,13 @@
 run_prog_skip_if_failed \
 	kill -0 $$
 
-rm -rf attach-p-cmd.test-lock
-rm -f "$OUT"
-./set_ptracer_any ./attach-p-cmd-p >> "$OUT" &
+../set_ptracer_any ../attach-p-cmd-p >> "$EXP" &
 tracee_pid=$!
 
-while ! [ -s "$OUT" ]; do
+while ! [ -s "$EXP" ]; do
 	kill -0 $tracee_pid 2> /dev/null ||
-		fail_ 'set_ptracer_any ./attach-p-cmd-p failed'
+		fail_ 'set_ptracer_any ../attach-p-cmd-p failed'
 done
 
-run_strace -a30 -echdir -p $tracee_pid ./attach-p-cmd-cmd > "$OUT"
-match_diff "$LOG" "$OUT"
-rm -f "$OUT"
+run_strace -a30 -echdir -p $tracee_pid ../attach-p-cmd-cmd > "$EXP"
+match_diff "$LOG" "$EXP"
diff --git a/tests/bexecve.test b/tests/bexecve.test
index f1ab04f..325330e 100755
--- a/tests/bexecve.test
+++ b/tests/bexecve.test
@@ -3,6 +3,7 @@
 # Check -bexecve behavior.
 #
 # Copyright (c) 2015 Dmitry V. Levin <[email protected]>
+# Copyright (c) 2015-2017 The strace developers.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -35,14 +36,14 @@
 	$STRACE "$@" 2> "$LOG"
 }
 
-run_strace_redir -enone ./set_ptracer_any true ||
+run_strace_redir -enone ../set_ptracer_any true ||
 	dump_log_and_fail_with "$STRACE $args: unexpected exit status"
 
-run_strace_redir -enone ./set_ptracer_any false
+run_strace_redir -enone ../set_ptracer_any false
 [ $? -eq 1 ] ||
 	dump_log_and_fail_with "$STRACE $args: unexpected exit status"
 
-run_strace_redir -bexecve -enone ./set_ptracer_any false ||
+run_strace_redir -bexecve -enone ../set_ptracer_any false ||
 	dump_log_and_fail_with "$STRACE $args: unexpected exit status"
 
 pattern_detached='[^:]*strace: Process [1-9][0-9]* detached'
diff --git a/tests/bpf.c b/tests/bpf.c
index 7ef16c9..40f96a7 100644
--- a/tests/bpf.c
+++ b/tests/bpf.c
@@ -109,14 +109,15 @@
 # endif
 
 /* BPF_PROG_ATTACH and BPF_PROG_DETACH commands appear in kernel 4.10. */
-# ifdef HAVE_UNION_BPF_ATTR_ATTACH_TYPE
+# ifdef HAVE_UNION_BPF_ATTR_ATTACH_FLAGS
 static int
 prog_cgroup(int cmd)
 {
 	union bpf_attr attr = {
 		.target_fd = -1,
 		.attach_bpf_fd = -1,
-		.attach_type = 0
+		.attach_type = 0,
+		.attach_flags = 1
 	};
 	void *const t_attr = tail_memdup(&attr, sizeof(attr));
 	return sys_bpf(cmd, (unsigned long) t_attr, sizeof(attr));
@@ -205,11 +206,12 @@
 	BOGUS_BPF(BPF_OBJ_GET);
 # endif
 
-# ifdef HAVE_UNION_BPF_ATTR_ATTACH_TYPE
+# ifdef HAVE_UNION_BPF_ATTR_ATTACH_FLAGS
 	prog_cgroup(BPF_PROG_ATTACH);
 	printf("bpf(BPF_PROG_ATTACH"
 	       ", {target_fd=-1, attach_bpf_fd=-1"
-	       ", attach_type=BPF_CGROUP_INET_INGRESS}, %u) = %s\n",
+	       ", attach_type=BPF_CGROUP_INET_INGRESS"
+	       ", attach_flags=BPF_F_ALLOW_OVERRIDE}, %u) = %s\n",
 	       (unsigned) sizeof(union bpf_attr), errstr);
 	BOGUS_BPF(BPF_PROG_ATTACH);
 
diff --git a/tests/bpf.gen.test b/tests/bpf.gen.test
new file mode 100755
index 0000000..7ee9e7f
--- /dev/null
+++ b/tests/bpf.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (bpf -a20); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a20
diff --git a/tests/bpf.test b/tests/bpf.test
deleted file mode 100755
index adf0d57..0000000
--- a/tests/bpf.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check bpf syscall decoding.
-. "${srcdir=.}/init.sh"
-
-run_strace_match_diff -a20
diff --git a/tests/brk.test b/tests/brk.test
index 8c0e2e4..3781220 100755
--- a/tests/brk.test
+++ b/tests/brk.test
@@ -7,4 +7,3 @@
 run_prog > /dev/null
 run_strace -a10 -ebrk $args > "$EXP"
 match_grep "$LOG" "$EXP"
-rm -f "$EXP"
diff --git a/tests/btrfs-v.test b/tests/btrfs-v.test
index 1ee17b4..8cc2724 100755
--- a/tests/btrfs-v.test
+++ b/tests/btrfs-v.test
@@ -4,12 +4,8 @@
 
 . "${srcdir=.}/init.sh"
 
-run_prog ./btrfs -v > /dev/null
-run_strace -a16 -veioctl $args > "$EXP"
 check_prog grep
+run_prog ../btrfs -v > /dev/null
+run_strace -a16 -veioctl $args > "$EXP"
 grep -v '^ioctl([012],' < "$LOG" > "$OUT"
 match_diff "$OUT" "$EXP"
-
-rm -f "$EXP" "$OUT"
-
-exit 0
diff --git a/tests/btrfs-vw.test b/tests/btrfs-vw.test
index c7e40ad..913fba1 100755
--- a/tests/btrfs-vw.test
+++ b/tests/btrfs-vw.test
@@ -18,12 +18,8 @@
     skip_ "\$BTRFS_MOUNTPOINT does not point to a directory"
 fi
 
-run_prog ./btrfs -v -w "${BTRFS_MOUNTPOINT}" > /dev/null
-run_strace -a16 -veioctl $args > "$EXP"
 check_prog grep
+run_prog ../btrfs -v -w "${BTRFS_MOUNTPOINT}" > /dev/null
+run_strace -a16 -veioctl $args > "$EXP"
 grep -v '^ioctl([012],' < "$LOG" > "$OUT"
 match_diff "$OUT" "$EXP"
-
-rm -f "$EXP" "$OUT"
-
-exit 0
diff --git a/tests/btrfs-w.test b/tests/btrfs-w.test
index 6238dca..031f0b8 100755
--- a/tests/btrfs-w.test
+++ b/tests/btrfs-w.test
@@ -18,12 +18,8 @@
     skip_ "\$BTRFS_MOUNTPOINT does not point to a directory"
 fi
 
-run_prog ./btrfs -w "${BTRFS_MOUNTPOINT}" > /dev/null
-run_strace -a16 -eioctl $args > "$EXP"
 check_prog grep
+run_prog ../btrfs -w "${BTRFS_MOUNTPOINT}" > /dev/null
+run_strace -a16 -eioctl $args > "$EXP"
 grep -v '^ioctl([012],' < "$LOG" > "$OUT"
 match_diff "$OUT" "$EXP"
-
-rm -f "$EXP" "$OUT"
-
-exit 0
diff --git a/tests/btrfs.c b/tests/btrfs.c
index b3e23f8..7e5ccff 100644
--- a/tests/btrfs.c
+++ b/tests/btrfs.c
@@ -1548,9 +1548,9 @@
 			const char *name = xlookup(btrfs_dev_stats_values, i);
 			if (i)
 				printf(", ");
-			if (name)
-				printf("/* %s */ ", name);
 			printf("%" PRI__u64, args.values[i]);
+			if (name)
+				printf(" /* %s */", name);
 		}
 		printf("]}) = 0\n");
 	}
@@ -1799,13 +1799,13 @@
 		      &supported_features);
 		printf("ioctl(%d, BTRFS_IOC_GET_SUPPORTED_FEATURES, ",
 		       btrfs_test_dir_fd);
-		printf("[ /* supported */ ");
+		printf("[");
 		btrfs_print_features(&supported_features[0]);
-		printf(", /* safe to set */ ");
+		printf(" /* supported */, ");
 		btrfs_print_features(&supported_features[1]);
-		printf(", /* safe to clear */ ");
+		printf(" /* safe to set */, ");
 		btrfs_print_features(&supported_features[2]);
-		printf("]) = 0\n");
+		printf(" /* safe to clear */]) = 0\n");
 	}
 }
 
diff --git a/tests/btrfs.gen.test b/tests/btrfs.gen.test
new file mode 100755
index 0000000..a7118ef
--- /dev/null
+++ b/tests/btrfs.gen.test
@@ -0,0 +1,3 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (btrfs +ioctl.test); do not edit.
+. "${srcdir=.}/ioctl.test"
diff --git a/tests/btrfs.test b/tests/btrfs.test
deleted file mode 100755
index 2121b5b..0000000
--- a/tests/btrfs.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check basic btrfs ioctl decoding.
-
-. "${srcdir=.}/ioctl.test"
diff --git a/tests/chmod.gen.test b/tests/chmod.gen.test
new file mode 100755
index 0000000..438665a
--- /dev/null
+++ b/tests/chmod.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (chmod -a28); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a28
diff --git a/tests/chmod.test b/tests/chmod.test
deleted file mode 100755
index 70e561a..0000000
--- a/tests/chmod.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check chmod syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a28
diff --git a/tests/chown.gen.test b/tests/chown.gen.test
new file mode 100755
index 0000000..46889a1
--- /dev/null
+++ b/tests/chown.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (chown -a28); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a28
diff --git a/tests/chown.test b/tests/chown.test
deleted file mode 100755
index eb356ce..0000000
--- a/tests/chown.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check chown syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a28
diff --git a/tests/chown32.gen.test b/tests/chown32.gen.test
new file mode 100755
index 0000000..f0f603e
--- /dev/null
+++ b/tests/chown32.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (chown32 -a31); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a31
diff --git a/tests/chown32.test b/tests/chown32.test
deleted file mode 100755
index 0fa04c2..0000000
--- a/tests/chown32.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check chown32 syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a31
diff --git a/tests/chroot.gen.test b/tests/chroot.gen.test
new file mode 100755
index 0000000..6ea81dd
--- /dev/null
+++ b/tests/chroot.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (chroot -a24); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a24
diff --git a/tests/chroot.test b/tests/chroot.test
deleted file mode 100755
index 3b384f5..0000000
--- a/tests/chroot.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check chroot syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a24
diff --git a/tests/clock.gen.test b/tests/clock.gen.test
new file mode 100755
index 0000000..b76eaf5
--- /dev/null
+++ b/tests/clock.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (clock test_trace_expr 'times|fcntl.*' -e/clock); do not edit.
+. "${srcdir=.}/init.sh"
+test_trace_expr 'times|fcntl.*' -e/clock
diff --git a/tests/clock.in b/tests/clock.in
new file mode 100755
index 0000000..864de29
--- /dev/null
+++ b/tests/clock.in
@@ -0,0 +1,3 @@
+clock_adjtime	-a37
+clock_nanosleep
+clock_xettime	-a36
diff --git a/tests/clock_adjtime.gen.test b/tests/clock_adjtime.gen.test
new file mode 100755
index 0000000..735e3af
--- /dev/null
+++ b/tests/clock_adjtime.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (clock_adjtime -a37); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a37
diff --git a/tests/clock_adjtime.test b/tests/clock_adjtime.test
deleted file mode 100755
index df2c060..0000000
--- a/tests/clock_adjtime.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check clock_adjtime syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a37
diff --git a/tests/clock_nanosleep.c b/tests/clock_nanosleep.c
index 98407d7..72ac2e4 100644
--- a/tests/clock_nanosleep.c
+++ b/tests/clock_nanosleep.c
@@ -1,5 +1,8 @@
 /*
+ * Check decoding of clock_nanosleep and clock_gettime syscalls.
+ *
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -62,9 +65,10 @@
 
 	if (syscall(__NR_clock_nanosleep, CLOCK_REALTIME, 0, &req.ts, NULL))
 		perror_msg_and_skip("clock_nanosleep CLOCK_REALTIME");
-	printf("clock_nanosleep(CLOCK_REALTIME, 0, {tv_sec=%jd, tv_nsec=%jd}, "
-	       "NULL) = 0\n",
-	       (intmax_t) req.ts.tv_sec, (intmax_t) req.ts.tv_nsec);
+	printf("clock_nanosleep(CLOCK_REALTIME, 0"
+	       ", {tv_sec=%lld, tv_nsec=%llu}, NULL) = 0\n",
+	       (long long) req.ts.tv_sec,
+	       zero_extend_signed_to_ull(req.ts.tv_nsec));
 
 	assert(syscall(__NR_clock_nanosleep, CLOCK_REALTIME, 0,
 		       NULL, &rem.ts) == -1);
@@ -73,52 +77,71 @@
 
 	assert(syscall(__NR_clock_nanosleep, CLOCK_REALTIME, 0,
 		       &req.ts, &rem.ts) == 0);
-	printf("clock_nanosleep(CLOCK_REALTIME, 0, {tv_sec=%jd, tv_nsec=%jd}, "
-	       "%p) = 0\n",
-	       (intmax_t) req.ts.tv_sec, (intmax_t) req.ts.tv_nsec, &rem.ts);
+	printf("clock_nanosleep(CLOCK_REALTIME, 0"
+	       ", {tv_sec=%lld, tv_nsec=%llu}, %p) = 0\n",
+	       (long long) req.ts.tv_sec,
+	       zero_extend_signed_to_ull(req.ts.tv_nsec), &rem.ts);
 
 	req.ts.tv_nsec = 999999999 + 1;
 	assert(syscall(__NR_clock_nanosleep, CLOCK_MONOTONIC, 0,
 		       &req.ts, &rem.ts) == -1);
 	printf("clock_nanosleep(CLOCK_MONOTONIC, 0"
-	       ", {tv_sec=%jd, tv_nsec=%jd}, %p) = -1 EINVAL (%m)\n",
-	       (intmax_t) req.ts.tv_sec, (intmax_t) req.ts.tv_nsec, &rem.ts);
+	       ", {tv_sec=%lld, tv_nsec=%llu}, %p) = -1 EINVAL (%m)\n",
+	       (long long) req.ts.tv_sec,
+	       zero_extend_signed_to_ull(req.ts.tv_nsec), &rem.ts);
+
+	req.ts.tv_sec = 0xdeadbeefU;
+	req.ts.tv_nsec = 0xfacefeedU;
+	assert(syscall(__NR_clock_nanosleep, CLOCK_REALTIME, 0,
+		       &req.ts, &rem.ts) == -1);
+	printf("clock_nanosleep(CLOCK_REALTIME, 0"
+	       ", {tv_sec=%lld, tv_nsec=%llu}, %p) = -1 EINVAL (%m)\n",
+	       (long long) req.ts.tv_sec,
+	       zero_extend_signed_to_ull(req.ts.tv_nsec), &rem.ts);
+
+	req.ts.tv_sec = (time_t) 0xcafef00ddeadbeefLL;
+	req.ts.tv_nsec = (long) 0xbadc0dedfacefeedLL;
+	assert(syscall(__NR_clock_nanosleep, CLOCK_MONOTONIC, 0,
+		       &req.ts, &rem.ts) == -1);
+	printf("clock_nanosleep(CLOCK_MONOTONIC, 0"
+	       ", {tv_sec=%lld, tv_nsec=%llu}, %p) = -1 EINVAL (%m)\n",
+	       (long long) req.ts.tv_sec,
+	       zero_extend_signed_to_ull(req.ts.tv_nsec), &rem.ts);
 
 	assert(sigaction(SIGALRM, &act, NULL) == 0);
 	assert(sigprocmask(SIG_SETMASK, &set, NULL) == 0);
 
 	if (setitimer(ITIMER_REAL, &itv, NULL))
 		perror_msg_and_skip("setitimer");
-	printf("setitimer(ITIMER_REAL, {it_interval={tv_sec=%jd, tv_usec=%jd}"
-	       ", it_value={tv_sec=%jd, tv_usec=%jd}}, NULL) = 0\n",
-	       (intmax_t) itv.it_interval.tv_sec,
-	       (intmax_t) itv.it_interval.tv_usec,
-	       (intmax_t) itv.it_value.tv_sec,
-	       (intmax_t) itv.it_value.tv_usec);
 
-	--req.ts.tv_nsec;
+	req.ts.tv_sec = 0;
+	req.ts.tv_nsec = 999999999;
 	assert(syscall(__NR_clock_nanosleep, CLOCK_REALTIME, 0,
 		       &req.ts, &rem.ts) == -1);
-	printf("clock_nanosleep(CLOCK_REALTIME, 0, {tv_sec=%jd, tv_nsec=%jd}, "
-	       "{tv_sec=%jd, tv_nsec=%jd})"
+	printf("clock_nanosleep(CLOCK_REALTIME, 0"
+	       ", {tv_sec=%lld, tv_nsec=%llu}, {tv_sec=%lld, tv_nsec=%llu})"
 	       " = ? ERESTART_RESTARTBLOCK (Interrupted by signal)\n",
-	       (intmax_t) req.ts.tv_sec, (intmax_t) req.ts.tv_nsec,
-	       (intmax_t) rem.ts.tv_sec, (intmax_t) rem.ts.tv_nsec);
+	       (long long) req.ts.tv_sec,
+	       zero_extend_signed_to_ull(req.ts.tv_nsec),
+	       (long long) rem.ts.tv_sec,
+	       zero_extend_signed_to_ull(rem.ts.tv_nsec));
 	puts("--- SIGALRM {si_signo=SIGALRM, si_code=SI_KERNEL} ---");
 
 	assert(syscall(__NR_clock_gettime, CLOCK_REALTIME, &req.ts) == 0);
-	printf("clock_gettime(CLOCK_REALTIME, {tv_sec=%jd, tv_nsec=%jd}) = 0\n",
-	       (intmax_t) req.ts.tv_sec, (intmax_t) req.ts.tv_nsec);
+	printf("clock_gettime(CLOCK_REALTIME, {tv_sec=%lld, tv_nsec=%llu}) = 0\n",
+	       (long long) req.ts.tv_sec,
+	       zero_extend_signed_to_ull(req.ts.tv_nsec));
 
 	++req.ts.tv_sec;
 	rem.ts.tv_sec = 0xc0de4;
 	rem.ts.tv_nsec = 0xc0de5;
 	assert(syscall(__NR_clock_nanosleep, CLOCK_REALTIME, TIMER_ABSTIME,
 		       &req.ts, &rem.ts) == -1);
-	printf("clock_nanosleep(CLOCK_REALTIME, TIMER_ABSTIME, {tv_sec=%jd, "
-	       "tv_nsec=%jd}, %p)"
+	printf("clock_nanosleep(CLOCK_REALTIME, TIMER_ABSTIME"
+	       ", {tv_sec=%lld, tv_nsec=%llu}, %p)"
 	       " = ? ERESTARTNOHAND (To be restarted if no handler)\n",
-	       (intmax_t) req.ts.tv_sec, (intmax_t) req.ts.tv_nsec, &rem.ts);
+	       (long long) req.ts.tv_sec,
+	       zero_extend_signed_to_ull(req.ts.tv_nsec), &rem.ts);
 	puts("--- SIGALRM {si_signo=SIGALRM, si_code=SI_KERNEL} ---");
 
 	puts("+++ exited with 0 +++");
diff --git a/tests/clock_nanosleep.gen.test b/tests/clock_nanosleep.gen.test
new file mode 100755
index 0000000..7a6025b
--- /dev/null
+++ b/tests/clock_nanosleep.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (clock_nanosleep -e trace=clock_nanosleep,clock_gettime); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -e trace=clock_nanosleep,clock_gettime
diff --git a/tests/clock_nanosleep.test b/tests/clock_nanosleep.test
deleted file mode 100755
index ec434a6..0000000
--- a/tests/clock_nanosleep.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check clock_nanosleep, clock_gettime, and setitimer syscalls decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -e trace=clock_nanosleep,clock_gettime,setitimer
diff --git a/tests/clock_xettime.c b/tests/clock_xettime.c
index 3ef5695..e3ec1b5 100644
--- a/tests/clock_xettime.c
+++ b/tests/clock_xettime.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -48,26 +49,41 @@
 
 	if (syscall(__NR_clock_getres, CLOCK_REALTIME, &t.ts))
 		perror_msg_and_skip("clock_getres CLOCK_REALTIME");
-	printf("clock_getres(CLOCK_REALTIME, {tv_sec=%jd, tv_nsec=%jd}) = 0\n",
-	       (intmax_t) t.ts.tv_sec,
-	       (intmax_t) t.ts.tv_nsec);
+	printf("clock_getres(CLOCK_REALTIME, {tv_sec=%lld, tv_nsec=%llu})"
+	       " = 0\n",
+	       (long long) t.ts.tv_sec,
+	       zero_extend_signed_to_ull(t.ts.tv_nsec));
 
 	if (syscall(__NR_clock_gettime, CLOCK_PROCESS_CPUTIME_ID, &t.ts))
 		perror_msg_and_skip("clock_gettime CLOCK_PROCESS_CPUTIME_ID");
-	printf("clock_gettime(CLOCK_PROCESS_CPUTIME_ID, "
-	       "{tv_sec=%jd, tv_nsec=%jd}) = 0\n",
-	       (intmax_t) t.ts.tv_sec,
-	       (intmax_t) t.ts.tv_nsec);
+	printf("clock_gettime(CLOCK_PROCESS_CPUTIME_ID"
+	       ", {tv_sec=%lld, tv_nsec=%llu}) = 0\n",
+	       (long long) t.ts.tv_sec,
+	       zero_extend_signed_to_ull(t.ts.tv_nsec));
 
 	t.ts.tv_sec = 0xdeface1;
 	t.ts.tv_nsec = 0xdeface2;
-	if (!syscall(__NR_clock_settime, CLOCK_THREAD_CPUTIME_ID, &t.ts))
-		error_msg_and_skip("clock_settime CLOCK_THREAD_CPUTIME_ID:"
-				   " EINVAL expected");
-	printf("clock_settime(CLOCK_THREAD_CPUTIME_ID, {tv_sec=%jd, "
-	       "tv_nsec=%jd}) = -1 EINVAL (%m)\n",
-	       (intmax_t) t.ts.tv_sec,
-	       (intmax_t) t.ts.tv_nsec);
+	syscall(__NR_clock_settime, CLOCK_THREAD_CPUTIME_ID, &t.ts);
+	printf("clock_settime(CLOCK_THREAD_CPUTIME_ID"
+	       ", {tv_sec=%lld, tv_nsec=%llu}) = -1 EINVAL (%m)\n",
+	       (long long) t.ts.tv_sec,
+	       zero_extend_signed_to_ull(t.ts.tv_nsec));
+
+	t.ts.tv_sec = 0xdeadbeefU;
+	t.ts.tv_nsec = 0xfacefeedU;
+	syscall(__NR_clock_settime, CLOCK_THREAD_CPUTIME_ID, &t.ts);
+	printf("clock_settime(CLOCK_THREAD_CPUTIME_ID"
+	       ", {tv_sec=%lld, tv_nsec=%llu}) = -1 EINVAL (%m)\n",
+	       (long long) t.ts.tv_sec,
+	       zero_extend_signed_to_ull(t.ts.tv_nsec));
+
+	t.ts.tv_sec = (time_t) 0xcafef00ddeadbeefLL;
+	t.ts.tv_nsec = (long) 0xbadc0dedfacefeedLL;
+	syscall(__NR_clock_settime, CLOCK_THREAD_CPUTIME_ID, &t.ts);
+	printf("clock_settime(CLOCK_THREAD_CPUTIME_ID"
+	       ", {tv_sec=%lld, tv_nsec=%llu}) = -1 EINVAL (%m)\n",
+	       (long long) t.ts.tv_sec,
+	       zero_extend_signed_to_ull(t.ts.tv_nsec));
 
 	puts("+++ exited with 0 +++");
 	return 0;
diff --git a/tests/clock_xettime.gen.test b/tests/clock_xettime.gen.test
new file mode 100755
index 0000000..590f058
--- /dev/null
+++ b/tests/clock_xettime.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (clock_xettime -a36 -e trace=clock_getres,clock_gettime,clock_settime); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a36 -e trace=clock_getres,clock_gettime,clock_settime
diff --git a/tests/clock_xettime.test b/tests/clock_xettime.test
deleted file mode 100755
index f045a66..0000000
--- a/tests/clock_xettime.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check clock_getres, clock_gettime, and clock_settime syscalls decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a36 -e trace=clock_getres,clock_gettime,clock_settime
diff --git a/tests/copy_file_range.c b/tests/copy_file_range.c
index 085010a..6bb989d 100644
--- a/tests/copy_file_range.c
+++ b/tests/copy_file_range.c
@@ -2,6 +2,7 @@
  * This file is part of copy_file_range strace test.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -41,8 +42,8 @@
 {
 	const long int fd_in = (long int) 0xdeadbeefffffffff;
 	const long int fd_out = (long int) 0xdeadbeeffffffffe;
-	long long int *const off_in = tail_alloc(sizeof(*off_in));
-	long long int *const off_out = tail_alloc(sizeof(*off_out));
+	TAIL_ALLOC_OBJECT_CONST_PTR(long long int, off_in);
+	TAIL_ALLOC_OBJECT_CONST_PTR(long long int, off_out);
 	*off_in = 0xdeadbef1facefed1;
 	*off_out = 0xdeadbef2facefed2;
 	const size_t len = (size_t) 0xdeadbef3facefed3ULL;
diff --git a/tests/copy_file_range.gen.test b/tests/copy_file_range.gen.test
new file mode 100755
index 0000000..4f3063b
--- /dev/null
+++ b/tests/copy_file_range.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (copy_file_range ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/copy_file_range.test b/tests/copy_file_range.test
deleted file mode 100755
index c39f6ac..0000000
--- a/tests/copy_file_range.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check copy_file_range syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff
diff --git a/tests/count.test b/tests/count.test
index e75dc6b..a9752c0 100755
--- a/tests/count.test
+++ b/tests/count.test
@@ -3,6 +3,7 @@
 # Check whether -c and -w options work.
 #
 # Copyright (c) 2014-2016 Dmitry V. Levin <[email protected]>
+# Copyright (c) 2014-2017 The strace developers.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -29,14 +30,14 @@
 
 . "${srcdir=.}/init.sh"
 
-run_prog ./sleep 0
+run_prog ../sleep 0
 check_prog grep
 
 grep_log()
 {
 	local pattern="$1"; shift
 
-	run_strace "$@" ./sleep 1
+	run_strace "$@" ../sleep 1
 
 	grep nanosleep "$LOG" > /dev/null ||
 		framework_skip_ 'sleep does not use nanosleep'
diff --git a/tests/creat.gen.test b/tests/creat.gen.test
new file mode 100755
index 0000000..d2e47d3
--- /dev/null
+++ b/tests/creat.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (creat -a20); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a20
diff --git a/tests/creat.test b/tests/creat.test
deleted file mode 100755
index 069648f..0000000
--- a/tests/creat.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check creat syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a20
diff --git a/tests/delete_module.c b/tests/delete_module.c
index 5a31760..0de35fe 100644
--- a/tests/delete_module.c
+++ b/tests/delete_module.c
@@ -2,6 +2,7 @@
  * Check decoding of delete_module syscall.
  *
  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -48,8 +49,7 @@
 		unsigned int val_prefix, val_suffix;
 	} flags[] = {
 		{ ARG_STR(0), 0, 0 },
-		{ (kernel_ulong_t) 0xffffffff00000000ULL | O_NONBLOCK,
-			"O_NONBLOCK", 0, 0 },
+		{ F8ILL_KULONG_MASK | O_NONBLOCK, "O_NONBLOCK", 0, 0 },
 		{ (kernel_ulong_t) 0xbadc0dedfacef157ULL & ~(O_NONBLOCK | O_TRUNC),
 			" /* O_??? */", 0xfacef157U & ~(O_NONBLOCK | O_TRUNC), 0},
 		{ (kernel_ulong_t) (0xfacef157deade71cULL & ~O_NONBLOCK) | O_TRUNC,
@@ -65,7 +65,7 @@
 	fill_memory_ex(bogus_param1, PARAM1_LEN, PARAM1_BASE, PARAM1_LEN);
 	fill_memory_ex(bogus_param2, PARAM2_LEN, PARAM2_BASE, PARAM2_LEN);
 
-	rc = syscall(__NR_delete_module, NULL, bogus_zero);
+	rc = syscall(__NR_delete_module, NULL, F8ILL_KULONG_MASK);
 	printf("delete_module(NULL, 0) = %s\n", sprintrc(rc));
 
 	rc = syscall(__NR_delete_module, bogus_param1, flags[0].val);
diff --git a/tests/delete_module.gen.test b/tests/delete_module.gen.test
new file mode 100755
index 0000000..4e4c671
--- /dev/null
+++ b/tests/delete_module.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (delete_module -a23); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a23
diff --git a/tests/delete_module.test b/tests/delete_module.test
deleted file mode 100755
index fb86ec9..0000000
--- a/tests/delete_module.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of delete_module syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a23
diff --git a/tests/detach-running.test b/tests/detach-running.test
index 006efb8..ba5ffbf 100755
--- a/tests/detach-running.test
+++ b/tests/detach-running.test
@@ -3,6 +3,7 @@
 # Ensure that strace can detach from running processes.
 #
 # Copyright (c) 2013-2015 Dmitry V. Levin <[email protected]>
+# Copyright (c) 2014-2017 The strace developers.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -36,7 +37,7 @@
 
 set -e
 
-./set_ptracer_any sh -c "echo > $LOG; while :; do :; done" > /dev/null &
+../set_ptracer_any sh -c "echo > $LOG; while :; do :; done" > /dev/null &
 
 while ! [ -s "$LOG" ]; do
 	kill -0 $! 2> /dev/null ||
@@ -54,7 +55,6 @@
 	return 0
 }
 
-rm -f "$LOG"
 $STRACE -p $tracee_pid 2> "$LOG" &
 
 while ! grep -F "Process $tracee_pid attached" "$LOG" > /dev/null; do
diff --git a/tests/detach-sleeping.test b/tests/detach-sleeping.test
index 54304f3..a0975e3 100755
--- a/tests/detach-sleeping.test
+++ b/tests/detach-sleeping.test
@@ -3,6 +3,7 @@
 # Ensure that strace can detach from sleeping processes.
 #
 # Copyright (c) 2013-2015 Dmitry V. Levin <[email protected]>
+# Copyright (c) 2014-2017 The strace developers.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -36,8 +37,7 @@
 
 set -e
 
-rm -f "$LOG"
-./set_ptracer_any sleep $((2*$TIMEOUT_DURATION)) > "$LOG" &
+../set_ptracer_any sleep $((2*$TIMEOUT_DURATION)) > "$LOG" &
 
 while ! [ -s "$LOG" ]; do
 	kill -0 $! 2> /dev/null ||
@@ -55,7 +55,6 @@
 	return 0
 }
 
-rm -f "$LOG"
 $STRACE -p $tracee_pid 2> "$LOG" &
 
 while ! grep -F "Process $tracee_pid attached" "$LOG" > /dev/null; do
diff --git a/tests/detach-stopped.test b/tests/detach-stopped.test
index 8f480e7..a9f9c72 100755
--- a/tests/detach-stopped.test
+++ b/tests/detach-stopped.test
@@ -3,6 +3,7 @@
 # Ensure that strace can detach from stopped processes.
 #
 # Copyright (c) 2013-2015 Dmitry V. Levin <[email protected]>
+# Copyright (c) 2014-2017 The strace developers.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -41,8 +42,8 @@
 
 set -e
 
-rm -f "$LOG"
-./set_ptracer_any sleep $((2*$TIMEOUT_DURATION)) > "$LOG" &
+> "$LOG"
+../set_ptracer_any sleep $((2*$TIMEOUT_DURATION)) > "$LOG" &
 
 while ! [ -s "$LOG" ]; do
 	kill -0 $! 2> /dev/null ||
@@ -62,7 +63,7 @@
 	return 0
 }
 
-rm -f "$LOG"
+> "$LOG"
 $STRACE -p $tracee_pid 2> "$LOG" &
 
 while ! grep -F "Process $tracee_pid attached" "$LOG" > /dev/null; do
diff --git a/tests/dup.gen.test b/tests/dup.gen.test
new file mode 100755
index 0000000..e5729c0
--- /dev/null
+++ b/tests/dup.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (dup -a8); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a8
diff --git a/tests/dup.test b/tests/dup.test
deleted file mode 100755
index 1dc1919..0000000
--- a/tests/dup.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check dup syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a8
diff --git a/tests/dup2.gen.test b/tests/dup2.gen.test
new file mode 100755
index 0000000..fd1f5c9
--- /dev/null
+++ b/tests/dup2.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (dup2 -a13); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a13
diff --git a/tests/dup2.test b/tests/dup2.test
deleted file mode 100755
index 509c5db..0000000
--- a/tests/dup2.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check dup2 syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a13
diff --git a/tests/dup3.gen.test b/tests/dup3.gen.test
new file mode 100755
index 0000000..d6ff7d7
--- /dev/null
+++ b/tests/dup3.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (dup3 -a24); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a24
diff --git a/tests/dup3.test b/tests/dup3.test
deleted file mode 100755
index 293f78f..0000000
--- a/tests/dup3.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check dup3 syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a24
diff --git a/tests/epoll_create.gen.test b/tests/epoll_create.gen.test
new file mode 100755
index 0000000..841da6d
--- /dev/null
+++ b/tests/epoll_create.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (epoll_create -a17); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a17
diff --git a/tests/epoll_create.test b/tests/epoll_create.test
deleted file mode 100755
index 472a9bd..0000000
--- a/tests/epoll_create.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check epoll_create syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a17
diff --git a/tests/epoll_create1.gen.test b/tests/epoll_create1.gen.test
new file mode 100755
index 0000000..c5e62a0
--- /dev/null
+++ b/tests/epoll_create1.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (epoll_create1 -a28); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a28
diff --git a/tests/epoll_create1.test b/tests/epoll_create1.test
deleted file mode 100755
index 7a926a9..0000000
--- a/tests/epoll_create1.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check epoll_create1 syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a28
diff --git a/tests/epoll_ctl.c b/tests/epoll_ctl.c
index e666055..2251b35 100644
--- a/tests/epoll_ctl.c
+++ b/tests/epoll_ctl.c
@@ -11,14 +11,14 @@
 static long
 invoke_syscall(unsigned long epfd, unsigned long op, unsigned long fd, void *ev)
 {
-	op |= (unsigned long) 0xffffffff00000000ULL;
-	return syscall(__NR_epoll_ctl, epfd, op, fd, (unsigned long) ev);
+	return syscall(__NR_epoll_ctl, epfd, F8ILL_KULONG_MASK | op,
+		       fd, (unsigned long) ev);
 }
 
 int
 main(void)
 {
-	struct epoll_event *const ev = tail_alloc(sizeof(*ev));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct epoll_event, ev);
 	ev->events = EPOLLIN;
 
 	long rc = invoke_syscall(-1U, EPOLL_CTL_ADD, -2U, ev);
diff --git a/tests/epoll_ctl.gen.test b/tests/epoll_ctl.gen.test
new file mode 100755
index 0000000..68c96eb
--- /dev/null
+++ b/tests/epoll_ctl.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (epoll_ctl ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/epoll_ctl.test b/tests/epoll_ctl.test
deleted file mode 100755
index 1aded54..0000000
--- a/tests/epoll_ctl.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check epoll_ctl syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff
diff --git a/tests/epoll_pwait.c b/tests/epoll_pwait.c
index eaaa34d..841e722 100644
--- a/tests/epoll_pwait.c
+++ b/tests/epoll_pwait.c
@@ -12,7 +12,7 @@
 main(void)
 {
 	sigset_t set[2];
-	struct epoll_event *const ev = tail_alloc(sizeof(*ev));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct epoll_event, ev);
 
 	long rc = syscall(__NR_epoll_pwait, -1, ev, 1, -2,
 			  set, (kernel_ulong_t) sizeof(set));
diff --git a/tests/epoll_pwait.gen.test b/tests/epoll_pwait.gen.test
new file mode 100755
index 0000000..c558efc
--- /dev/null
+++ b/tests/epoll_pwait.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (epoll_pwait ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/epoll_pwait.test b/tests/epoll_pwait.test
deleted file mode 100755
index c7aeeac..0000000
--- a/tests/epoll_pwait.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of epoll_pwait syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff
diff --git a/tests/epoll_wait.c b/tests/epoll_wait.c
index 038bf1f..caa3027 100644
--- a/tests/epoll_wait.c
+++ b/tests/epoll_wait.c
@@ -10,7 +10,7 @@
 int
 main(void)
 {
-	struct epoll_event *const ev = tail_alloc(sizeof(*ev));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct epoll_event, ev);
 
 	long rc = syscall(__NR_epoll_wait, -1, ev, 1, -2);
 	printf("epoll_wait(-1, %p, 1, -2) = %ld %s (%m)\n",
diff --git a/tests/epoll_wait.gen.test b/tests/epoll_wait.gen.test
new file mode 100755
index 0000000..024cc0f
--- /dev/null
+++ b/tests/epoll_wait.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (epoll_wait -a26); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a26
diff --git a/tests/epoll_wait.test b/tests/epoll_wait.test
deleted file mode 100755
index 83ae161..0000000
--- a/tests/epoll_wait.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check epoll_wait syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a26
diff --git a/tests/erestartsys.gen.test b/tests/erestartsys.gen.test
new file mode 100755
index 0000000..0fc3215
--- /dev/null
+++ b/tests/erestartsys.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (erestartsys -a34 -e signal=none -e trace=recvfrom); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a34 -e signal=none -e trace=recvfrom
diff --git a/tests/erestartsys.test b/tests/erestartsys.test
deleted file mode 100755
index 91f711f..0000000
--- a/tests/erestartsys.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of ERESTARTSYS error code.
-. "${srcdir=.}/init.sh"
-
-run_strace_match_diff -a34 -e signal=none -e trace=recvfrom
diff --git a/tests/execve-v.test b/tests/execve-v.test
index cce5860..52ff0d7 100755
--- a/tests/execve-v.test
+++ b/tests/execve-v.test
@@ -11,5 +11,3 @@
 # Filter out execve() call made by strace.
 grep -F test.execve < "$LOG" > "$OUT"
 match_diff "$OUT" "$EXP"
-
-rm -f "$EXP" "$OUT"
diff --git a/tests/execve.c b/tests/execve.c
index 74749e7..c558dd3 100644
--- a/tests/execve.c
+++ b/tests/execve.c
@@ -2,6 +2,7 @@
  * This file is part of execve strace test.
  *
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -62,13 +63,15 @@
 #if VERBOSE
 	       ", [\"%s\", \"%s\", %p, %p, %p, ???]"
 #else
-	       ", [/* 5 vars, unterminated */]"
+	       ", %p /* 5 vars, unterminated */"
 #endif
 	       ") = -1 ENOENT (%m)\n",
 	       Q_FILENAME, q_argv[0], q_argv[1], q_argv[2],
 	       argv[3], argv[4], argv[5]
 #if VERBOSE
 	       , q_envp[0], q_envp[1], envp[2], envp[3], envp[4]
+#else
+	       , tail_envp
 #endif
 	       );
 
@@ -80,12 +83,14 @@
 #if VERBOSE
 	       ", [\"%s\", \"%s\"]"
 #else
-	       ", [/* 2 vars */]"
+	       ", %p /* 2 vars */"
 #endif
 	       ") = -1 ENOENT (%m)\n",
 	       Q_FILENAME, q_argv[0], q_argv[1], q_argv[2]
 #if VERBOSE
 	       , q_envp[0], q_envp[1]
+#else
+	       , tail_envp
 #endif
 	       );
 
@@ -94,16 +99,18 @@
 #if VERBOSE
 	       ", [\"%s\"]"
 #else
-	       ", [/* 1 var */]"
+	       ", %p /* 1 var */"
 #endif
 	       ") = -1 ENOENT (%m)\n",
 	       Q_FILENAME, q_argv[2]
 #if VERBOSE
 	       , q_envp[1]
+#else
+	       , tail_envp + 1
 #endif
 	       );
 
-	char **const empty = tail_alloc(sizeof(*empty));
+	TAIL_ALLOC_OBJECT_CONST_PTR(char *, empty);
 	char **const efault = empty + 1;
 	*empty = NULL;
 
@@ -112,9 +119,13 @@
 #if VERBOSE
 	       ", []"
 #else
-	       ", [/* 0 vars */]"
+	       ", %p /* 0 vars */"
 #endif
-	       ") = -1 ENOENT (%m)\n", Q_FILENAME);
+	       ") = -1 ENOENT (%m)\n", Q_FILENAME
+#if !VERBOSE
+	       , empty
+#endif
+	       );
 
 	char str_a[] = "012345678901234567890123456789012";
 	char str_b[] = "_abcdefghijklmnopqrstuvwxyz()[]{}";
@@ -141,10 +152,11 @@
 	printf("], [\"%.*s\"...", DEFAULT_STRLEN, b[0]);
 	for (i = 1; i <= DEFAULT_STRLEN; ++i)
 		printf(", \"%s\"", b[i]);
+	printf("]");
 #else
-	printf("], [/* %u vars */", DEFAULT_STRLEN + 1);
+	printf("], %p /* %u vars */", b, DEFAULT_STRLEN + 1);
 #endif
-	printf("]) = -1 ENOENT (%m)\n");
+	printf(") = -1 ENOENT (%m)\n");
 
 	execve(FILENAME, a + 1, b + 1);
 	printf("execve(\"%s\", [\"%s\"", Q_FILENAME, a[1]);
@@ -154,10 +166,11 @@
 	printf("], [\"%s\"", b[1]);
 	for (i = 2; i <= DEFAULT_STRLEN; ++i)
 		printf(", \"%s\"", b[i]);
+	printf("]");
 #else
-	printf("], [/* %d vars */", DEFAULT_STRLEN);
+	printf("], %p /* %d vars */", b + 1, DEFAULT_STRLEN);
 #endif
-	printf("]) = -1 ENOENT (%m)\n");
+	printf(") = -1 ENOENT (%m)\n");
 
 	execve(FILENAME, (char **) tail_argv[ARRAY_SIZE(q_argv)], efault);
 	printf("execve(\"%s\", NULL, %p) = -1 ENOENT (%m)\n",
diff --git a/tests/execve.test b/tests/execve.test
index 263b6fc..5635a94 100755
--- a/tests/execve.test
+++ b/tests/execve.test
@@ -11,5 +11,3 @@
 # Filter out execve() call made by strace.
 grep -F test.execve < "$LOG" > "$OUT"
 match_diff "$OUT" "$EXP"
-
-rm -f "$EXP" "$OUT"
diff --git a/tests/execveat-v.gen.test b/tests/execveat-v.gen.test
new file mode 100755
index 0000000..f7d572f
--- /dev/null
+++ b/tests/execveat-v.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (execveat-v -v -e trace=execveat); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -v -e trace=execveat
diff --git a/tests/execveat-v.test b/tests/execveat-v.test
deleted file mode 100755
index a905224..0000000
--- a/tests/execveat-v.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check verbose decoding of execveat syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -v -e trace=execveat
diff --git a/tests/execveat.c b/tests/execveat.c
index 9083830..8ffc4d5 100644
--- a/tests/execveat.c
+++ b/tests/execveat.c
@@ -2,6 +2,7 @@
  * This file is part of execveat strace test.
  *
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -67,13 +68,15 @@
 #if VERBOSE
 	       ", [\"%s\", \"%s\", %p, %p, %p, ???]"
 #else
-	       ", [/* 5 vars, unterminated */]"
+	       ", %p /* 5 vars, unterminated */"
 #endif
 	       ", AT_SYMLINK_NOFOLLOW|AT_EMPTY_PATH) = -1 %s (%m)\n",
 	       Q_FILENAME, q_argv[0], q_argv[1], q_argv[2],
 	       argv[3], argv[4], argv[5],
 #if VERBOSE
 	       q_envp[0], q_envp[1], envp[2], envp[3], envp[4],
+#else
+	       tail_envp,
 #endif
 	       errno2name());
 
@@ -85,12 +88,14 @@
 #if VERBOSE
 	       ", [\"%s\", \"%s\"]"
 #else
-	       ", [/* 2 vars */]"
+	       ", %p /* 2 vars */"
 #endif
 	       ", AT_SYMLINK_NOFOLLOW|AT_EMPTY_PATH) = -1 %s (%m)\n",
 	       Q_FILENAME, q_argv[0], q_argv[1], q_argv[2],
 #if VERBOSE
 	       q_envp[0], q_envp[1],
+#else
+	       tail_envp,
 #endif
 	       errno2name());
 
@@ -99,16 +104,18 @@
 #if VERBOSE
 	       ", [\"%s\"]"
 #else
-	       ", [/* 1 var */]"
+	       ", %p /* 1 var */"
 #endif
 	       ", AT_SYMLINK_NOFOLLOW|AT_EMPTY_PATH) = -1 %s (%m)\n",
 	       Q_FILENAME, q_argv[2],
 #if VERBOSE
 	       q_envp[1],
+#else
+	       tail_envp + 1,
 #endif
 	       errno2name());
 
-	char **const empty = tail_alloc(sizeof(*empty));
+	TAIL_ALLOC_OBJECT_CONST_PTR(char *, empty);
 	char **const efault = empty + 1;
 	*empty = NULL;
 
@@ -117,10 +124,14 @@
 #if VERBOSE
 	       ", []"
 #else
-	       ", [/* 0 vars */]"
+	       ", %p /* 0 vars */"
 #endif
 	       ", AT_SYMLINK_NOFOLLOW|AT_EMPTY_PATH) = -1 %s (%m)\n",
-	       Q_FILENAME, errno2name());
+	       Q_FILENAME,
+#if !VERBOSE
+	       empty,
+#endif
+	       errno2name());
 
 	char str_a[] = "012345678901234567890123456789012";
 	char str_b[] = "_abcdefghijklmnopqrstuvwxyz()[]{}";
@@ -147,10 +158,11 @@
 	printf("], [\"%.*s\"...", DEFAULT_STRLEN, b[0]);
 	for (i = 1; i <= DEFAULT_STRLEN; ++i)
 		printf(", \"%s\"", b[i]);
+	printf("]");
 #else
-	printf("], [/* %u vars */", DEFAULT_STRLEN + 1);
+	printf("], %p /* %u vars */", b, DEFAULT_STRLEN + 1);
 #endif
-	printf("], AT_SYMLINK_NOFOLLOW|AT_EMPTY_PATH) = -1 %s (%m)\n",
+	printf(", AT_SYMLINK_NOFOLLOW|AT_EMPTY_PATH) = -1 %s (%m)\n",
 	       errno2name());
 
 	syscall(__NR_execveat, -100, FILENAME, a + 1, b + 1, 0x1100);
@@ -161,10 +173,11 @@
 	printf("], [\"%s\"", b[1]);
 	for (i = 2; i <= DEFAULT_STRLEN; ++i)
 		printf(", \"%s\"", b[i]);
+	printf("]");
 #else
-	printf("], [/* %d vars */", DEFAULT_STRLEN);
+	printf("], %p /* %d vars */", b + 1, DEFAULT_STRLEN);
 #endif
-	printf("], AT_SYMLINK_NOFOLLOW|AT_EMPTY_PATH) = -1 %s (%m)\n",
+	printf(", AT_SYMLINK_NOFOLLOW|AT_EMPTY_PATH) = -1 %s (%m)\n",
 	       errno2name());
 
 	syscall(__NR_execveat, -100, FILENAME, NULL, efault, 0x1100);
diff --git a/tests/execveat.gen.test b/tests/execveat.gen.test
new file mode 100755
index 0000000..c92e4d6
--- /dev/null
+++ b/tests/execveat.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (execveat ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/execveat.test b/tests/execveat.test
deleted file mode 100755
index 879e03e..0000000
--- a/tests/execveat.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check execveat syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff
diff --git a/tests/faccessat.gen.test b/tests/faccessat.gen.test
new file mode 100755
index 0000000..4ccec2a
--- /dev/null
+++ b/tests/faccessat.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (faccessat -P $NAME.sample); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -P $NAME.sample
diff --git a/tests/faccessat.test b/tests/faccessat.test
deleted file mode 100755
index 61e7e2f..0000000
--- a/tests/faccessat.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check faccessat syscall decoding.
-
-. "${srcdir=.}/openat.test"
diff --git a/tests/fadvise64.test b/tests/fadvise64.test
index 9f74672..161b28f 100755
--- a/tests/fadvise64.test
+++ b/tests/fadvise64.test
@@ -9,4 +9,3 @@
 check_prog grep
 grep -v "^$NAME([0123]," < "$LOG" > "$OUT"
 match_diff "$OUT" "$EXP"
-rm -f "$EXP" "$OUT"
diff --git a/tests/fadvise64_64.gen.test b/tests/fadvise64_64.gen.test
new file mode 100755
index 0000000..5f95b3c
--- /dev/null
+++ b/tests/fadvise64_64.gen.test
@@ -0,0 +1,3 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (fadvise64_64 +fadvise64.test); do not edit.
+. "${srcdir=.}/fadvise64.test"
diff --git a/tests/fadvise64_64.test b/tests/fadvise64_64.test
deleted file mode 100755
index a50fe2b..0000000
--- a/tests/fadvise64_64.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check decoding of fadvise64_64 syscall.
-
-. "${srcdir=.}/fadvise64.test"
diff --git a/tests/fallocate.gen.test b/tests/fallocate.gen.test
new file mode 100755
index 0000000..c6cfdb7
--- /dev/null
+++ b/tests/fallocate.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (fallocate -a18); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a18
diff --git a/tests/fallocate.test b/tests/fallocate.test
deleted file mode 100755
index 405187e..0000000
--- a/tests/fallocate.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check getcwd syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a18
diff --git a/tests/fanotify_init.c b/tests/fanotify_init.c
index c14b413..15e09ee 100644
--- a/tests/fanotify_init.c
+++ b/tests/fanotify_init.c
@@ -2,6 +2,7 @@
  * Check decoding of fanotify_init syscall.
  *
  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -60,7 +61,7 @@
 main(void)
 {
 	static const struct strval flags[] = {
-		{ (kernel_ulong_t) 0xffffffff00000000ULL, "FAN_CLASS_NOTIF" },
+		{ F8ILL_KULONG_MASK, "FAN_CLASS_NOTIF" },
 		{ (kernel_ulong_t) 0xffffffff0000000cULL,
 			"0xc /* FAN_CLASS_??? */" },
 		{ (kernel_ulong_t) 0xdec0deddefaced04ULL,
@@ -70,7 +71,7 @@
 			"FAN_UNLIMITED_QUEUE|FAN_UNLIMITED_MARKS|0xffffffc0" },
 	};
 	static const struct strval event_f_flags[] = {
-		{ (kernel_ulong_t) 0xffffffff00000000ULL, "O_RDONLY" },
+		{ F8ILL_KULONG_MASK, "O_RDONLY" },
 		{ (kernel_ulong_t) 0xdeadbeef80000001ULL,
 			"O_WRONLY|0x80000000" }
 	};
diff --git a/tests/fanotify_init.gen.test b/tests/fanotify_init.gen.test
new file mode 100755
index 0000000..ee519e6
--- /dev/null
+++ b/tests/fanotify_init.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (fanotify_init ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/fanotify_init.test b/tests/fanotify_init.test
deleted file mode 100755
index 8d26af4..0000000
--- a/tests/fanotify_init.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of fanotify_init syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff
diff --git a/tests/fanotify_mark.c b/tests/fanotify_mark.c
index 43f285d..11cf7d0 100644
--- a/tests/fanotify_mark.c
+++ b/tests/fanotify_mark.c
@@ -3,6 +3,7 @@
  *
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -90,11 +91,11 @@
 
 	static const kernel_ulong_t fds[] = {
 		(kernel_ulong_t) 0xdeadfeed12345678ULL,
-		(kernel_ulong_t) 0xffffffff00000000ULL,
+		F8ILL_KULONG_MASK,
 		(kernel_ulong_t) 0xdeb0d1edffffffffULL,
 	};
 	static const struct strval flags[] = {
-		{ (kernel_ulong_t) 0xffffffff00000000ULL, "0" },
+		{ F8ILL_KULONG_MASK, "0" },
 		{ (kernel_ulong_t) 0xdec0deddefaced00ULL,
 			"0xefaced00 /* FAN_MARK_??? */" },
 		{ (kernel_ulong_t) 0xda7a105700000040ULL,
diff --git a/tests/fanotify_mark.gen.test b/tests/fanotify_mark.gen.test
new file mode 100755
index 0000000..ce16a55
--- /dev/null
+++ b/tests/fanotify_mark.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (fanotify_mark -a32); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a32
diff --git a/tests/fanotify_mark.test b/tests/fanotify_mark.test
deleted file mode 100755
index fd67138..0000000
--- a/tests/fanotify_mark.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of fanotify_mark syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a32
diff --git a/tests/fchdir.gen.test b/tests/fchdir.gen.test
new file mode 100755
index 0000000..c80e141
--- /dev/null
+++ b/tests/fchdir.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (fchdir -a11); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a11
diff --git a/tests/fchdir.test b/tests/fchdir.test
deleted file mode 100755
index 3a4296e..0000000
--- a/tests/fchdir.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check fchdir syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a11
diff --git a/tests/fchmod.gen.test b/tests/fchmod.gen.test
new file mode 100755
index 0000000..f327fb7
--- /dev/null
+++ b/tests/fchmod.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (fchmod -a15); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a15
diff --git a/tests/fchmod.test b/tests/fchmod.test
deleted file mode 100755
index 4cb1263..0000000
--- a/tests/fchmod.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check fchmod syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a15
diff --git a/tests/fchmodat.gen.test b/tests/fchmodat.gen.test
new file mode 100755
index 0000000..9ee1f01
--- /dev/null
+++ b/tests/fchmodat.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (fchmodat ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/fchmodat.test b/tests/fchmodat.test
deleted file mode 100755
index 13cbe80..0000000
--- a/tests/fchmodat.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of fchmodat syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff
diff --git a/tests/fchown.gen.test b/tests/fchown.gen.test
new file mode 100755
index 0000000..63ee545
--- /dev/null
+++ b/tests/fchown.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (fchown -a16); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a16
diff --git a/tests/fchown.test b/tests/fchown.test
deleted file mode 100755
index 63a0f2e..0000000
--- a/tests/fchown.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check fchown syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a16
diff --git a/tests/fchown32.gen.test b/tests/fchown32.gen.test
new file mode 100755
index 0000000..d8167dd
--- /dev/null
+++ b/tests/fchown32.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (fchown32 -a18); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a18
diff --git a/tests/fchown32.test b/tests/fchown32.test
deleted file mode 100755
index e837f54..0000000
--- a/tests/fchown32.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check fchown32 syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a18
diff --git a/tests/fchownat.gen.test b/tests/fchownat.gen.test
new file mode 100755
index 0000000..2ec9e32
--- /dev/null
+++ b/tests/fchownat.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (fchownat ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/fchownat.test b/tests/fchownat.test
deleted file mode 100755
index e5d0f28..0000000
--- a/tests/fchownat.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of fchownat syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff
diff --git a/tests/fcntl.c b/tests/fcntl.c
index f060cdf..4f62ca2 100644
--- a/tests/fcntl.c
+++ b/tests/fcntl.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -44,9 +45,9 @@
 		.l_start = 0xdefaced1facefeedULL,
 		.l_len = 0xdefaced2cafef00dULL
 	};
-	invoke_test_syscall(cmd, &fl);
+	long rc = invoke_test_syscall(cmd, &fl);
 	printf("%s(0, %s, %p) = %s\n",
-	       TEST_SYSCALL_STR, name, &fl, EINVAL_STR);
+	       TEST_SYSCALL_STR, name, &fl, sprintrc(rc));
 }
 
 static void
diff --git a/tests/fcntl.gen.test b/tests/fcntl.gen.test
new file mode 100755
index 0000000..83a1af4
--- /dev/null
+++ b/tests/fcntl.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (fcntl -a8); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a8
diff --git a/tests/fcntl.test b/tests/fcntl.test
deleted file mode 100755
index 9aea122..0000000
--- a/tests/fcntl.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check fcntl decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a8
diff --git a/tests/fcntl64.c b/tests/fcntl64.c
index 5ecd6eb..068956e 100644
--- a/tests/fcntl64.c
+++ b/tests/fcntl64.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -44,10 +45,10 @@
 		.l_start = 0xdefaced1facefeedULL,
 		.l_len = 0xdefaced2cafef00dULL
 	};
-	invoke_test_syscall(cmd, &fl);
+	long rc = invoke_test_syscall(cmd, &fl);
 	printf("%s(0, %s, {l_type=F_RDLCK, l_whence=SEEK_SET"
 	       ", l_start=%jd, l_len=%jd}) = %s\n", TEST_SYSCALL_STR, name,
-	       (intmax_t) fl.l_start, (intmax_t) fl.l_len, EINVAL_STR);
+	       (intmax_t) fl.l_start, (intmax_t) fl.l_len, sprintrc(rc));
 }
 
 static void
@@ -67,7 +68,7 @@
 	long rc = invoke_test_syscall(F_SETLK64, &fl);
 	printf("%s(0, F_SETLK64, {l_type=F_RDLCK, l_whence=SEEK_SET"
 	       ", l_start=0, l_len=%d}) = %s\n",
-	       TEST_SYSCALL_STR, FILE_LEN, rc ? EINVAL_STR : "0");
+	       TEST_SYSCALL_STR, FILE_LEN, sprintrc(rc));
 
 	if (rc)
 		return;
diff --git a/tests/fcntl64.gen.test b/tests/fcntl64.gen.test
new file mode 100755
index 0000000..9d3b98a
--- /dev/null
+++ b/tests/fcntl64.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (fcntl64 -a8); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a8
diff --git a/tests/fcntl64.test b/tests/fcntl64.test
deleted file mode 100755
index 00ba671..0000000
--- a/tests/fcntl64.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check fcntl64 syscall decoding.
-
-. "${srcdir=.}/fcntl.test"
diff --git a/tests/fdatasync.gen.test b/tests/fdatasync.gen.test
new file mode 100755
index 0000000..0dbea8a
--- /dev/null
+++ b/tests/fdatasync.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (fdatasync -a14); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a14
diff --git a/tests/fdatasync.test b/tests/fdatasync.test
deleted file mode 100755
index ff59749..0000000
--- a/tests/fdatasync.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check fdatasync syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a14
diff --git a/tests/file_handle.c b/tests/file_handle.c
index a5ad6c7..bbdf48b 100644
--- a/tests/file_handle.c
+++ b/tests/file_handle.c
@@ -3,6 +3,7 @@
  *
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -187,7 +188,7 @@
 		(kernel_ulong_t) 0x12345678ffffff9cULL,
 	};
 	static const struct strval open_flags[] = {
-		{ (kernel_ulong_t) 0xffffffff00000000ULL, "O_RDONLY" },
+		{ F8ILL_KULONG_MASK, "O_RDONLY" },
 		{ (kernel_ulong_t) 0xdeadbeef80000001ULL,
 			"O_WRONLY|0x80000000" }
 	};
@@ -208,7 +209,7 @@
 		tail_alloc(sizeof(struct file_handle) + 128);
 	struct file_handle *handle_256 =
 		tail_alloc(sizeof(struct file_handle) + 256);
-	int *bogus_mount_id = tail_alloc(sizeof(*bogus_mount_id));
+	TAIL_ALLOC_OBJECT_CONST_PTR(int, bogus_mount_id);
 
 	char handle_0_addr[sizeof("0x") + sizeof(void *) * 2];
 
diff --git a/tests/file_handle.gen.test b/tests/file_handle.gen.test
new file mode 100755
index 0000000..8280f9f
--- /dev/null
+++ b/tests/file_handle.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (file_handle -e trace=name_to_handle_at,open_by_handle_at); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -e trace=name_to_handle_at,open_by_handle_at
diff --git a/tests/file_handle.test b/tests/file_handle.test
deleted file mode 100755
index 1ccc9d4..0000000
--- a/tests/file_handle.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check name_to_handle_at and open_by_handle_at syscalls decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -e trace=name_to_handle_at,open_by_handle_at
diff --git a/tests/file_ioctl.c b/tests/file_ioctl.c
index 0fe17b1..ded67a9 100644
--- a/tests/file_ioctl.c
+++ b/tests/file_ioctl.c
@@ -13,7 +13,7 @@
 test_fiemap(void)
 {
 	(void) tail_alloc(1);
-	struct fiemap *const args = tail_alloc(sizeof(*args));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct fiemap, args);
 
 	printf("ioctl(-1, FS_IOC_FIEMAP, {fm_start=%" PRI__u64
 	       ", fm_length=%" PRI__u64", fm_flags=",
diff --git a/tests/file_ioctl.gen.test b/tests/file_ioctl.gen.test
new file mode 100755
index 0000000..f7e58f5
--- /dev/null
+++ b/tests/file_ioctl.gen.test
@@ -0,0 +1,3 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (file_ioctl +ioctl.test); do not edit.
+. "${srcdir=.}/ioctl.test"
diff --git a/tests/file_ioctl.test b/tests/file_ioctl.test
deleted file mode 100755
index 7b8b8ce..0000000
--- a/tests/file_ioctl.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check FS_IOC_FIEMAP ioctl decoding.
-
-. "${srcdir=.}/ioctl.test"
diff --git a/tests/finit_module.c b/tests/finit_module.c
index 3f0178f..c97471a 100644
--- a/tests/finit_module.c
+++ b/tests/finit_module.c
@@ -2,6 +2,7 @@
  * Check decoding of finit_module syscall.
  *
  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -68,7 +69,8 @@
 	fill_memory_ex(bogus_param1, PARAM1_LEN, PARAM1_BASE, PARAM1_LEN);
 	fill_memory_ex(bogus_param2, PARAM2_LEN, PARAM2_BASE, PARAM2_LEN);
 
-	rc = syscall(__NR_finit_module, bogus_zero, NULL, bogus_zero);
+	rc = syscall(__NR_finit_module, F8ILL_KULONG_MASK, NULL,
+		     F8ILL_KULONG_MASK);
 	printf("finit_module(0, NULL, 0) = %s\n", sprintrc(rc));
 
 	rc = syscall(__NR_finit_module, bogus_fd, bogus_param1, flags[0].val);
diff --git a/tests/finit_module.gen.test b/tests/finit_module.gen.test
new file mode 100755
index 0000000..f2e56af
--- /dev/null
+++ b/tests/finit_module.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (finit_module -a25); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a25
diff --git a/tests/finit_module.test b/tests/finit_module.test
deleted file mode 100755
index bd644f3..0000000
--- a/tests/finit_module.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of finit_module syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a25
diff --git a/tests/flock.gen.test b/tests/flock.gen.test
new file mode 100755
index 0000000..dff2bac
--- /dev/null
+++ b/tests/flock.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (flock -a19); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a19
diff --git a/tests/flock.test b/tests/flock.test
deleted file mode 100755
index 24fcd74..0000000
--- a/tests/flock.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check flock syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a19
diff --git a/tests/fork-f.gen.test b/tests/fork-f.gen.test
new file mode 100755
index 0000000..b534e13
--- /dev/null
+++ b/tests/fork-f.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (fork-f -a26 -qq -f -e signal=none -e trace=chdir); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a26 -qq -f -e signal=none -e trace=chdir
diff --git a/tests/fork-f.test b/tests/fork-f.test
deleted file mode 100755
index d8ca1e3..0000000
--- a/tests/fork-f.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check how strace -f follows fork syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a26 -qq -f -e trace=chdir -e signal=none
diff --git a/tests/fstat.c b/tests/fstat.c
index 12df3e1..1482bb1 100644
--- a/tests/fstat.c
+++ b/tests/fstat.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff --git a/tests/fstat.gen.test b/tests/fstat.gen.test
new file mode 100755
index 0000000..8686ec8
--- /dev/null
+++ b/tests/fstat.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (fstat -a15 -v -P stat.sample); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a15 -v -P stat.sample
diff --git a/tests/fstat.test b/tests/fstat.test
deleted file mode 100755
index 2ba0fba..0000000
--- a/tests/fstat.test
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/sh
-
-# Check fstat syscall decoding.
-
-. "${srcdir=.}/init.sh"
-
-# strace -P is implemented using /proc/self/fd
-[ -d /proc/self/fd/ ] ||
-	framework_skip_ '/proc/self/fd/ is not available'
-
-syscall=$NAME
-run_prog > /dev/null
-sample=$syscall.sample
-> "$sample"
-run_strace -ve$syscall -P$sample -a21 $args > "$OUT"
-match_diff "$LOG" "$OUT"
-rm -f "$OUT"
-
-exit 0
diff --git a/tests/fstat64.c b/tests/fstat64.c
index a9c2e07..c63be60 100644
--- a/tests/fstat64.c
+++ b/tests/fstat64.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff --git a/tests/fstat64.gen.test b/tests/fstat64.gen.test
new file mode 100755
index 0000000..a452b84
--- /dev/null
+++ b/tests/fstat64.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (fstat64 -a17 -v -P stat.sample); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a17 -v -P stat.sample
diff --git a/tests/fstat64.test b/tests/fstat64.test
deleted file mode 100755
index 8b4f5ef..0000000
--- a/tests/fstat64.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check fstat64 syscall decoding.
-
-. "${srcdir=.}/fstat.test"
diff --git a/tests/fstatat.c b/tests/fstatat.c
index 66138c2..ea331b4 100644
--- a/tests/fstatat.c
+++ b/tests/fstatat.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff --git a/tests/fstatat64.c b/tests/fstatat64.c
index 03082a8..8de7ba6 100644
--- a/tests/fstatat64.c
+++ b/tests/fstatat64.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff --git a/tests/fstatat64.gen.test b/tests/fstatat64.gen.test
new file mode 100755
index 0000000..8da5c7f
--- /dev/null
+++ b/tests/fstatat64.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (fstatat64 -a32 -v -P stat.sample -P /dev/full); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a32 -v -P stat.sample -P /dev/full
diff --git a/tests/fstatat64.test b/tests/fstatat64.test
deleted file mode 100755
index 484008a..0000000
--- a/tests/fstatat64.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check fstatat64 syscall decoding.
-
-. "${srcdir=.}/statx.sh"
diff --git a/tests/fstatfs.gen.test b/tests/fstatfs.gen.test
new file mode 100755
index 0000000..3dd04d8
--- /dev/null
+++ b/tests/fstatfs.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (fstatfs -a18); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a18
diff --git a/tests/fstatfs.test b/tests/fstatfs.test
deleted file mode 100755
index 646e66f..0000000
--- a/tests/fstatfs.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check fstatfs syscall decoding.
-
-. "${srcdir=.}/statfs.test"
diff --git a/tests/fstatfs64.gen.test b/tests/fstatfs64.gen.test
new file mode 100755
index 0000000..b9527be
--- /dev/null
+++ b/tests/fstatfs64.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (fstatfs64 -a24); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a24
diff --git a/tests/fstatfs64.test b/tests/fstatfs64.test
deleted file mode 100755
index 179ff1b..0000000
--- a/tests/fstatfs64.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check fstatfs64 syscall decoding.
-
-. "${srcdir=.}/statfs.test"
diff --git a/tests/fstatx.c b/tests/fstatx.c
index f88d9a9..70804af 100644
--- a/tests/fstatx.c
+++ b/tests/fstatx.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff --git a/tests/fsync.gen.test b/tests/fsync.gen.test
new file mode 100755
index 0000000..921e804
--- /dev/null
+++ b/tests/fsync.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (fsync -a10); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a10
diff --git a/tests/fsync.test b/tests/fsync.test
deleted file mode 100755
index a58b67b..0000000
--- a/tests/fsync.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check fsync syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a10
diff --git a/tests/ftruncate.gen.test b/tests/ftruncate.gen.test
new file mode 100755
index 0000000..709a851
--- /dev/null
+++ b/tests/ftruncate.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (ftruncate -a24); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a24
diff --git a/tests/ftruncate.test b/tests/ftruncate.test
deleted file mode 100755
index ec8a1e0..0000000
--- a/tests/ftruncate.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check ftruncate syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a24
diff --git a/tests/ftruncate64.gen.test b/tests/ftruncate64.gen.test
new file mode 100755
index 0000000..4cb1fe7
--- /dev/null
+++ b/tests/ftruncate64.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (ftruncate64 -a36); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a36
diff --git a/tests/ftruncate64.test b/tests/ftruncate64.test
deleted file mode 100755
index 9068210..0000000
--- a/tests/ftruncate64.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check ftruncate64 syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a36
diff --git a/tests/futex.c b/tests/futex.c
index 586b95d..9a9ab66 100644
--- a/tests/futex.c
+++ b/tests/futex.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -55,8 +56,6 @@
 # include "xlat/futexwakeops.h"
 # include "xlat/futexwakecmps.h"
 
-static struct timespec *tmout;
-
 void futex_error(int *uaddr, int op, unsigned long val, unsigned long timeout,
 	int *uaddr2, unsigned long val3, int rc)
 {
@@ -163,8 +162,8 @@
 int
 main(int argc, char *argv[])
 {
-	int *uaddr = tail_alloc(sizeof(*uaddr));
-	int *uaddr2 = tail_alloc(sizeof(*uaddr2));
+	TAIL_ALLOC_OBJECT_CONST_PTR(int, uaddr);
+	TAIL_ALLOC_OBJECT_CONST_PTR(int, uaddr2);
 	int rc;
 	unsigned i;
 	unsigned j;
@@ -172,7 +171,7 @@
 	uaddr[0] = 0x1deadead;
 	uaddr2[0] = 0xbadf00d;
 
-	tmout = tail_alloc(sizeof(*tmout));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct timespec, tmout);
 	tmout->tv_sec = 123;
 	tmout->tv_nsec = 0xbadc0de;
 
@@ -189,37 +188,59 @@
 	/* uaddr is NULL */
 	CHECK_FUTEX(NULL, FUTEX_WAIT, VAL, tmout, uaddr2, VAL3,
 		(rc == -1) && (errno == EFAULT));
-	printf("futex(NULL, FUTEX_WAIT, %u, {tv_sec=%jd, tv_nsec=%jd}) = %s\n",
-		VAL_PR, (intmax_t) tmout->tv_sec, (intmax_t) tmout->tv_nsec,
-		sprintrc(rc));
+	printf("futex(NULL, FUTEX_WAIT, %u, {tv_sec=%lld, tv_nsec=%llu}) = %s\n",
+	       VAL_PR, (long long) tmout->tv_sec,
+	       zero_extend_signed_to_ull(tmout->tv_nsec), sprintrc(rc));
 
 	/* uaddr is faulty */
 	CHECK_FUTEX(uaddr + 1, FUTEX_WAIT, VAL, tmout, uaddr2, VAL3,
 		(rc == -1) && (errno == EFAULT));
-	printf("futex(%p, FUTEX_WAIT, %u, {tv_sec=%jd, tv_nsec=%jd}) = %s\n",
-		uaddr + 1, VAL_PR, (intmax_t) tmout->tv_sec,
-		(intmax_t) tmout->tv_nsec, sprintrc(rc));
+	printf("futex(%p, FUTEX_WAIT, %u, {tv_sec=%lld, tv_nsec=%llu}) = %s\n",
+	       uaddr + 1, VAL_PR, (long long) tmout->tv_sec,
+	       zero_extend_signed_to_ull(tmout->tv_nsec), sprintrc(rc));
 
 	/* timeout is faulty */
 	CHECK_FUTEX(uaddr, FUTEX_WAIT, VAL, tmout + 1, uaddr2, VAL3,
 		(rc == -1) && (errno == EFAULT));
 	printf("futex(%p, FUTEX_WAIT, %u, %p) = %s\n",
-		uaddr, 0xfacefeed, tmout + 1, sprintrc(rc));
+	       uaddr, 0xfacefeed, tmout + 1, sprintrc(rc));
+
+	/* timeout is invalid */
+	tmout->tv_sec = 0xdeadbeefU;
+	tmout->tv_nsec = 0xfacefeedU;
+
+	CHECK_FUTEX(uaddr, FUTEX_WAIT, VAL, tmout, uaddr2, VAL3,
+		(rc == -1) && (errno == EINVAL));
+	printf("futex(%p, FUTEX_WAIT, %u, {tv_sec=%lld, tv_nsec=%llu}) = %s\n",
+	       uaddr, VAL_PR, (long long) tmout->tv_sec,
+	       zero_extend_signed_to_ull(tmout->tv_nsec), sprintrc(rc));
+
+	tmout->tv_sec = (time_t) 0xcafef00ddeadbeefLL;
+	tmout->tv_nsec = (long) 0xbadc0dedfacefeedLL;
+
+	CHECK_FUTEX(uaddr, FUTEX_WAIT, VAL, tmout, uaddr2, VAL3,
+		(rc == -1) && (errno == EINVAL));
+	printf("futex(%p, FUTEX_WAIT, %u, {tv_sec=%lld, tv_nsec=%llu}) = %s\n",
+	       uaddr, VAL_PR, (long long) tmout->tv_sec,
+	       zero_extend_signed_to_ull(tmout->tv_nsec), sprintrc(rc));
+
+	tmout->tv_sec = 123;
+	tmout->tv_nsec = 0xbadc0de;
 
 	/* uaddr is not as provided; uaddr2 is faulty but ignored */
 	CHECK_FUTEX(uaddr, FUTEX_WAIT, VAL, tmout, uaddr2 + 1, VAL3,
 		(rc == -1) && (errno == EAGAIN));
-	printf("futex(%p, FUTEX_WAIT, %u, {tv_sec=%jd, tv_nsec=%jd}) = %s\n",
-		uaddr, VAL_PR, (intmax_t) tmout->tv_sec,
-		(intmax_t) tmout->tv_nsec, sprintrc(rc));
+	printf("futex(%p, FUTEX_WAIT, %u, {tv_sec=%lld, tv_nsec=%llu}) = %s\n",
+	       uaddr, VAL_PR, (long long) tmout->tv_sec,
+	       zero_extend_signed_to_ull(tmout->tv_nsec), sprintrc(rc));
 
 	/* uaddr is not as provided; uaddr2 is faulty but ignored */
 	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_PRIVATE_FLAG | FUTEX_WAIT, VAL, tmout,
 		uaddr2 + 1, VAL3, (rc == -1) && (errno == EAGAIN));
-	printf("futex(%p, FUTEX_WAIT_PRIVATE, %u, {tv_sec=%jd, tv_nsec=%jd}) = "
-		"%s\n",
-		uaddr, VAL_PR, (intmax_t) tmout->tv_sec,
-		(intmax_t) tmout->tv_nsec, sprintrc(rc));
+	printf("futex(%p, FUTEX_WAIT_PRIVATE, %u, {tv_sec=%lld, tv_nsec=%llu})"
+	       " = %s\n",
+	       uaddr, VAL_PR, (long long) tmout->tv_sec,
+	       zero_extend_signed_to_ull(tmout->tv_nsec), sprintrc(rc));
 
 	/* Next 2 tests are with CLOCKRT bit set */
 
@@ -227,18 +248,18 @@
 	CHECK_FUTEX_ENOSYS(uaddr,
 		FUTEX_CLOCK_REALTIME | FUTEX_WAIT,
 		VAL, tmout, uaddr2, VAL3, (rc == -1) && (errno == EAGAIN));
-	printf("futex(%p, FUTEX_WAIT|FUTEX_CLOCK_REALTIME, %u, "
-		"{tv_sec=%jd, tv_nsec=%jd}) = %s\n", uaddr, VAL_PR,
-		(intmax_t) tmout->tv_sec, (intmax_t) tmout->tv_nsec,
-		sprintrc(rc));
+	printf("futex(%p, FUTEX_WAIT|FUTEX_CLOCK_REALTIME, %u"
+	       ", {tv_sec=%lld, tv_nsec=%llu}) = %s\n",
+	       uaddr, VAL_PR, (long long) tmout->tv_sec,
+	       zero_extend_signed_to_ull(tmout->tv_nsec), sprintrc(rc));
 
 	CHECK_FUTEX_ENOSYS(uaddr,
 		FUTEX_CLOCK_REALTIME | FUTEX_PRIVATE_FLAG | FUTEX_WAIT ,
 		VAL, tmout, uaddr2, 0, (rc == -1) && (errno == EAGAIN));
-	printf("futex(%p, FUTEX_WAIT_PRIVATE|FUTEX_CLOCK_REALTIME, %u, "
-		"{tv_sec=%jd, tv_nsec=%jd}) = %s\n", uaddr, VAL_PR,
-		(intmax_t) tmout->tv_sec, (intmax_t) tmout->tv_nsec,
-		sprintrc(rc));
+	printf("futex(%p, FUTEX_WAIT_PRIVATE|FUTEX_CLOCK_REALTIME, %u"
+	       ", {tv_sec=%lld, tv_nsec=%llu}) = %s\n",
+	       uaddr, VAL_PR, (long long) tmout->tv_sec,
+	       zero_extend_signed_to_ull(tmout->tv_nsec), sprintrc(rc));
 
 	/* FUTEX_WAIT_BITSET - FUTEX_WAIT which provides additional bitmask
 	 *                     which should be matched at least in one bit with
@@ -254,50 +275,54 @@
 
 	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_WAIT_BITSET, VAL, tmout, uaddr2 + 1,
 		VAL3, (rc == -1) && (errno == EAGAIN));
-	printf("futex(%p, FUTEX_WAIT_BITSET, %u, {tv_sec=%jd, tv_nsec=%jd}, "
-		"%#x) = %s\n",
-		uaddr, VAL_PR, (intmax_t) tmout->tv_sec,
-		(intmax_t) tmout->tv_nsec, VAL3_PR, sprintrc(rc));
+	printf("futex(%p, FUTEX_WAIT_BITSET, %u, {tv_sec=%lld, tv_nsec=%llu}"
+	       ", %#x) = %s\n",
+	       uaddr, VAL_PR, (long long) tmout->tv_sec,
+	       zero_extend_signed_to_ull(tmout->tv_nsec), VAL3_PR,
+	       sprintrc(rc));
 
 	/* val3 of 0 is invalid  */
 	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_WAIT_BITSET, VAL, tmout, uaddr2 + 1, 0,
 		(rc == -1) && (errno == EINVAL));
-	printf("futex(%p, FUTEX_WAIT_BITSET, %u, {tv_sec=%jd, tv_nsec=%jd}, "
-		"%#x) = %s\n",
-		uaddr, VAL_PR, (intmax_t) tmout->tv_sec,
-		(intmax_t) tmout->tv_nsec, 0, sprintrc(rc));
+	printf("futex(%p, FUTEX_WAIT_BITSET, %u, {tv_sec=%lld, tv_nsec=%llu}"
+	       ", %#x) = %s\n",
+	       uaddr, VAL_PR, (long long) tmout->tv_sec,
+	       zero_extend_signed_to_ull(tmout->tv_nsec), 0, sprintrc(rc));
 
 	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_PRIVATE_FLAG | FUTEX_WAIT_BITSET, VAL,
 		tmout, uaddr2 + 1, VAL3, (rc == -1) && (errno == EAGAIN));
-	printf("futex(%p, FUTEX_WAIT_BITSET_PRIVATE, %u, "
-		"{tv_sec=%jd, tv_nsec=%jd}, %#x) = %s\n",
-		uaddr, VAL_PR, (intmax_t) tmout->tv_sec,
-		(intmax_t) tmout->tv_nsec, VAL3_PR, sprintrc(rc));
+	printf("futex(%p, FUTEX_WAIT_BITSET_PRIVATE, %u"
+	       ", {tv_sec=%lld, tv_nsec=%llu}, %#x) = %s\n",
+	       uaddr, VAL_PR, (long long) tmout->tv_sec,
+	       zero_extend_signed_to_ull(tmout->tv_nsec), VAL3_PR,
+	       sprintrc(rc));
 
 	/* Next 3 tests are with CLOCKRT bit set */
 
 	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_CLOCK_REALTIME | FUTEX_WAIT_BITSET, VAL,
 		tmout, uaddr2 + 1, VAL3, (rc == -1) && (errno == EAGAIN));
-	printf("futex(%p, FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME, %u, "
-		"{tv_sec=%jd, tv_nsec=%jd}, %#x) = %s\n", uaddr, VAL_PR,
-		(intmax_t) tmout->tv_sec, (intmax_t) tmout->tv_nsec, VAL3_PR,
-		sprintrc(rc));
+	printf("futex(%p, FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME, %u"
+	       ", {tv_sec=%lld, tv_nsec=%llu}, %#x) = %s\n",
+	       uaddr, VAL_PR, (long long) tmout->tv_sec,
+	       zero_extend_signed_to_ull(tmout->tv_nsec), VAL3_PR,
+	       sprintrc(rc));
 
 	/* val3 of 0 is invalid  */
 	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_CLOCK_REALTIME | FUTEX_WAIT_BITSET, VAL,
 		tmout, uaddr2 + 1, 0, (rc == -1) && (errno == EINVAL));
-	printf("futex(%p, FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME, %u, "
-		"{tv_sec=%jd, tv_nsec=%jd}, %#x) = %s\n", uaddr, VAL_PR,
-		(intmax_t) tmout->tv_sec, (intmax_t) tmout->tv_nsec, 0,
-		sprintrc(rc));
+	printf("futex(%p, FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME, %u"
+	       ", {tv_sec=%lld, tv_nsec=%llu}, %#x) = %s\n",
+	       uaddr, VAL_PR, (long long) tmout->tv_sec,
+	       zero_extend_signed_to_ull(tmout->tv_nsec), 0, sprintrc(rc));
 
 	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_CLOCK_REALTIME | FUTEX_PRIVATE_FLAG |
 		FUTEX_WAIT_BITSET, VAL, tmout, uaddr2 + 1, VAL3,
 		(rc == -1) && (errno == EAGAIN));
-	printf("futex(%p, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, %u, "
-		"{tv_sec=%jd, tv_nsec=%jd}, %#x) = %s\n", uaddr, VAL_PR,
-		(intmax_t) tmout->tv_sec, (intmax_t) tmout->tv_nsec, VAL3_PR,
-		sprintrc(rc));
+	printf("futex(%p, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, %u"
+	       ", {tv_sec=%lld, tv_nsec=%llu}, %#x) = %s\n",
+	       uaddr, VAL_PR, (long long) tmout->tv_sec,
+	       zero_extend_signed_to_ull(tmout->tv_nsec), VAL3_PR,
+	       sprintrc(rc));
 
 	/* FUTEX_WAKE - wake val processes waiting for uaddr
 	 * Possible flags: PRIVATE
@@ -522,9 +547,9 @@
 			CHECK_FUTEX_ENOSYS(uaddr,
 				j ? FUTEX_WAKE_OP_PRIVATE : FUTEX_WAKE_OP,
 				VAL, i, uaddr2, wake_ops[i].val, (rc == 0));
-			printf("futex(%p, FUTEX_WAKE_OP%s, %u, %u, %p, %s) = "
-				"%s\n", uaddr, j ? "_PRIVATE" : "", VAL_PR, i,
-				uaddr2, wake_ops[i].str, sprintrc(rc));
+			printf("futex(%p, FUTEX_WAKE_OP%s, %u, %u, %p, %s)"
+			       " = %s\n", uaddr, j ? "_PRIVATE" : "", VAL_PR,
+			       i, uaddr2, wake_ops[i].str, sprintrc(rc));
 		}
 	}
 
@@ -552,16 +577,16 @@
 
 	CHECK_FUTEX_ENOSYS(uaddr + 1, FUTEX_LOCK_PI, VAL, tmout, uaddr2 + 1,
 		VAL3, (rc == -1) && (errno == EFAULT));
-	printf("futex(%p, FUTEX_LOCK_PI, {tv_sec=%jd, tv_nsec=%jd}) = %s\n",
-		uaddr + 1, (intmax_t) tmout->tv_sec, (intmax_t) tmout->tv_nsec,
-		sprintrc(rc));
+	printf("futex(%p, FUTEX_LOCK_PI, {tv_sec=%lld, tv_nsec=%llu}) = %s\n",
+	       uaddr + 1, (long long) tmout->tv_sec,
+	       zero_extend_signed_to_ull(tmout->tv_nsec), sprintrc(rc));
 
 	CHECK_FUTEX_ENOSYS(uaddr + 1, FUTEX_PRIVATE_FLAG | FUTEX_LOCK_PI, VAL,
 		tmout, uaddr2 + 1, VAL3, (rc == -1) && (errno == EFAULT));
-	printf("futex(%p, FUTEX_LOCK_PI_PRIVATE, {tv_sec=%jd, tv_nsec=%jd}) = "
-		"%s\n",
-		uaddr + 1, (intmax_t) tmout->tv_sec, (intmax_t) tmout->tv_nsec,
-		sprintrc(rc));
+	printf("futex(%p, FUTEX_LOCK_PI_PRIVATE, {tv_sec=%lld, tv_nsec=%llu})"
+	       " = %s\n",
+	       uaddr + 1, (long long) tmout->tv_sec,
+	       zero_extend_signed_to_ull(tmout->tv_nsec), sprintrc(rc));
 
 	/* NULL is passed by invalid_op() in cases valid timeout address is
 	 * needed */
@@ -633,32 +658,32 @@
 
 	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_WAIT_REQUEUE_PI, VAL, tmout, uaddr2,
 		VAL3, (rc == -1) && (errno == EAGAIN));
-	printf("futex(%p, FUTEX_WAIT_REQUEUE_PI, %u, "
-		"{tv_sec=%jd, tv_nsec=%jd}, %p) = %s\n",
-		uaddr, VAL_PR, (intmax_t) tmout->tv_sec,
-		(intmax_t) tmout->tv_nsec, uaddr2, sprintrc(rc));
+	printf("futex(%p, FUTEX_WAIT_REQUEUE_PI, %u"
+	       ", {tv_sec=%lld, tv_nsec=%llu}, %p) = %s\n",
+	       uaddr, VAL_PR, (long long) tmout->tv_sec,
+	       zero_extend_signed_to_ull(tmout->tv_nsec), uaddr2, sprintrc(rc));
 
 	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_PRIVATE_FLAG | FUTEX_WAIT_REQUEUE_PI,
 		VAL, tmout, uaddr2, VAL3, (rc == -1) && (errno == EAGAIN));
-	printf("futex(%p, FUTEX_WAIT_REQUEUE_PI_PRIVATE, %u, "
-		"{tv_sec=%jd, tv_nsec=%jd}, %p) "
-		"= %s\n", uaddr, VAL_PR, (intmax_t) tmout->tv_sec,
-		(intmax_t) tmout->tv_nsec, uaddr2, sprintrc(rc));
+	printf("futex(%p, FUTEX_WAIT_REQUEUE_PI_PRIVATE, %u"
+	       ", {tv_sec=%lld, tv_nsec=%llu}, %p) = %s\n",
+	       uaddr, VAL_PR, (long long) tmout->tv_sec,
+	       zero_extend_signed_to_ull(tmout->tv_nsec), uaddr2, sprintrc(rc));
 
 	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_CLOCK_REALTIME | FUTEX_WAIT_REQUEUE_PI,
 		VAL, tmout, uaddr2, VAL3, (rc == -1) && (errno == EAGAIN));
-	printf("futex(%p, FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME, %u, "
-		"{tv_sec=%jd, tv_nsec=%jd}, %p) = %s\n", uaddr, VAL_PR,
-		(intmax_t) tmout->tv_sec, (intmax_t) tmout->tv_nsec, uaddr2,
-		sprintrc(rc));
+	printf("futex(%p, FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME, %u"
+	       ", {tv_sec=%lld, tv_nsec=%llu}, %p) = %s\n",
+	       uaddr, VAL_PR, (long long) tmout->tv_sec,
+	       zero_extend_signed_to_ull(tmout->tv_nsec), uaddr2, sprintrc(rc));
 
 	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_CLOCK_REALTIME | FUTEX_PRIVATE_FLAG |
 		FUTEX_WAIT_REQUEUE_PI, VAL, tmout, uaddr2, VAL3,
 		(rc == -1) && (errno == EAGAIN));
-	printf("futex(%p, FUTEX_WAIT_REQUEUE_PI_PRIVATE|FUTEX_CLOCK_REALTIME, "
-		"%u, {tv_sec=%jd, tv_nsec=%jd}, %p) = %s\n", uaddr, VAL_PR,
-		(intmax_t) tmout->tv_sec, (intmax_t) tmout->tv_nsec, uaddr2,
-		sprintrc(rc));
+	printf("futex(%p, FUTEX_WAIT_REQUEUE_PI_PRIVATE|FUTEX_CLOCK_REALTIME"
+	       ", %u, {tv_sec=%lld, tv_nsec=%llu}, %p) = %s\n",
+	       uaddr, VAL_PR, (long long) tmout->tv_sec,
+	       zero_extend_signed_to_ull(tmout->tv_nsec), uaddr2, sprintrc(rc));
 
 	/* FUTEX_CMP_REQUEUE_PI - version of FUTEX_CMP_REQUEUE which re-queues
 	 *                        on PI-aware futex.
diff --git a/tests/futimesat.c b/tests/futimesat.c
index c356629..733fd09 100644
--- a/tests/futimesat.c
+++ b/tests/futimesat.c
@@ -1,7 +1,7 @@
 /*
  * Check decoding of futimesat syscall.
  *
- * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 Dmitry V. Levin <[email protected]>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -37,46 +37,123 @@
 # include <sys/time.h>
 # include <unistd.h>
 
+static void
+print_tv(const struct timeval *tv)
+{
+	printf("{tv_sec=%lld, tv_usec=%llu}",
+	       (long long) tv->tv_sec,
+	       zero_extend_signed_to_ull(tv->tv_usec));
+	print_time_t_usec(tv->tv_sec,
+			  zero_extend_signed_to_ull(tv->tv_usec), 1);
+}
+
+static const char *errstr;
+
+static long
+k_futimesat(const kernel_ulong_t dirfd,
+	    const kernel_ulong_t pathname,
+	    const kernel_ulong_t times)
+{
+	long rc = syscall(__NR_futimesat, dirfd, pathname, times);
+	errstr = sprintrc(rc);
+	return rc;
+}
 
 int
 main(void)
 {
-	struct timeval tv;
-	if (gettimeofday(&tv, NULL))
-		perror_msg_and_fail("gettimeofday");
+	static const kernel_ulong_t bogus_fd =
+		(kernel_ulong_t) 0xbadfaceddeadbeaf;
+	static const kernel_ulong_t kfdcwd =
+		(kernel_ulong_t) 0xdefaced00000000 | -100U;
+	static const char proto_fname[] = "futimesat_sample";
+	static const char qname[] = "\"futimesat_sample\"";
 
-	static const char sample[] = "futimesat_sample";
-	unsigned long dirfd = (unsigned long) 0xdeadbeef00000000ULL | -100U;
-
-	long rc = syscall(__NR_futimesat, dirfd, sample, 0);
-	printf("futimesat(AT_FDCWD, \"%s\", NULL) = %ld %s (%m)\n",
-	       sample, rc, errno2name());
-
-	struct timeval *const ts = tail_alloc(sizeof(*ts) * 2);
-	dirfd = (unsigned long) 0xdeadbeefffffffffULL;
-
-	ts[0].tv_sec = tv.tv_sec;
-	ts[0].tv_usec = tv.tv_usec;
-	ts[1].tv_sec = tv.tv_sec - 1;
-	ts[1].tv_usec = tv.tv_usec + 1;
-
-	rc = syscall(__NR_futimesat, dirfd, 0, ts + 2);
-	printf("futimesat(%d, NULL, %p) = %ld %s (%m)\n",
-	       (int) dirfd, ts + 2, rc, errno2name());
-
-	rc = syscall(__NR_futimesat, dirfd, 0, ts + 1);
-	printf("futimesat(%d, NULL, [{tv_sec=%jd, tv_usec=%jd}, %p]) = "
-	       "%ld %s (%m)\n", (int) dirfd,
-	       (intmax_t) ts[1].tv_sec, (intmax_t) ts[1].tv_usec,
-	       ts + 2, rc, errno2name());
+	char *const fname = tail_memdup(proto_fname, sizeof(proto_fname));
+	const kernel_ulong_t kfname = (uintptr_t) fname;
+	struct timeval *const tv = tail_alloc(sizeof(*tv) * 2);
 
 	(void) close(0);
-	rc = syscall(__NR_futimesat, 0, "", ts);
-	printf("futimesat(0, \"\", [{tv_sec=%jd, tv_usec=%jd}, "
-	       "{tv_sec=%jd, tv_usec=%jd}]) = %ld %s (%m)\n",
-	       (intmax_t) ts[0].tv_sec, (intmax_t) ts[0].tv_usec,
-	       (intmax_t) ts[1].tv_sec, (intmax_t) ts[1].tv_usec,
-	       rc, errno2name());
+
+	/* dirfd */
+	k_futimesat(0, kfname, 0);
+	printf("futimesat(0, %s, NULL) = %s\n", qname, errstr);
+
+	k_futimesat(bogus_fd, kfname, 0);
+	printf("futimesat(%d, %s, NULL) = %s\n", (int) bogus_fd, qname, errstr);
+
+	k_futimesat(-100U, kfname, 0);
+	printf("futimesat(AT_FDCWD, %s, NULL) = %s\n", qname, errstr);
+
+	k_futimesat(kfdcwd, kfname, 0);
+	printf("futimesat(AT_FDCWD, %s, NULL) = %s\n", qname, errstr);
+
+	/* pathname */
+	k_futimesat(kfdcwd, 0, 0);
+	printf("futimesat(AT_FDCWD, NULL, NULL) = %s\n", errstr);
+
+	k_futimesat(kfdcwd, kfname + sizeof(proto_fname) - 1, 0);
+	printf("futimesat(AT_FDCWD, \"\", NULL) = %s\n", errstr);
+
+	fname[sizeof(proto_fname) - 1] = '+';
+	k_futimesat(kfdcwd, kfname, 0);
+	fname[sizeof(proto_fname) - 1] = '\0';
+	printf("futimesat(AT_FDCWD, %p, NULL) = %s\n", fname, errstr);
+
+	if (F8ILL_KULONG_SUPPORTED) {
+		k_futimesat(kfdcwd, f8ill_ptr_to_kulong(fname), 0);
+		printf("futimesat(AT_FDCWD, %#jx, NULL) = %s\n",
+		       (uintmax_t) f8ill_ptr_to_kulong(fname), errstr);
+	}
+
+	/* times */
+	k_futimesat(kfdcwd, kfname, (uintptr_t) (tv + 1));
+	printf("futimesat(AT_FDCWD, %s, %p) = %s\n",
+	       qname, tv + 1, errstr);
+
+	k_futimesat(kfdcwd, kfname, (uintptr_t) (tv + 2));
+	printf("futimesat(AT_FDCWD, %s, %p) = %s\n",
+	       qname, tv + 2, errstr);
+
+	tv[0].tv_sec = 0xdeadbeefU;
+	tv[0].tv_usec = 0xfacefeedU;
+	tv[1].tv_sec = (time_t) 0xcafef00ddeadbeefLL;
+	tv[1].tv_usec = (long) 0xbadc0dedfacefeedLL;
+
+	k_futimesat(kfdcwd, kfname, (uintptr_t) tv);
+	printf("futimesat(AT_FDCWD, %s, [", qname);
+	print_tv(&tv[0]);
+	printf(", ");
+	print_tv(&tv[1]);
+	printf("]) = %s\n", errstr);
+
+	tv[0].tv_sec = 1492356708;
+	tv[0].tv_usec = 567891234;
+	tv[1].tv_sec = 1492357086;
+	tv[1].tv_usec = 678902345;
+
+	k_futimesat(kfdcwd, kfname, (uintptr_t) tv);
+	printf("futimesat(AT_FDCWD, %s, [", qname);
+	print_tv(&tv[0]);
+	printf(", ");
+	print_tv(&tv[1]);
+	printf("]) = %s\n", errstr);
+
+	tv[0].tv_usec = 567891;
+	tv[1].tv_usec = 678902;
+
+	k_futimesat(kfdcwd, kfname, (uintptr_t) tv);
+	printf("futimesat(AT_FDCWD, %s, [", qname);
+	print_tv(&tv[0]);
+	printf(", ");
+	print_tv(&tv[1]);
+	printf("]) = %s\n", errstr);
+
+	if (F8ILL_KULONG_SUPPORTED) {
+		k_futimesat(kfdcwd, kfname, f8ill_ptr_to_kulong(tv));
+		printf("futimesat(AT_FDCWD, %s, %#jx) = %s\n",
+		       qname, (uintmax_t) f8ill_ptr_to_kulong(tv), errstr);
+	}
 
 	puts("+++ exited with 0 +++");
 	return 0;
diff --git a/tests/futimesat.gen.test b/tests/futimesat.gen.test
new file mode 100755
index 0000000..c3add8c
--- /dev/null
+++ b/tests/futimesat.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (futimesat -a28); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a28
diff --git a/tests/futimesat.test b/tests/futimesat.test
deleted file mode 100755
index 3a67c04..0000000
--- a/tests/futimesat.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check futimesat syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a28
diff --git a/tests/sigreturn.test b/tests/gen_pure_executables.sh
similarity index 69%
rename from tests/sigreturn.test
rename to tests/gen_pure_executables.sh
index f9a612b..c0e2152 100755
--- a/tests/sigreturn.test
+++ b/tests/gen_pure_executables.sh
@@ -1,8 +1,6 @@
-#!/bin/sh
+#!/bin/sh -efu
 #
-# Check rt_sigprocmask and sigreturn/rt_sigreturn decoding.
-#
-# Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+# Copyright (c) 2017 Dmitry V. Levin <[email protected]>
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -27,22 +25,26 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-. "${srcdir=.}/init.sh"
+usage()
+{
+	cat >&2 <<EOF
+Usage: $0 [<input> [<output>]]
 
-run_prog
-run_strace -esignal $args
+Generate pure_executables.am from <input> list.
+Deduce output file from <input> unless an <output> is specified.
+EOF
+	exit 1
+}
 
-mask='\[(USR2 CHLD|CHLD USR2) RT_3 RT_4 RT_5 RT_26 RT_27\]'
-rt_sigprocmask='rt_sigprocmask\(SIG_SETMASK, '"$mask"', NULL, [[:digit:]]+\) += 0'
-osf_sigprocmask='osf_sigprocmask\(SIG_SETMASK, '"$mask"'\) += 0 +\(old mask \[[^]]*\]\)'
-EXPECTED="$LOG.expected"
+input="${0%/*}/pure_executables.list"
+[ $# -eq 0 ] || { input="$1"; shift; }
+output="$(dirname "$input")/pure_executables.am"
+[ $# -eq 0 ] || { output="$1"; shift; }
+[ $# -eq 0 ] || usage
 
-cat > "$EXPECTED" << __EOF__
-$rt_sigprocmask|$osf_sigprocmask
-(rt_)?sigreturn\\((\\{mask=$mask\\})?\\) += 0
-__EOF__
+exec > "$output"
 
-match_grep "$LOG" "$EXPECTED"
-rm -f "$EXPECTED"
-
-exit 0
+echo "# Generated by $0 from $input; do not edit."
+echo 'PURE_EXECUTABLES = \'
+sed -n 's/^[^#].*/  & \\/p' < "$input"
+echo '  #'
diff --git a/tests/gen_tests.in b/tests/gen_tests.in
new file mode 100644
index 0000000..be0a3a2
--- /dev/null
+++ b/tests/gen_tests.in
@@ -0,0 +1,348 @@
+# Input for gen_tests.sh
+#
+# Copyright (c) 2017 The strace developers.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+# 3. The name of the author may not be used to endorse or promote products
+#    derived from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+_newselect
+accept	-a22
+accept4	-a37
+access	-a30 -P access_sample
+acct	-a20
+add_key	-a30 -s12
+adjtimex	-a15
+aio	-a14 -e trace=io_setup,io_submit,io_getevents,io_cancel,io_destroy
+alarm	-a10
+bpf	-a20
+btrfs	+ioctl.test
+chmod	-a28
+chown	-a28
+chown32	-a31
+chroot	-a24
+clock	test_trace_expr 'times|fcntl.*' -e/clock
+clock_adjtime	-a37
+clock_nanosleep	-e trace=clock_nanosleep,clock_gettime
+clock_xettime	-a36 -e trace=clock_getres,clock_gettime,clock_settime
+copy_file_range
+creat	-a20
+delete_module	-a23
+dup	-a8
+dup2	-a13
+dup3	-a24
+epoll_create	-a17
+epoll_create1	-a28
+epoll_ctl
+epoll_pwait
+epoll_wait	-a26
+erestartsys	-a34 -e signal=none -e trace=recvfrom
+execveat
+execveat-v	-v -e trace=execveat
+faccessat	-P $NAME.sample
+fadvise64_64	+fadvise64.test
+fallocate	-a18
+fanotify_init
+fanotify_mark	-a32
+fchdir	-a11
+fchmod	-a15
+fchmodat
+fchown	-a16
+fchown32	-a18
+fchownat
+fcntl	-a8
+fcntl64	-a8
+fdatasync	-a14
+file_handle	-e trace=name_to_handle_at,open_by_handle_at
+file_ioctl	+ioctl.test
+finit_module	-a25
+flock	-a19
+fork-f	-a26 -qq -f -e signal=none -e trace=chdir
+fstat	-a15 -v -P stat.sample
+fstat64	-a17 -v -P stat.sample
+fstatat64	-a32 -v -P stat.sample -P /dev/full
+fstatfs	-a18
+fstatfs64	-a24
+fsync	-a10
+ftruncate	-a24
+ftruncate64	-a36
+futimesat	-a28
+get_mempolicy	-s3 -a38
+getcpu	-a25
+getcwd	-a18
+getdents	-a22 -v
+getdents64	-a24 -v
+getegid	+getuid.test
+getegid32	+getuid.test
+geteuid	+getuid.test
+geteuid32	+getuid.test
+getgid	+getuid.test
+getgid32	+getuid.test
+getgroups	-a17
+getgroups32	-a19
+getpeername	-a27
+getpgrp	-a10
+getpid	-a9
+getppid	-a10
+getrandom	-a32 -s3
+getresgid	-a25
+getresgid32	-a27
+getresuid	-a25
+getresuid32	-a27
+getrlimit	-a27
+getrusage	-v
+getsid	-a10
+getsockname	-a27
+gettid	-a9
+getuid32	+getuid.test
+getxxid	-a10 -e trace=getxpid,getxuid,getxgid
+inet-cmsg	-e trace=recvmsg
+init_module	-a27
+inotify	-a23 -e trace=inotify_add_watch,inotify_rm_watch
+inotify_init1	-a27
+int_0x80	-a11 -e trace=getgid32
+ioctl_block	+ioctl.test
+ioctl_evdev	+ioctl.test
+ioctl_evdev-v	+ioctl-v.sh
+ioctl_loop	+ioctl.test
+ioctl_loop-v	+ioctl-v.sh
+ioctl_mtd	+ioctl.test
+ioctl_rtc	+ioctl.test
+ioctl_rtc-v	+ioctl-v.sh
+ioctl_scsi	+ioctl.test
+ioctl_sg_io_v3	+ioctl.test
+ioctl_sg_io_v4	+ioctl.test
+ioctl_uffdio	+ioctl.test
+ioctl_v4l2	+ioctl.test
+ioperm	-a27
+iopl	-a8
+ioprio	-a18 -e trace=ioprio_get,ioprio_set
+ip_mreq	-e trace=setsockopt
+ipc	-a19
+ipc_msg	+ipc.sh
+ipc_sem	+ipc.sh
+ipc_shm	+ipc.sh
+kcmp	-a27
+kexec_file_load	-s9
+kexec_load	-s9
+keyctl	-a31 -s10
+kill	-a12 -esignal=none
+lchown	-a30
+lchown32	-a32
+link
+linkat
+lookup_dcookie	-a27
+lstat	-a32 -v -P stat.sample -P /dev/full
+lstat64	-a32 -v -P stat.sample -P /dev/full
+madvise	-a33
+mbind
+membarrier	-a36
+memfd_create
+migrate_pages	-a33
+mincore	-a22
+mkdir	-a20
+mkdirat	-a28
+mknod	-a18
+mknodat	-a35
+mlock	-a20 -e trace=mlock,munlock
+mlock2
+mlockall	-a12
+mmap64	+mmap.test
+mmsg	-e read=0 -e write=1 -e trace=recvmmsg,sendmmsg
+mmsg-silent	-a25 -e verbose=none -e trace=sendmmsg,recvmmsg
+mmsg_name	-a25 -e trace=sendmmsg,recvmmsg
+mmsg_name-v	-v -a25 -e trace=sendmmsg,recvmmsg
+mount
+move_pages	-s3
+mq	-a32 -e trace=mq_getsetattr,mq_open,mq_unlink
+mq_sendrecv	-a14 -e trace=mq_open,mq_notify,mq_timedsend,mq_timedreceive,mq_unlink
+mq_sendrecv-read	-eread=0 -a14 -e trace=mq_open,mq_notify,mq_timedsend,mq_timedreceive,mq_unlink
+mq_sendrecv-write	-ewrite=0 -a14 -e trace=mq_open,mq_notify,mq_timedsend,mq_timedreceive,mq_unlink
+msg_control	-a21 -e trace=sendmsg
+msg_control-v	-v -a21 -e trace=sendmsg
+msg_name	-a20 -e trace=recvmsg
+munlockall	-a13
+nanosleep	-a20
+net-icmp_filter	-e trace=getsockopt,setsockopt
+net-sockaddr	-a24 -e trace=connect
+netlink_protocol	-e trace=%network
+newfstatat	-a32 -v -P stat.sample -P /dev/full
+old_mmap	-a11 -e trace=mmap
+oldfstat	-a18 -v -P stat.sample
+oldlstat	-a32 -v -P stat.sample -P /dev/full
+oldstat	-a32 -v -P stat.sample -P /dev/full
+open	-a30 -P $NAME.sample
+openat	-P $NAME.sample
+osf_utimes	-a21
+pause	-a8 -esignal=none
+perf_event_open	-a1
+perf_event_open_nonverbose	-a34 -e verbose=none -e trace=perf_event_open
+perf_event_open_unabbrev	-a1 -v -e trace=perf_event_open
+pipe2	-a15
+pkey_alloc	-a17
+pkey_free	-a13
+pkey_mprotect	-a37
+ppoll	-s2
+ppoll-v	-v -s2 -e trace=ppoll
+pread64-pwrite64	-a21 -eread=0 -ewrite=1 -e trace=pread64,pwrite64 -P pread64-pwrite64-tmpfile -P /dev/zero -P /dev/null
+preadv	-a21
+preadv-pwritev	-a19 -eread=0 -ewrite=1 -e trace=preadv,pwritev
+preadv2-pwritev2	-a22 -eread=0 -ewrite=1 -e trace=preadv2,pwritev2
+printstr	-e trace=writev
+prlimit64
+process_vm_readv	-s5 -a37
+process_vm_writev	-s5 -a38
+pselect6
+ptrace	-a23 -e signal=none
+pwritev	-a22 -s7
+quotactl
+quotactl-v	-v -e trace=quotactl
+quotactl-xfs	-e trace=quotactl
+quotactl-xfs-v	-v -e trace=quotactl
+read-write	-a15 -eread=0 -ewrite=1 -e trace=read,write -P read-write-tmpfile -P /dev/zero -P /dev/null
+readahead	-a1
+readdir	-a16
+readlink	-xx
+readlinkat	-xx
+reboot
+recvfrom	-a35
+recvmmsg-timeout	-a25 -e trace=recvmmsg
+recvmsg	-eread=0 -ewrite=1 -e trace=recvmsg,sendmsg
+regex	test_trace_expr '' -etrace='/^(.*_)?statv?fs'
+remap_file_pages
+rename	-a35
+renameat
+renameat2
+request_key	-a33 -s12
+rmdir	-a22
+rt_sigpending	-a20
+rt_sigprocmask
+rt_sigqueueinfo	-esignal=none
+rt_sigreturn	-esignal='!USR1'
+rt_sigsuspend	-a20 -esignal=none
+rt_sigtimedwait	-a38
+rt_tgsigqueueinfo	-esignal=none
+sched	test_trace_expr times -e/sched
+sched_get_priority_mxx	-a33 -e trace=sched_get_priority_min,sched_get_priority_max
+sched_rr_get_interval	-a31
+sched_xetaffinity	-a28 -e trace=sched_getaffinity,sched_setaffinity
+sched_xetattr	-a29 -e trace=sched_getattr,sched_setattr
+sched_xetparam	-a23 -e trace=sched_getparam,sched_setparam
+sched_xetscheduler	-a22 -e trace=sched_getscheduler,sched_setscheduler
+sched_yield	-a14
+seccomp-filter	-e trace=seccomp
+seccomp-filter-v	-v -e trace=seccomp
+select	-a36
+semop	-a32 -e trace=semop,semtimedop
+sendfile	-a27
+sendfile64	-a29
+set_mempolicy	-s3 -a35
+setdomainname	-a24
+setfsgid	-a12
+setfsgid32	-a14
+setfsuid	-a12
+setfsuid32	-a14
+setgid	-a10
+setgid32	-a12
+setgroups	-s2 -a17
+setgroups32	-s2 -a19
+sethostname	-a22
+setns	-a21
+setregid	-a15
+setregid32	-a17
+setresgid	-a19
+setresgid32	-a21
+setresuid	-a19
+setresuid32	-a21
+setreuid	-a15
+setreuid32	-a17
+setrlimit	-a27
+setuid	-a10
+setuid32	-a12
+shmxt	-a11 -e trace='/(osf_)?shmat,shmdt'
+shutdown	-a24
+siginfo	-e trace=none
+signal_receive	-a16 -e trace=kill
+signalfd4
+sigreturn	-esignal='!USR1'
+sigsuspend	-a19 -esignal=none
+socketcall	-a20
+splice
+stat	-a32 -v -P stat.sample -P /dev/full
+stat64	-a32 -v -P stat.sample -P /dev/full
+statfs	-a17
+statfs64	-a23
+statx	-a32 -v -P stat.sample -P /dev/full
+swap	-a23 -e trace=swapon,swapoff
+sxetmask	-a11 -e trace=sgetmask,ssetmask
+symlink	-a34
+symlinkat
+sync	-a7
+sync_file_range
+sync_file_range2
+sysinfo	-a14
+syslog	-a36
+tee
+time	-a10
+timer_create
+timer_xettime	-e trace=timer_create,timer_settime,timer_gettime
+timerfd_xettime	-e trace=timerfd_create,timerfd_settime,timerfd_gettime
+times	-esignal=none
+times-fail	-a12 -e trace=times
+trace_fstat	test_trace_expr '' -e%fstat -v -P stat.sample -P /dev/full
+trace_fstatfs	test_trace_expr '' -e%fstatfs
+trace_lstat	test_trace_expr '' -e%lstat -v -P stat.sample -P /dev/full
+trace_question	test_trace_expr '' -e?osf_utimes,?/^pkey_.*
+trace_stat	test_trace_expr '' -e%stat -v -P stat.sample -P /dev/full
+trace_stat_like	test_trace_expr '' -e%%stat -v -P stat.sample -P /dev/full
+trace_statfs	test_trace_expr '' -e%statfs
+trace_statfs_like	test_trace_expr '' -e%%statfs
+truncate
+truncate64
+ugetrlimit	-a28
+umask	-a11
+umoven-illptr	-a36 -e trace=nanosleep
+umovestr-illptr	-a11 -e trace=chdir
+umovestr3	-a14 -e trace=chdir
+unlink	-a24
+unlinkat	-a35
+unshare	-a11
+userfaultfd	-a38
+ustat	-a33
+utime	-a16
+utimensat	-a33
+utimes	-a17
+vfork-f	-a26 -qq -f -e signal=none -e trace=chdir
+vhangup	-a10
+vmsplice	-ewrite=1
+wait4	-esignal=none
+wait4-v	-v -e signal=none -e trace=wait4
+waitid	-esignal=none
+waitid-v	-v -e signal=none -e trace=waitid
+waitpid	-a28
+xattr	-a22 -e trace=getxattr,fgetxattr,lgetxattr,setxattr,fsetxattr,lsetxattr,listxattr,flistxattr,llistxattr,removexattr,fremovexattr,lremovexattr
+xattr-strings	-a22 -s 4 -e trace=fsetxattr
+xet_robust_list	-a24 -e trace=get_robust_list,set_robust_list
+xetitimer	-a29 -e trace=setitimer,getitimer
+xetpgid	-a11 -e trace=getpgid,setpgid
+xetpriority	-a29 -e trace=getpriority,setpriority
+xettimeofday	-a20 -e trace=gettimeofday,settimeofday
diff --git a/tests/gen_tests.sh b/tests/gen_tests.sh
new file mode 100755
index 0000000..b062436
--- /dev/null
+++ b/tests/gen_tests.sh
@@ -0,0 +1,110 @@
+#!/bin/sh -efu
+#
+# Copyright (c) 2017 Dmitry V. Levin <[email protected]>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+# 3. The name of the author may not be used to endorse or promote products
+#    derived from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+usage()
+{
+	cat >&2 <<EOF
+Usage: $0 [<input> [<output>]]
+
+Generate test script(s) from <input> table.
+If a <output> is specified, generate the script for this test only,
+otherwise generate scripts for all tests specified in <input> table.
+EOF
+	exit 1
+}
+
+input="${0%/*}/gen_tests.in"
+[ $# -eq 0 ] || { input="$1"; shift; }
+output=
+[ $# -eq 0 ] || { output="$1"; shift; }
+[ $# -eq 0 ] || usage
+
+if [ -n "$output" ]; then
+	match="${output##*/}"
+	match="${match%.gen.test}"
+	[ -n "$match" ] || usage
+else
+	match=
+	dir="$(dirname "$input")"
+fi
+
+names=
+
+while read -r name args; do {
+	[ -n "${name###*}" ] || continue
+	if [ -z "$match" ]; then
+		names="$names $name"
+		output="$dir/$name.gen.test"
+	else
+		[ "$match" = "$name" ] || continue
+	fi
+
+	hdr="\
+#!/bin/sh -efu
+# Generated by $0 from $input ($name $args); do not edit."
+
+	case "$args" in
+		+*)
+		cat <<-EOF
+		$hdr
+		. "\${srcdir=.}/${args#+}"
+		EOF
+		;;
+
+		''|-*)
+		cat <<-EOF
+		$hdr
+		. "\${srcdir=.}/init.sh"
+		run_strace_match_diff $args
+		EOF
+		;;
+
+		*)
+		cat <<-EOF
+		$hdr
+		. "\${srcdir=.}/init.sh"
+		$args
+		EOF
+		;;
+	esac > "$output"
+
+	chmod a+x "$output"
+} < /dev/null; done < "$input"
+
+if [ -n "$names" ]; then
+	{
+		printf '# Generated by %s from %s; do not edit.\n' "$0" "$input"
+		printf 'GEN_TESTS ='
+		printf ' %s.gen.test' $names
+		echo
+		target='$(srcdir)/%s.gen.test'
+		dep1='$(abs_srcdir)/gen_tests.sh'
+		dep2='$(srcdir)/gen_tests.in'
+		recipe='$(AM_V_GEN) $^ $@'
+		printf "\\n$target: $dep1 $dep2\\n\\t$recipe\\n" $names
+	} > "$dir/gen_tests.am"
+fi
diff --git a/tests/get_mempolicy.gen.test b/tests/get_mempolicy.gen.test
new file mode 100755
index 0000000..ec6efb3
--- /dev/null
+++ b/tests/get_mempolicy.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (get_mempolicy -s3 -a38); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -s3 -a38
diff --git a/tests/get_mempolicy.test b/tests/get_mempolicy.test
deleted file mode 100755
index 9227097..0000000
--- a/tests/get_mempolicy.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check get_mempolicy syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -s3 -a38
diff --git a/tests/sigreturn.test b/tests/get_regs.test
similarity index 63%
copy from tests/sigreturn.test
copy to tests/get_regs.test
index f9a612b..c673fe9 100755
--- a/tests/sigreturn.test
+++ b/tests/get_regs.test
@@ -1,8 +1,8 @@
 #!/bin/sh
 #
-# Check rt_sigprocmask and sigreturn/rt_sigreturn decoding.
+# Check that get_regs is skipped for filtered syscalls.
 #
-# Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+# Copyright (c) 2017 Dmitry V. Levin <[email protected]>
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -29,20 +29,25 @@
 
 . "${srcdir=.}/init.sh"
 
-run_prog
-run_strace -esignal $args
+check_prog env
+check_prog grep
+run_prog ../gettid > /dev/null
 
-mask='\[(USR2 CHLD|CHLD USR2) RT_3 RT_4 RT_5 RT_26 RT_27\]'
-rt_sigprocmask='rt_sigprocmask\(SIG_SETMASK, '"$mask"', NULL, [[:digit:]]+\) += 0'
-osf_sigprocmask='osf_sigprocmask\(SIG_SETMASK, '"$mask"'\) += 0 +\(old mask \[[^]]*\]\)'
-EXPECTED="$LOG.expected"
+run_strace -qq -esignal=none -eraw=all -etrace=none ../gettid > /dev/null
 
-cat > "$EXPECTED" << __EOF__
-$rt_sigprocmask|$osf_sigprocmask
-(rt_)?sigreturn\\((\\{mask=$mask\\})?\\) += 0
-__EOF__
+run_strace -qq -esignal=none -eraw=all -eptrace -o '|grep -c ^ptrace > less' \
+	-- ${STRACE##* } -o "$LOG" $args > /dev/null
 
-match_grep "$LOG" "$EXPECTED"
-rm -f "$EXPECTED"
+[ "$(cat less)" -gt 0 ] ||
+	fail_ "$STRACE $args failed to catch any ptrace syscalls"
 
-exit 0
+run_strace -qq -esignal=none -eraw=all -etrace=all ../gettid > /dev/null
+
+run_strace -qq -esignal=none -eraw=all -eptrace -o '|grep -c ^ptrace > more' \
+	-- ${STRACE##* } -o "$LOG" $args > /dev/null
+
+[ "$(cat more)" -gt 0 ] ||
+	fail_ "$STRACE $args failed to catch any ptrace syscalls"
+
+[ "$(cat more)" -gt "$(cat less)" ] ||
+	fail_ "$STRACE failed to skip get_regs for filtered syscalls"
diff --git a/tests/get_sigset_size.c b/tests/get_sigset_size.c
new file mode 100644
index 0000000..357829d
--- /dev/null
+++ b/tests/get_sigset_size.c
@@ -0,0 +1,66 @@
+/*
+ * Find out the size of kernel's sigset_t.
+ *
+ * Copyright (c) 2016-2017 Dmitry V. Levin <[email protected]>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "tests.h"
+#include <signal.h>
+#include <unistd.h>
+#include <asm/unistd.h>
+
+/*
+ * If the sigset size specified to rt_sigprocmask is not equal to the size
+ * of kernel's sigset_t, the kernel does not look at anything else and fails
+ * with EINVAL.
+ *
+ * Otherwise, if both pointers specified to rt_sigprocmask are NULL,
+ * the kernel just returns 0.
+ *
+ * This vaguely documented kernel feature can be used to probe
+ * the kernel and find out the size of kernel's sigset_t.
+ */
+
+unsigned int
+get_sigset_size(void)
+{
+	static unsigned int set_size;
+
+	if (!set_size) {
+		static const unsigned int big_size = 1024 / 8;
+
+		for (set_size = big_size; set_size; set_size >>= 1) {
+			if (!syscall(__NR_rt_sigprocmask, SIG_SETMASK,
+				     NULL, NULL, set_size))
+				break;
+		}
+
+		if (!set_size)
+			perror_msg_and_fail("rt_sigprocmask");
+	}
+
+	return set_size;
+}
diff --git a/tests/getcpu.c b/tests/getcpu.c
index ec671f1..3cb49cb 100644
--- a/tests/getcpu.c
+++ b/tests/getcpu.c
@@ -2,6 +2,7 @@
  * Check decoding of getcpu syscall.
  *
  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -47,8 +48,8 @@
 		(unsigned *) tail_alloc(sizeof(* bogus_tcache)) + 1;
 
 	long res;
-	unsigned *cpu = tail_alloc(sizeof(*cpu));
-	unsigned *node = tail_alloc(sizeof(*node));
+	TAIL_ALLOC_OBJECT_CONST_PTR(unsigned, cpu);
+	TAIL_ALLOC_OBJECT_CONST_PTR(unsigned, node);
 	long * tcache = tail_alloc(128);
 
 	res = syscall(__NR_getcpu, NULL, NULL, NULL);
diff --git a/tests/getcpu.gen.test b/tests/getcpu.gen.test
new file mode 100755
index 0000000..44d9a4b
--- /dev/null
+++ b/tests/getcpu.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (getcpu -a25); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a25
diff --git a/tests/getcpu.test b/tests/getcpu.test
deleted file mode 100755
index fe21265..0000000
--- a/tests/getcpu.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of getcpu syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a25
diff --git a/tests/getcwd.gen.test b/tests/getcwd.gen.test
new file mode 100755
index 0000000..af2ff08
--- /dev/null
+++ b/tests/getcwd.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (getcwd -a18); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a18
diff --git a/tests/getcwd.test b/tests/getcwd.test
deleted file mode 100755
index 405187e..0000000
--- a/tests/getcwd.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check getcwd syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a18
diff --git a/tests/getdents.c b/tests/getdents.c
index b787c83..338eab0 100644
--- a/tests/getdents.c
+++ b/tests/getdents.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -92,12 +93,10 @@
 }
 
 int
-main(int ac, const char **av)
+main(void)
 {
-	char *dname;
+	static const char dname[] = "getdents.test.tmp.dir";
 
-	assert(ac == 1);
-	assert(asprintf(&dname, "%s.test.tmp.dir", av[0]) > 0);
 	assert(!mkdir(dname, 0700));
 	assert(!chdir(dname));
 	(void) close(0);
diff --git a/tests/getdents.gen.test b/tests/getdents.gen.test
new file mode 100755
index 0000000..0db5f20
--- /dev/null
+++ b/tests/getdents.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (getdents -a22 -v); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a22 -v
diff --git a/tests/getdents.test b/tests/getdents.test
deleted file mode 100755
index 23c4ac3..0000000
--- a/tests/getdents.test
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/sh
-
-# Check getdents syscall decoding.
-
-. "${srcdir=.}/init.sh"
-
-rm -rf -- "$LOG".dir
-run_strace_match_diff -a22 -v
diff --git a/tests/getdents64.c b/tests/getdents64.c
index 9da2a23..1f6b47e 100644
--- a/tests/getdents64.c
+++ b/tests/getdents64.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -98,12 +99,10 @@
 }
 
 int
-main(int ac, const char **av)
+main(void)
 {
-	char *dname;
+	static const char dname[] = "getdents64.test.tmp.dir";
 
-	assert(ac == 1);
-	assert(asprintf(&dname, "%s.test.tmp.dir", av[0]) > 0);
 	assert(!mkdir(dname, 0700));
 	assert(!chdir(dname));
 	(void) close(0);
diff --git a/tests/getdents64.gen.test b/tests/getdents64.gen.test
new file mode 100755
index 0000000..6e24d40
--- /dev/null
+++ b/tests/getdents64.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (getdents64 -a24 -v); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a24 -v
diff --git a/tests/getdents64.test b/tests/getdents64.test
deleted file mode 100755
index 401cfc7..0000000
--- a/tests/getdents64.test
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/sh
-
-# Check getdents64 syscall decoding.
-
-. "${srcdir=.}/init.sh"
-
-rm -rf -- "$LOG".dir
-run_strace_match_diff -a24 -v
diff --git a/tests/getegid.gen.test b/tests/getegid.gen.test
new file mode 100755
index 0000000..d6fecc2
--- /dev/null
+++ b/tests/getegid.gen.test
@@ -0,0 +1,3 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (getegid +getuid.test); do not edit.
+. "${srcdir=.}/getuid.test"
diff --git a/tests/getegid.test b/tests/getegid.test
deleted file mode 100755
index 4354158..0000000
--- a/tests/getegid.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check getegid syscall decoding.
-
-. "${srcdir=.}/getuid.test"
diff --git a/tests/getegid32.gen.test b/tests/getegid32.gen.test
new file mode 100755
index 0000000..38c4a4b
--- /dev/null
+++ b/tests/getegid32.gen.test
@@ -0,0 +1,3 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (getegid32 +getuid.test); do not edit.
+. "${srcdir=.}/getuid.test"
diff --git a/tests/getegid32.test b/tests/getegid32.test
deleted file mode 100755
index a266620..0000000
--- a/tests/getegid32.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check getegid32 syscall decoding.
-
-. "${srcdir=.}/getuid.test"
diff --git a/tests/geteuid.gen.test b/tests/geteuid.gen.test
new file mode 100755
index 0000000..9e8c12f
--- /dev/null
+++ b/tests/geteuid.gen.test
@@ -0,0 +1,3 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (geteuid +getuid.test); do not edit.
+. "${srcdir=.}/getuid.test"
diff --git a/tests/geteuid.test b/tests/geteuid.test
deleted file mode 100755
index 14ff6a6..0000000
--- a/tests/geteuid.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check geteuid syscall decoding.
-
-. "${srcdir=.}/getuid.test"
diff --git a/tests/geteuid32.gen.test b/tests/geteuid32.gen.test
new file mode 100755
index 0000000..5b78331
--- /dev/null
+++ b/tests/geteuid32.gen.test
@@ -0,0 +1,3 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (geteuid32 +getuid.test); do not edit.
+. "${srcdir=.}/getuid.test"
diff --git a/tests/geteuid32.test b/tests/geteuid32.test
deleted file mode 100755
index 9dd173d..0000000
--- a/tests/geteuid32.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check geteuid32 syscall decoding.
-
-. "${srcdir=.}/getuid.test"
diff --git a/tests/getgid.gen.test b/tests/getgid.gen.test
new file mode 100755
index 0000000..5a87aee
--- /dev/null
+++ b/tests/getgid.gen.test
@@ -0,0 +1,3 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (getgid +getuid.test); do not edit.
+. "${srcdir=.}/getuid.test"
diff --git a/tests/getgid.test b/tests/getgid.test
deleted file mode 100755
index f4f0c2e..0000000
--- a/tests/getgid.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check getgid syscall decoding.
-
-. "${srcdir=.}/getuid.test"
diff --git a/tests/getgid32.gen.test b/tests/getgid32.gen.test
new file mode 100755
index 0000000..05e2d70
--- /dev/null
+++ b/tests/getgid32.gen.test
@@ -0,0 +1,3 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (getgid32 +getuid.test); do not edit.
+. "${srcdir=.}/getuid.test"
diff --git a/tests/getgid32.test b/tests/getgid32.test
deleted file mode 100755
index 3bc98d1..0000000
--- a/tests/getgid32.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check getgid32 syscall decoding.
-
-. "${srcdir=.}/getuid.test"
diff --git a/tests/getgroups.c b/tests/getgroups.c
index 2617303..c7cd874 100644
--- a/tests/getgroups.c
+++ b/tests/getgroups.c
@@ -2,6 +2,7 @@
  * Check decoding of getgroups/getgroups32 syscalls.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -91,7 +92,7 @@
 	if (ngroups < 0)
 		perror_msg_and_fail(SYSCALL_NAME);
 
-	rc = syscall(SYSCALL_NR, (long) 0xffffffff00000000ULL, 0);
+	rc = syscall(SYSCALL_NR, F8ILL_KULONG_MASK, 0);
 	printf("%s(0, NULL) = %ld\n", SYSCALL_NAME, rc);
 
 	rc = syscall(SYSCALL_NR, -1U, 0);
@@ -105,7 +106,7 @@
 	rc = syscall(SYSCALL_NR, ngroups_max, 0);
 	printf("%s(%d, NULL) = %s\n", SYSCALL_NAME, ngroups_max, sprintrc(rc));
 
-	rc = syscall(SYSCALL_NR, (long) 0xffffffff00000000ULL | ngroups_max, 0);
+	rc = syscall(SYSCALL_NR, F8ILL_KULONG_MASK | ngroups_max, 0);
 	printf("%s(%d, NULL) = %s\n", SYSCALL_NAME, ngroups_max, sprintrc(rc));
 
 	/* check how the second argument is decoded */
diff --git a/tests/getgroups.gen.test b/tests/getgroups.gen.test
new file mode 100755
index 0000000..48b09be
--- /dev/null
+++ b/tests/getgroups.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (getgroups -a17); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a17
diff --git a/tests/getgroups.test b/tests/getgroups.test
deleted file mode 100755
index 2eb3056..0000000
--- a/tests/getgroups.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check getgroups syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a17
diff --git a/tests/getgroups32.gen.test b/tests/getgroups32.gen.test
new file mode 100755
index 0000000..74637d0
--- /dev/null
+++ b/tests/getgroups32.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (getgroups32 -a19); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a19
diff --git a/tests/getgroups32.test b/tests/getgroups32.test
deleted file mode 100755
index 12a8bcc..0000000
--- a/tests/getgroups32.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check getgroups32 syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a19
diff --git a/tests/getpeername.gen.test b/tests/getpeername.gen.test
new file mode 100755
index 0000000..66fb0a9
--- /dev/null
+++ b/tests/getpeername.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (getpeername -a27); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a27
diff --git a/tests/getpeername.test b/tests/getpeername.test
deleted file mode 100755
index 81f01bb..0000000
--- a/tests/getpeername.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check decoding of getpeername syscall.
-
-. "${srcdir=.}/getsockname.test"
diff --git a/tests/getpgrp.gen.test b/tests/getpgrp.gen.test
new file mode 100755
index 0000000..1ec48e9
--- /dev/null
+++ b/tests/getpgrp.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (getpgrp -a10); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a10
diff --git a/tests/getpgrp.test b/tests/getpgrp.test
deleted file mode 100755
index e116bb5..0000000
--- a/tests/getpgrp.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check getpgrp syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a10
diff --git a/tests/getpid.c b/tests/getpid.c
new file mode 100644
index 0000000..96f2d15
--- /dev/null
+++ b/tests/getpid.c
@@ -0,0 +1,21 @@
+#include "tests.h"
+#include <asm/unistd.h>
+
+#ifdef __NR_getpid
+
+# include <stdio.h>
+# include <unistd.h>
+
+int
+main(void)
+{
+	printf("getpid() = %ld\n", syscall(__NR_getpid));
+	puts("+++ exited with 0 +++");
+	return 0;
+}
+
+#else
+
+SKIP_MAIN_UNDEFINED("__NR_getpid")
+
+#endif
diff --git a/tests/getpid.gen.test b/tests/getpid.gen.test
new file mode 100755
index 0000000..4691774
--- /dev/null
+++ b/tests/getpid.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (getpid -a9); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a9
diff --git a/tests/getppid.c b/tests/getppid.c
new file mode 100644
index 0000000..58901fc
--- /dev/null
+++ b/tests/getppid.c
@@ -0,0 +1,21 @@
+#include "tests.h"
+#include <asm/unistd.h>
+
+#ifdef __NR_getppid
+
+# include <stdio.h>
+# include <unistd.h>
+
+int
+main(void)
+{
+	printf("getppid() = %ld\n", syscall(__NR_getppid));
+	puts("+++ exited with 0 +++");
+	return 0;
+}
+
+#else
+
+SKIP_MAIN_UNDEFINED("__NR_getppid")
+
+#endif
diff --git a/tests/getppid.gen.test b/tests/getppid.gen.test
new file mode 100755
index 0000000..52116a0
--- /dev/null
+++ b/tests/getppid.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (getppid -a10); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a10
diff --git a/tests/getrandom.gen.test b/tests/getrandom.gen.test
new file mode 100755
index 0000000..2f5b989
--- /dev/null
+++ b/tests/getrandom.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (getrandom -a32 -s3); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a32 -s3
diff --git a/tests/getrandom.test b/tests/getrandom.test
deleted file mode 100755
index ad34048..0000000
--- a/tests/getrandom.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check getrandom syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a32 -s3
diff --git a/tests/getresgid.gen.test b/tests/getresgid.gen.test
new file mode 100755
index 0000000..f53bccc
--- /dev/null
+++ b/tests/getresgid.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (getresgid -a25); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a25
diff --git a/tests/getresgid.test b/tests/getresgid.test
deleted file mode 100755
index 9f5186e..0000000
--- a/tests/getresgid.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check getresgid syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a25
diff --git a/tests/getresgid32.gen.test b/tests/getresgid32.gen.test
new file mode 100755
index 0000000..5f00506
--- /dev/null
+++ b/tests/getresgid32.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (getresgid32 -a27); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a27
diff --git a/tests/getresgid32.test b/tests/getresgid32.test
deleted file mode 100755
index a979891..0000000
--- a/tests/getresgid32.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check getresgid32 syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a27
diff --git a/tests/getresugid.c b/tests/getresugid.c
index 0ee721c..af9f015 100644
--- a/tests/getresugid.c
+++ b/tests/getresugid.c
@@ -2,6 +2,7 @@
  * Check decoding of getresuid/getresgid/getresuid32/getresgid32 syscalls.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -34,9 +35,9 @@
 int
 main(void)
 {
-	unsigned UGID_TYPE *const r = tail_alloc(sizeof(*r));
-	unsigned UGID_TYPE *const e = tail_alloc(sizeof(*e));
-	unsigned UGID_TYPE *const s = tail_alloc(sizeof(*s));
+	TAIL_ALLOC_OBJECT_CONST_PTR(unsigned UGID_TYPE, r);
+	TAIL_ALLOC_OBJECT_CONST_PTR(unsigned UGID_TYPE, e);
+	TAIL_ALLOC_OBJECT_CONST_PTR(unsigned UGID_TYPE, s);
 
 	if (syscall(SYSCALL_NR, r, e, s))
 		perror_msg_and_fail(SYSCALL_NAME);
diff --git a/tests/getresuid.gen.test b/tests/getresuid.gen.test
new file mode 100755
index 0000000..e947a94
--- /dev/null
+++ b/tests/getresuid.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (getresuid -a25); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a25
diff --git a/tests/getresuid.test b/tests/getresuid.test
deleted file mode 100755
index eee1ac0..0000000
--- a/tests/getresuid.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check getresuid syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a25
diff --git a/tests/getresuid32.gen.test b/tests/getresuid32.gen.test
new file mode 100755
index 0000000..b088a22
--- /dev/null
+++ b/tests/getresuid32.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (getresuid32 -a27); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a27
diff --git a/tests/getresuid32.test b/tests/getresuid32.test
deleted file mode 100755
index fdc76a3..0000000
--- a/tests/getresuid32.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check getresuid32 syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a27
diff --git a/tests/getrlimit.gen.test b/tests/getrlimit.gen.test
new file mode 100755
index 0000000..b97c176
--- /dev/null
+++ b/tests/getrlimit.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (getrlimit -a27); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a27
diff --git a/tests/getrlimit.test b/tests/getrlimit.test
deleted file mode 100755
index 6fd88ae..0000000
--- a/tests/getrlimit.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check decoding of getrlimit syscall.
-
-. "${srcdir=.}/setrlimit.test"
diff --git a/tests/getrusage.c b/tests/getrusage.c
index 8b76eff..bb52dd9 100644
--- a/tests/getrusage.c
+++ b/tests/getrusage.c
@@ -1,6 +1,7 @@
 /*
  * Copyright (c) 2016 Fei Jie <[email protected]>
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -35,27 +36,46 @@
 # include <stdint.h>
 # include <sys/resource.h>
 # include <unistd.h>
+# include <errno.h>
+
+# include "xlat.h"
+# include "xlat/usagewho.h"
 
 int
-main(void)
+invoke_print(int who, const char *who_str, struct rusage *usage)
 {
-	struct rusage *const usage = tail_alloc(sizeof(struct rusage));
-	int rc = syscall(__NR_getrusage, RUSAGE_SELF, usage);
-	printf("getrusage(RUSAGE_SELF, {ru_utime={tv_sec=%jd, tv_usec=%jd}"
-	       ", ru_stime={tv_sec=%jd, tv_usec=%jd}, ru_maxrss=%lu"
+	int rc = syscall(__NR_getrusage, who, usage);
+	int saved_errno = errno;
+	printf("getrusage(%s, {ru_utime={tv_sec=%lld, tv_usec=%llu}"
+	       ", ru_stime={tv_sec=%lld, tv_usec=%llu}, ru_maxrss=%lu"
 	       ", ru_ixrss=%lu, ru_idrss=%lu, ru_isrss=%lu, ru_minflt=%lu"
 	       ", ru_majflt=%lu, ru_nswap=%lu, ru_inblock=%lu"
 	       ", ru_oublock=%lu, ru_msgsnd=%lu, ru_msgrcv=%lu"
-	       ", ru_nsignals=%lu, ru_nvcsw=%lu, ru_nivcsw=%lu}) = %d\n",
-	       (intmax_t) usage->ru_utime.tv_sec,
-	       (intmax_t) usage->ru_utime.tv_usec,
-	       (intmax_t) usage->ru_stime.tv_sec,
-	       (intmax_t) usage->ru_stime.tv_usec,
+	       ", ru_nsignals=%lu, ru_nvcsw=%lu, ru_nivcsw=%lu}) = %s\n",
+	       who_str,
+	       (long long) usage->ru_utime.tv_sec,
+	       zero_extend_signed_to_ull(usage->ru_utime.tv_usec),
+	       (long long) usage->ru_stime.tv_sec,
+	       zero_extend_signed_to_ull(usage->ru_stime.tv_usec),
 	       usage->ru_maxrss, usage->ru_ixrss, usage->ru_idrss,
 	       usage->ru_isrss, usage->ru_minflt, usage->ru_majflt,
 	       usage->ru_nswap, usage->ru_inblock, usage->ru_oublock,
 	       usage->ru_msgsnd, usage->ru_msgrcv, usage->ru_nsignals,
-	       usage->ru_nvcsw, usage->ru_nivcsw, rc);
+	       usage->ru_nvcsw, usage->ru_nivcsw, sprintrc(rc));
+	errno = saved_errno;
+	return rc;
+}
+
+int
+main(void)
+{
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct rusage, usage);
+	if (invoke_print(ARG_STR(RUSAGE_SELF), usage)) {
+		perror_msg_and_fail("RUSAGE_SELF");
+	}
+	if (invoke_print(ARG_STR(RUSAGE_THREAD), usage) && errno != EINVAL) {
+		perror_msg_and_fail("RUSAGE_THREAD");
+	}
 
 	puts("+++ exited with 0 +++");
 	return 0;
diff --git a/tests/getrusage.gen.test b/tests/getrusage.gen.test
new file mode 100755
index 0000000..c4fb182
--- /dev/null
+++ b/tests/getrusage.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (getrusage -v); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -v
diff --git a/tests/getrusage.test b/tests/getrusage.test
deleted file mode 100755
index 4a3e8ed..0000000
--- a/tests/getrusage.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check getrusage syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -v
diff --git a/tests/getsid.gen.test b/tests/getsid.gen.test
new file mode 100755
index 0000000..123f177
--- /dev/null
+++ b/tests/getsid.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (getsid -a10); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a10
diff --git a/tests/getsid.test b/tests/getsid.test
deleted file mode 100755
index 3fcf979..0000000
--- a/tests/getsid.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check getsid syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a10
diff --git a/tests/getsockname.gen.test b/tests/getsockname.gen.test
new file mode 100755
index 0000000..cd40d3e
--- /dev/null
+++ b/tests/getsockname.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (getsockname -a27); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a27
diff --git a/tests/getsockname.test b/tests/getsockname.test
deleted file mode 100755
index 99b2850..0000000
--- a/tests/getsockname.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of getsockname syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a27
diff --git a/tests/gettid.c b/tests/gettid.c
new file mode 100644
index 0000000..9b13eb8
--- /dev/null
+++ b/tests/gettid.c
@@ -0,0 +1,12 @@
+#include "tests.h"
+#include <stdio.h>
+#include <unistd.h>
+#include <asm/unistd.h>
+
+int
+main(void)
+{
+	printf("gettid() = %ld\n", syscall(__NR_gettid));
+	puts("+++ exited with 0 +++");
+	return 0;
+}
diff --git a/tests/gettid.gen.test b/tests/gettid.gen.test
new file mode 100755
index 0000000..1ceaa53
--- /dev/null
+++ b/tests/gettid.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (gettid -a9); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a9
diff --git a/tests/getuid.test b/tests/getuid.test
index 9aaf74b..0bad1ff 100755
--- a/tests/getuid.test
+++ b/tests/getuid.test
@@ -9,4 +9,3 @@
 run_strace -qq -a9 -e$NAME $args > "$EXP"
 uniq < "$LOG" > "$OUT"
 match_diff "$OUT" "$EXP"
-rm -f "$OUT" "$EXP"
diff --git a/tests/getuid32.gen.test b/tests/getuid32.gen.test
new file mode 100755
index 0000000..ac0d0ad
--- /dev/null
+++ b/tests/getuid32.gen.test
@@ -0,0 +1,3 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (getuid32 +getuid.test); do not edit.
+. "${srcdir=.}/getuid.test"
diff --git a/tests/getuid32.test b/tests/getuid32.test
deleted file mode 100755
index ae0c557..0000000
--- a/tests/getuid32.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check getuid32 syscall decoding.
-
-. "${srcdir=.}/getuid.test"
diff --git a/tests/getxxid.gen.test b/tests/getxxid.gen.test
new file mode 100755
index 0000000..5aa89f6
--- /dev/null
+++ b/tests/getxxid.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (getxxid -a10 -e trace=getxpid,getxuid,getxgid); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a10 -e trace=getxpid,getxuid,getxgid
diff --git a/tests/getxxid.test b/tests/getxxid.test
deleted file mode 100755
index 9b89d7c..0000000
--- a/tests/getxxid.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check getxpid, getxuid, and getxgid syscalls decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a10 -e trace=getxpid,getxuid,getxgid
diff --git a/tests/inet-cmsg.gen.test b/tests/inet-cmsg.gen.test
new file mode 100755
index 0000000..8eeb7c9
--- /dev/null
+++ b/tests/inet-cmsg.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (inet-cmsg -e trace=recvmsg); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -e trace=recvmsg
diff --git a/tests/inet-cmsg.test b/tests/inet-cmsg.test
deleted file mode 100755
index 52ff5f5..0000000
--- a/tests/inet-cmsg.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check IPPROTO_IP control messages decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -e trace=recvmsg
diff --git a/tests/init.sh b/tests/init.sh
index f368b98..2844765 100644
--- a/tests/init.sh
+++ b/tests/init.sh
@@ -1,6 +1,7 @@
 #!/bin/sh
 #
 # Copyright (c) 2011-2016 Dmitry V. Levin <[email protected]>
+# Copyright (c) 2011-2017 The strace developers.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -26,10 +27,9 @@
 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 ME_="${0##*/}"
-LOG="$ME_.tmp"
-OUT="$LOG.out"
-EXP="$LOG.exp"
-NAME="${ME_%.test}"
+LOG="log"
+OUT="out"
+EXP="exp"
 
 warn_() { printf >&2 '%s\n' "$*"; }
 fail_() { warn_ "$ME_: failed test: $*"; exit 1; }
@@ -52,7 +52,7 @@
 run_prog()
 {
 	if [ $# -eq 0 ]; then
-		set -- "./$NAME"
+		set -- "../$NAME"
 	fi
 	args="$*"
 	"$@" || {
@@ -72,6 +72,20 @@
 	"$@" || framework_skip_ "$args failed with code $?"
 }
 
+try_run_prog()
+{
+	local rc
+
+	"$@" > /dev/null || {
+		rc=$?
+		if [ $rc -eq 77 ]; then
+			return 1
+		else
+			fail_ "$* failed with code $rc"
+		fi
+	}
+}
+
 run_strace()
 {
 	> "$LOG" || fail_ "failed to write $LOG"
@@ -213,7 +227,6 @@
 	run_prog > /dev/null
 	run_strace "$@" $args > "$EXP"
 	match_diff "$LOG" "$EXP"
-	rm -f "$EXP"
 }
 
 # Print kernel version code.
@@ -250,22 +263,110 @@
 	cat < "/proc/$pid/status" | grep "$@"
 }
 
+# Subtracts one program set from another.
+# If an optional regular expression is specified, the lines in the minuend file
+# that match this regular expression are elso excluded from the output.
+#
+# Usage: prog_set_subtract minuend_file subtrahend_file [subtrahend_regexp]
+prog_set_subtract()
+{
+	local min sub re pat
+	min="$1"; shift
+	sub="$1"; shift
+	re="${1-}"
+	pat="$re|$(sed 's/[[:space:]].*//' < "$sub" | tr -s '\n' '|')"
+	grep -E -v -x -e "$pat" < "$min"
+}
+
+# Usage: test_pure_prog_set [--expfile FILE] COMMON_ARGS < tests_file
+# stdin should consist of lines in "test_name strace_args..." format.
+test_pure_prog_set()
+{
+	local expfile
+
+	expfile="$EXP"
+
+	while [ -n "$1" ]; do
+		case "$1" in
+		--expfile)
+			shift
+			expfile="$1"
+			shift
+			;;
+		*)
+			break
+			;;
+		esac
+	done
+
+	while read -r t prog_args; do {
+		# skip lines beginning with "#" symbol
+		[ "${t###}" = "$t" ] || continue
+
+		try_run_prog "../$t" || continue
+		run_strace $prog_args "$@" "../$t" > "$expfile"
+		match_diff "$LOG" "$expfile"
+	} < /dev/null; done
+}
+
+# Run strace against list of programs put in "$NAME.in" and then against the
+# rest of pure_executables.list with the expectation of empty output in the
+# latter case.
+#
+# Usage: source this file after init.sh and call:
+#   test_trace_expr subtrahend_regexp strace_args
+# Environment:
+#   $NAME:	test name, used for "$NAME.in" file containing list of tests
+#		for positive trace expression match;
+#   $srcdir:	used to find pure_executables.list and "$NAME.in" files.
+# Files created:
+#   negative.list: File containing list of tests for negative match.
+test_trace_expr()
+{
+	local subtrahend_regexp
+	subtrahend_regexp="$1"; shift
+	test_pure_prog_set "$@" < "$srcdir/$NAME.in"
+	prog_set_subtract "$srcdir/pure_executables.list" "$srcdir/$NAME.in" \
+		"$subtrahend_regexp" > negative.list
+	test_pure_prog_set --expfile /dev/null -qq -esignal=none "$@" \
+		< negative.list
+}
+
 check_prog cat
 check_prog rm
 
-rm -f "$LOG"
+case "$ME_" in
+	*.gen.test) NAME="${ME_%.gen.test}" ;;
+	*.test) NAME="${ME_%.test}" ;;
+	*) NAME=
+esac
 
-[ -n "${STRACE-}" ] || {
-	STRACE=../strace
-	case "${LOG_COMPILER-} ${LOG_FLAGS-}" in
-		*--suppressions=*--error-exitcode=*--tool=*)
+if [ -n "$NAME" ]; then
+	TESTDIR="$NAME.dir"
+	rm -rf -- "$TESTDIR"
+	mkdir -- "$TESTDIR"
+	cd "$TESTDIR"
+
+	case "$srcdir" in
+		/*) ;;
+		*) srcdir="../$srcdir" ;;
+	esac
+
+	[ -n "${STRACE-}" ] || {
+		STRACE=../../strace
+		case "${LOG_COMPILER-} ${LOG_FLAGS-}" in
+			*--suppressions=*--error-exitcode=*--tool=*)
 			# add valgrind command prefix
 			STRACE="${LOG_COMPILER-} ${LOG_FLAGS-} $STRACE"
 			;;
-	esac
-}
+		esac
+	}
+else
+	[ -n "${STRACE-}" ] ||
+		STRACE=../strace
+fi
 
-: "${TIMEOUT_DURATION:=60}"
+: "${TIMEOUT_DURATION:=120}"
 : "${SLEEP_A_BIT:=sleep 1}"
 
 [ -z "${VERBOSE-}" ] ||
diff --git a/tests/init_delete_module.h b/tests/init_delete_module.h
index db550c3..cabf26f 100644
--- a/tests/init_delete_module.h
+++ b/tests/init_delete_module.h
@@ -3,6 +3,7 @@
  * and delete_module tests.
  *
  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -42,9 +43,6 @@
 	MAX_STRLEN = 32,
 };
 
-static const kernel_ulong_t bogus_zero =
-	(kernel_ulong_t) 0xffffffff00000000ULL;
-
 static void
 print_str(unsigned int base, unsigned int len, bool escape)
 {
diff --git a/tests/init_module.c b/tests/init_module.c
index 88ef9ec..8fbb263 100644
--- a/tests/init_module.c
+++ b/tests/init_module.c
@@ -2,6 +2,7 @@
  * Check decoding of init_module syscall.
  *
  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -55,9 +56,9 @@
 	fill_memory_ex(bogus_param1, PARAM1_LEN, PARAM1_BASE, PARAM1_LEN);
 	fill_memory_ex(bogus_param2, PARAM2_LEN, PARAM2_BASE, PARAM2_LEN);
 
-	rc = syscall(__NR_init_module, NULL, bogus_zero, NULL);
+	rc = syscall(__NR_init_module, NULL, F8ILL_KULONG_MASK, NULL);
 	printf("init_module(NULL, %llu, NULL) = %s\n",
-	       (unsigned long long) bogus_zero, sprintrc(rc));
+	       (unsigned long long) F8ILL_KULONG_MASK, sprintrc(rc));
 
 	rc = syscall(__NR_init_module, bogus_addr, 0, bogus_param1);
 	errstr = sprintrc(rc);
diff --git a/tests/init_module.gen.test b/tests/init_module.gen.test
new file mode 100755
index 0000000..8948e2e
--- /dev/null
+++ b/tests/init_module.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (init_module -a27); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a27
diff --git a/tests/init_module.test b/tests/init_module.test
deleted file mode 100755
index ef7c732..0000000
--- a/tests/init_module.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of init_module syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a27
diff --git a/tests/inotify.gen.test b/tests/inotify.gen.test
new file mode 100755
index 0000000..7010206
--- /dev/null
+++ b/tests/inotify.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (inotify -a23 -e trace=inotify_add_watch,inotify_rm_watch); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a23 -e trace=inotify_add_watch,inotify_rm_watch
diff --git a/tests/inotify.test b/tests/inotify.test
deleted file mode 100755
index 436f3bc..0000000
--- a/tests/inotify.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of inotify_add_watch and inotify_rm_watch syscalls.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -e trace=inotify_add_watch,inotify_rm_watch -a23
diff --git a/tests/inotify_init1.gen.test b/tests/inotify_init1.gen.test
new file mode 100755
index 0000000..d847b50
--- /dev/null
+++ b/tests/inotify_init1.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (inotify_init1 -a27); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a27
diff --git a/tests/inotify_init1.test b/tests/inotify_init1.test
deleted file mode 100755
index 1a7c926..0000000
--- a/tests/inotify_init1.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of inotify_init1 syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a27
diff --git a/tests/int_0x80.c b/tests/int_0x80.c
new file mode 100644
index 0000000..012694f
--- /dev/null
+++ b/tests/int_0x80.c
@@ -0,0 +1,52 @@
+/*
+ * Check decoding of int 0x80 on x86_64, x32, and x86.
+ *
+ * Copyright (c) 2017 Dmitry V. Levin <[email protected]>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "tests.h"
+
+#if defined __x86_64__ || defined __i386__
+
+# include <stdio.h>
+# include <unistd.h>
+
+int
+main(void)
+{
+	/* 200 is __NR_getgid32 on x86 and __NR_tkill on x86_64. */
+	__asm__("movl $200, %eax; int $0x80");
+	printf("getgid32() = %d\n", getegid());
+
+	puts("+++ exited with 0 +++");
+	return 0;
+}
+
+#else
+
+SKIP_MAIN_UNDEFINED("__x86_64__ || __i386__")
+
+#endif
diff --git a/tests/int_0x80.gen.test b/tests/int_0x80.gen.test
new file mode 100755
index 0000000..2ab4f2f
--- /dev/null
+++ b/tests/int_0x80.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (int_0x80 -a11 -e trace=getgid32); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a11 -e trace=getgid32
diff --git a/tests/ioctl-v.sh b/tests/ioctl-v.sh
new file mode 100755
index 0000000..be89671
--- /dev/null
+++ b/tests/ioctl-v.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+# Check non-abbreviated decoding of ioctls.
+
+. "${srcdir=.}/init.sh"
+
+check_prog grep
+run_prog > /dev/null
+run_strace -a16 -v -eioctl $args > "$EXP"
+grep -v '^ioctl([012],' < "$LOG" > "$OUT"
+match_diff "$OUT" "$EXP"
diff --git a/tests/ioctl.c b/tests/ioctl.c
index 92a3191..5dc0864 100644
--- a/tests/ioctl.c
+++ b/tests/ioctl.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff --git a/tests/ioctl.test b/tests/ioctl.test
index 94bc5d4..1eb469e 100755
--- a/tests/ioctl.test
+++ b/tests/ioctl.test
@@ -4,12 +4,8 @@
 
 . "${srcdir=.}/init.sh"
 
+check_prog grep
 run_prog > /dev/null
 run_strace -a16 -eioctl $args > "$EXP"
-check_prog grep
 grep -v '^ioctl([012],' < "$LOG" > "$OUT"
 match_diff "$OUT" "$EXP"
-
-rm -f "$EXP" "$OUT"
-
-exit 0
diff --git a/tests/ioctl_block.c b/tests/ioctl_block.c
index f62b0b3..8e883d4 100644
--- a/tests/ioctl_block.c
+++ b/tests/ioctl_block.c
@@ -2,6 +2,7 @@
  * This file is part of ioctl_block strace test.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -113,7 +114,7 @@
 	ioctl(-1, BLKFRASET, lmagic);
 	printf("ioctl(-1, BLKFRASET, %lu) = -1 EBADF (%m)\n", lmagic);
 
-	int *const val_int = tail_alloc(sizeof(*val_int));
+	TAIL_ALLOC_OBJECT_CONST_PTR(int, val_int);
 	*val_int = magic;
 
 	ioctl(-1, BLKROSET, val_int);
@@ -144,7 +145,7 @@
 	       " = -1 EBADF (%m)\n", pair_int64[0], pair_int64[1]);
 #endif
 
-	struct blkpg_ioctl_arg *const blkpg = tail_alloc(sizeof(*blkpg));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct blkpg_ioctl_arg, blkpg);
 	blkpg->op = 3;
 	blkpg->flags = 0xdeadbeef;
 	blkpg->datalen = 0xbadc0ded;
@@ -156,7 +157,7 @@
 	       "BLKPG_RESIZE_PARTITION", blkpg->flags, blkpg->datalen,
 	       (unsigned long) blkpg->data);
 
-	struct blkpg_partition *const bp = tail_alloc(sizeof(*bp));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct blkpg_partition, bp);
 	bp->start = 0xfac1fed2dad3bef4ULL;
 	bp->length = 0xfac5fed6dad7bef8ULL;
 	bp->pno = magic;
@@ -177,7 +178,7 @@
 	       (int) sizeof(bp->volname) - 1, bp->volname);
 
 #if defined BLKTRACESETUP && defined HAVE_STRUCT_BLK_USER_TRACE_SETUP
-	struct blk_user_trace_setup *const buts = tail_alloc(sizeof(*buts));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct blk_user_trace_setup, buts);
 	fill_memory(buts, sizeof(*buts));
 
 	ioctl(-1, BLKTRACESETUP, buts);
diff --git a/tests/ioctl_block.gen.test b/tests/ioctl_block.gen.test
new file mode 100755
index 0000000..0ffec6f
--- /dev/null
+++ b/tests/ioctl_block.gen.test
@@ -0,0 +1,3 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (ioctl_block +ioctl.test); do not edit.
+. "${srcdir=.}/ioctl.test"
diff --git a/tests/ioctl_block.test b/tests/ioctl_block.test
deleted file mode 100755
index 0bf2500..0000000
--- a/tests/ioctl_block.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check decoding of BLK* ioctls.
-
-. "${srcdir=.}/ioctl.test"
diff --git a/tests/ioctl_dm-v.test b/tests/ioctl_dm-v.test
index ade3b9e..eed37c2 100755
--- a/tests/ioctl_dm-v.test
+++ b/tests/ioctl_dm-v.test
@@ -4,9 +4,8 @@
 
 . "${srcdir=.}/init.sh"
 
+check_prog grep
 run_prog > /dev/null
 run_strace -a16 -s9 -veioctl $args > "$EXP"
-check_prog grep
 grep -v '^ioctl([012],' < "$LOG" > "$OUT"
 match_diff "$OUT" "$EXP"
-rm -f "$EXP" "$OUT"
diff --git a/tests/ioctl_dm.c b/tests/ioctl_dm.c
index 08f036c..544d70b 100644
--- a/tests/ioctl_dm.c
+++ b/tests/ioctl_dm.c
@@ -3,6 +3,7 @@
  *
  * Copyright (c) 2016 Mikulas Patocka <[email protected]>
  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -234,15 +235,15 @@
 	dm_arg->version[1] = 0xbadc0dee;
 	dm_arg->version[2] = 0xbadc0def;
 	ioctl(-1, DM_VERSION, dm_arg);
-	printf("ioctl(-1, DM_VERSION, {version=%u.%u.%u, "
-	       "/* Unsupported device mapper ABI version */ ...}) = "
+	printf("ioctl(-1, DM_VERSION, {version=%u.%u.%u"
+	       " /* unsupported device mapper ABI version */}) = "
 	       "-1 EBADF (%m)\n", 0xbadc0ded, 0xbadc0dee, 0xbadc0def);
 
 	/* Incorrect data_size */
 	init_s(dm_arg, 14, 64);
 	ioctl(-1, DM_VERSION, dm_arg);
-	printf("ioctl(-1, DM_VERSION, {version=4.1.2, data_size=14, "
-	       "/* Incorrect data_size */ ...}) = -1 EBADF (%m)\n");
+	printf("ioctl(-1, DM_VERSION, {version=4.1.2, data_size=14"
+	       " /* data_size too small */}) = -1 EBADF (%m)\n");
 
 	/* Unterminated name/uuid */
 	init_s(dm_arg, min_sizeof_dm_ioctl, 0);
@@ -395,8 +396,8 @@
 	       "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", "
 	       "target_count=1234, flags=0, "
 # if VERBOSE
-	       "/* misplaced struct dm_target_spec */ ..."
-# else /* !VERBOSE */
+	       "??? /* misplaced struct dm_target_spec */"
+# else
 	       "..."
 # endif /* VERBOSE */
 	       "}) = -1 EBADF (%m)\n", sizeof(*dm_arg), 0xfffffff8);
@@ -491,7 +492,7 @@
 	print_dm_target_spec(&dm_arg_open3->target1, 15);
 	printf("\"\\377\"}, ");
 	print_dm_target_spec(&dm_arg_open3->target1, 42);
-	printf("\"\\1\\2\"}, /* misplaced struct dm_target_spec */ ...");
+	printf("\"\\1\\2\"}, ??? /* misplaced struct dm_target_spec */");
 # else /* !VERBOSE */
 	printf("...");
 # endif /* VERBOSE */
@@ -575,7 +576,7 @@
 	       "{version=4.1.2, data_size=%zu, data_start=%zu, "
 	       "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", flags=0, "
 # if VERBOSE
-	       "/* misplaced struct dm_target_msg */"
+	       "??? /* misplaced struct dm_target_msg */"
 # else /* !VERBOSE */
 	       "..."
 # endif /* VERBOSE */
@@ -590,7 +591,7 @@
 	       "{version=4.1.2, data_size=%zu, data_start=%u, "
 	       "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", flags=0, "
 # if VERBOSE
-	       "/* misplaced struct dm_target_msg */"
+	       "??? /* misplaced struct dm_target_msg */"
 # else /* !VERBOSE */
 	       "..."
 # endif /* VERBOSE */
@@ -706,7 +707,7 @@
 	       "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", event_nr=0, "
 	       "flags=0, "
 # if VERBOSE
-	       "/* misplaced string */"
+	       "??? /* misplaced string */"
 # else /* !VERBOSE */
 	       "..."
 # endif /* VERBOSE */
@@ -757,10 +758,12 @@
 	       "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", "
 	       "target_count=4294967295, flags=0, "
 # if VERBOSE
-	       "{sector_start=0, length=0, target_type=\"\", string=\"\"}, "
-	       "/* misplaced struct dm_target_spec */ "
+	       "{sector_start=0, length=0, target_type=\"\", string=\"\"}"
+	       ", ??? /* misplaced struct dm_target_spec */"
+# else
+	       "..."
 # endif /* VERBOSE */
-	       "...}) = -1 EBADF (%m)\n",
+	       "}) = -1 EBADF (%m)\n",
 	       s.ioc.data_size, s.ioc.data_start);
 
 	puts("+++ exited with 0 +++");
diff --git a/tests/ioctl_dm.test b/tests/ioctl_dm.test
index 6485205..e9cca03 100755
--- a/tests/ioctl_dm.test
+++ b/tests/ioctl_dm.test
@@ -4,9 +4,8 @@
 
 . "${srcdir=.}/init.sh"
 
+check_prog grep
 run_prog > /dev/null
 run_strace -a16 -s9 -eioctl $args > "$EXP"
-check_prog grep
 grep -v '^ioctl([012],' < "$LOG" > "$OUT"
 match_diff "$OUT" "$EXP"
-rm -f "$EXP" "$OUT"
diff --git a/tests/ioctl_evdev-v.gen.test b/tests/ioctl_evdev-v.gen.test
new file mode 100755
index 0000000..fc7e2f0
--- /dev/null
+++ b/tests/ioctl_evdev-v.gen.test
@@ -0,0 +1,3 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (ioctl_evdev-v +ioctl-v.sh); do not edit.
+. "${srcdir=.}/ioctl-v.sh"
diff --git a/tests/ioctl_evdev-v.test b/tests/ioctl_evdev-v.test
deleted file mode 100755
index 8794101..0000000
--- a/tests/ioctl_evdev-v.test
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-
-# Check verbose decoding EVIOC* ioctls.
-
-. "${srcdir=.}/init.sh"
-
-run_prog > /dev/null
-run_strace -a16 -veioctl $args > "$EXP"
-check_prog grep
-grep -v '^ioctl([012],' < "$LOG" > "$OUT"
-match_diff "$OUT" "$EXP"
-rm -f "$EXP" "$OUT"
diff --git a/tests/ioctl_evdev.c b/tests/ioctl_evdev.c
index d12323e..6cbc09f 100644
--- a/tests/ioctl_evdev.c
+++ b/tests/ioctl_evdev.c
@@ -2,6 +2,7 @@
  * This file is part of ioctl_evdev strace test.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -148,7 +149,7 @@
 	void *const page = tail_alloc(size);
 	fill_memory(page, size);
 
-	int *const val_int = tail_alloc(sizeof(*val_int));
+	TAIL_ALLOC_OBJECT_CONST_PTR(int, val_int);
 	*val_int = magic;
 
 # ifdef EVIOCSCLOCKID
@@ -172,7 +173,7 @@
 	       pair_int[0], "KEY_ESC");
 
 # ifdef EVIOCSKEYCODE_V2
-	struct input_keymap_entry *const ike = tail_alloc(sizeof(*ike));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct input_keymap_entry, ike);
 	fill_memory(ike, sizeof(*ike));
 	ike->keycode = 2;
 
@@ -196,7 +197,7 @@
 	printf("}) = -1 EBADF (%m)\n");
 # endif
 
-	struct ff_effect *const ffe = tail_alloc(sizeof(*ffe));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct ff_effect, ffe);
 	fill_memory(ffe, sizeof(*ffe));
 
 	ffe->type = FF_CONSTANT;
diff --git a/tests/ioctl_evdev.gen.test b/tests/ioctl_evdev.gen.test
new file mode 100755
index 0000000..26f0a28
--- /dev/null
+++ b/tests/ioctl_evdev.gen.test
@@ -0,0 +1,3 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (ioctl_evdev +ioctl.test); do not edit.
+. "${srcdir=.}/ioctl.test"
diff --git a/tests/ioctl_evdev.test b/tests/ioctl_evdev.test
deleted file mode 100755
index 7ed2e98..0000000
--- a/tests/ioctl_evdev.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check decoding of EVIOC* ioctls.
-
-. "${srcdir=.}/ioctl.test"
diff --git a/tests/ioctl_loop-nv.test b/tests/ioctl_loop-nv.test
index dcc27e1..7d59cc2 100755
--- a/tests/ioctl_loop-nv.test
+++ b/tests/ioctl_loop-nv.test
@@ -4,9 +4,8 @@
 
 . "${srcdir=.}/init.sh"
 
+check_prog grep
 run_prog > /dev/null
 run_strace -a22 -eioctl -e verbose=none $args > "$EXP"
-check_prog grep
 grep -v '^ioctl([012],' < "$LOG" > "$OUT"
 match_diff "$OUT" "$EXP"
-rm -f "$EXP" "$OUT"
diff --git a/tests/ioctl_loop-v.gen.test b/tests/ioctl_loop-v.gen.test
new file mode 100755
index 0000000..7fd9f66
--- /dev/null
+++ b/tests/ioctl_loop-v.gen.test
@@ -0,0 +1,3 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (ioctl_loop-v +ioctl-v.sh); do not edit.
+. "${srcdir=.}/ioctl-v.sh"
diff --git a/tests/ioctl_loop-v.test b/tests/ioctl_loop-v.test
deleted file mode 100755
index ff3995d..0000000
--- a/tests/ioctl_loop-v.test
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-
-# Check non-abbreviated decoding of LOOP_* ioctls.
-
-. "${srcdir=.}/init.sh"
-
-run_prog > /dev/null
-run_strace -a22 -v -eioctl $args > "$EXP"
-check_prog grep
-grep -v '^ioctl([012],' < "$LOG" > "$OUT"
-match_diff "$OUT" "$EXP"
-rm -f "$EXP" "$OUT"
diff --git a/tests/ioctl_loop.c b/tests/ioctl_loop.c
index a95e775..4dcbf9a 100644
--- a/tests/ioctl_loop.c
+++ b/tests/ioctl_loop.c
@@ -3,6 +3,7 @@
  *
  * Copyright (c) 2016 JingPiao Chen <[email protected]>
  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -175,8 +176,8 @@
 	static const kernel_ulong_t kernel_mask =
 		((kernel_ulong_t) -1) - ((unsigned long) -1L);
 
-	struct loop_info * const info = tail_alloc(sizeof(*info));
-	struct loop_info64 * const info64 = tail_alloc(sizeof(*info64));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct loop_info, info);
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct loop_info64, info64);
 
 	/* Unknown loop commands */
 	ioctl(-1, unknown_loop_cmd, magic);
diff --git a/tests/ioctl_loop.gen.test b/tests/ioctl_loop.gen.test
new file mode 100755
index 0000000..f7aee8e
--- /dev/null
+++ b/tests/ioctl_loop.gen.test
@@ -0,0 +1,3 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (ioctl_loop +ioctl.test); do not edit.
+. "${srcdir=.}/ioctl.test"
diff --git a/tests/ioctl_mtd.c b/tests/ioctl_mtd.c
index a37d5d0..71d0c0d 100644
--- a/tests/ioctl_mtd.c
+++ b/tests/ioctl_mtd.c
@@ -2,6 +2,7 @@
  * This file is part of ioctl_mtd strace test.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -95,13 +96,13 @@
 	ioctl(-1, MTDFILEMODE, MTD_FILE_MODE_NORMAL);
 	printf("ioctl(-1, MTDFILEMODE, MTD_FILE_MODE_NORMAL) = -1 EBADF (%m)\n");
 
-	int *const opt = tail_alloc(sizeof(*opt));
+	TAIL_ALLOC_OBJECT_CONST_PTR(int, opt);
 	*opt = MTD_OTP_OFF;
 	ioctl(-1, OTPSELECT, opt);
 	printf("ioctl(-1, MIXER_READ(%u) or OTPSELECT, [MTD_OTP_OFF])"
 	       " = -1 EBADF (%m)\n", (unsigned int) _IOC_NR(OTPSELECT));
 
-	uint64_t *const v64 = tail_alloc(sizeof(*v64));
+	TAIL_ALLOC_OBJECT_CONST_PTR(uint64_t, v64);
 	fill_memory(v64, sizeof(*v64));
 
 	ioctl(-1, MEMGETBADBLOCK, v64);
@@ -114,7 +115,7 @@
 	       " = -1 EBADF (%m)\n",
 	       (unsigned int) _IOC_NR(MEMSETBADBLOCK), *v64);
 
-	struct region_info_user *const riu = tail_alloc(sizeof(*riu));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct region_info_user, riu);
 	fill_memory(riu, sizeof(*riu));
 	ioctl(-1, MEMGETREGIONINFO, riu);
 	printf("ioctl(-1, %s, {regionindex=%#x}) = -1 EBADF (%m)\n",
@@ -124,7 +125,7 @@
 #endif
 	       , riu->regionindex);
 
-	struct erase_info_user *const eiu = tail_alloc(sizeof(*eiu));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct erase_info_user, eiu);
 	fill_memory(eiu, sizeof(*eiu));
 
 	TEST_erase_info_user(MEMERASE, eiu);
@@ -132,7 +133,7 @@
 	TEST_erase_info_user(MEMUNLOCK, eiu);
 	TEST_erase_info_user(MEMISLOCKED, eiu);
 
-	struct erase_info_user64 *const eiu64 = tail_alloc(sizeof(*eiu64));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct erase_info_user64, eiu64);
 	fill_memory(eiu64, sizeof(*eiu64));
 	ioctl(-1, MEMERASE64, eiu64);
 	printf("ioctl(-1, MIXER_WRITE(%u) or %s, {start=%#llx, length=%#llx})"
@@ -141,7 +142,7 @@
 	       (unsigned long long) eiu64->start,
 	       (unsigned long long) eiu64->length);
 
-	struct mtd_oob_buf *const oob = tail_alloc(sizeof(*oob));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct mtd_oob_buf, oob);
 	fill_memory(oob, sizeof(*oob));
 
 	ioctl(-1, MEMWRITEOOB, oob);
@@ -152,7 +153,7 @@
 	printf("ioctl(-1, MEMREADOOB, {start=%#x, length=%#x, ptr=%p})"
 	       " = -1 EBADF (%m)\n", oob->start, oob->length, oob->ptr);
 
-	struct mtd_oob_buf64 *const oob64 = tail_alloc(sizeof(*oob64));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct mtd_oob_buf64, oob64);
 	fill_memory(oob64, sizeof(*oob64));
 
 	ioctl(-1, MEMWRITEOOB64, oob64);
@@ -168,14 +169,14 @@
 	       (unsigned long long) oob64->usr_ptr);
 
 
-	struct otp_info *const oi = tail_alloc(sizeof(*oi));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct otp_info, oi);
 	fill_memory(oi, sizeof(*oi));
 	ioctl(-1, OTPLOCK, oi);
 	printf("ioctl(-1, MIXER_READ(%u) or OTPLOCK"
 	       ", {start=%#x, length=%#x, locked=%u}) = -1 EBADF (%m)\n",
 	       (unsigned int) _IOC_NR(OTPLOCK),  oi->start, oi->length, oi->locked);
 
-	struct mtd_write_req *const wr = tail_alloc(sizeof(*wr));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct mtd_write_req, wr);
 	fill_memory(wr, sizeof(*wr));
 	wr->mode = MTD_OPS_PLACE_OOB;
 	ioctl(-1, MEMWRITE, wr);
diff --git a/tests/ioctl_mtd.gen.test b/tests/ioctl_mtd.gen.test
new file mode 100755
index 0000000..cbc3104
--- /dev/null
+++ b/tests/ioctl_mtd.gen.test
@@ -0,0 +1,3 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (ioctl_mtd +ioctl.test); do not edit.
+. "${srcdir=.}/ioctl.test"
diff --git a/tests/ioctl_mtd.test b/tests/ioctl_mtd.test
deleted file mode 100755
index 0842807..0000000
--- a/tests/ioctl_mtd.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check decoding of 'M' type ioctls.
-
-. "${srcdir=.}/ioctl.test"
diff --git a/tests/ioctl_nsfs.c b/tests/ioctl_nsfs.c
new file mode 100644
index 0000000..b2dbd1b
--- /dev/null
+++ b/tests/ioctl_nsfs.c
@@ -0,0 +1,145 @@
+/*
+ * Check decoding of NS_* commands of ioctl syscall.
+ *
+ * Copyright (c) 2017 Nikolay Marchuk <[email protected]>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "tests.h"
+
+#include <fcntl.h>
+#include <sched.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/ioctl.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#include "nsfs.h"
+
+#ifndef CLONE_NEWUSER
+# define CLONE_NEWUSER 0x10000000
+#endif
+
+static void
+test_no_namespace(void)
+{
+	ioctl(-1, NS_GET_USERNS);
+	printf("ioctl(-1, NS_GET_USERNS) = -1 EBADF (%m)\n");
+	ioctl(-1, NS_GET_PARENT);
+	printf("ioctl(-1, NS_GET_PARENT) = -1 EBADF (%m)\n");
+	ioctl(-1, NS_GET_NSTYPE);
+	printf("ioctl(-1, NS_GET_NSTYPE) = -1 EBADF (%m)\n");
+	ioctl(-1, NS_GET_OWNER_UID, NULL);
+	printf("ioctl(-1, NS_GET_OWNER_UID, NULL) = -1 EBADF (%m)\n");
+}
+
+static void
+test_clone(pid_t pid)
+{
+	char path[sizeof("/proc/%d/ns/user") + sizeof(int)*3];
+	snprintf(path, sizeof(path), "/proc/%d/ns/user", pid);
+
+	int ns_fd = open(path, O_RDONLY);
+	if (ns_fd == -1)
+		perror_msg_and_skip("open: %s", path);
+
+	int userns_fd = ioctl(ns_fd, NS_GET_USERNS);
+	printf("ioctl(%d, NS_GET_USERNS) = %s\n", ns_fd, sprintrc(userns_fd));
+
+	int parent_ns_fd = ioctl(userns_fd, NS_GET_PARENT);
+	printf("ioctl(%d, NS_GET_PARENT) = %s\n",
+	       userns_fd, sprintrc(parent_ns_fd));
+
+	int nstype = ioctl(userns_fd, NS_GET_NSTYPE);
+	if (nstype == -1) {
+		printf("ioctl(%d, NS_GET_NSTYPE) = %s\n",
+		       userns_fd, sprintrc(nstype));
+	} else {
+		printf("ioctl(%d, NS_GET_NSTYPE) = %d (CLONE_NEWUSER)\n",
+		       userns_fd, nstype);
+	}
+
+	TAIL_ALLOC_OBJECT_CONST_PTR(unsigned int, uid);
+	int rc = ioctl(userns_fd, NS_GET_OWNER_UID, uid);
+	if (rc == -1) {
+		printf("ioctl(%d, NS_GET_OWNER_UID, %p) = %s\n",
+		       userns_fd, uid, sprintrc(rc));
+	} else {
+		printf("ioctl(%d, NS_GET_OWNER_UID, [%u]) = %d\n",
+		       userns_fd, *uid, rc);
+	}
+}
+
+static int
+child(void *arg)
+{
+	int *pipefd = (int *) arg;
+	close(pipefd[1]);
+	/* Wait for EOF from pipe. */
+	if (read(pipefd[0], &pipefd[1], 1))
+		perror_msg_and_fail("read");
+	return 0;
+}
+
+#ifdef IA64
+extern int __clone2(int (*)(void *), void *, size_t, int, void *, ...);
+# define clone(fn, child_stack, flags, arg)	\
+		__clone2(fn, child_stack, get_page_size() / 2, flags, arg)
+#endif
+
+static void
+test_user_namespace(void)
+{
+	pid_t pid;
+	int pipefd[2];
+	int status;
+
+	if (pipe(pipefd))
+		perror_msg_and_fail("pipe");
+
+	pid = clone(child, tail_alloc(get_page_size() / 2),
+		    CLONE_NEWUSER | CLONE_UNTRACED | SIGCHLD, pipefd);
+	if (pid == -1) {
+		perror("clone");
+		return;
+	}
+	close(pipefd[0]);
+	test_clone(pid);
+	close(pipefd[1]);
+	if (wait(&status) != pid) {
+		perror_msg_and_fail("wait");
+	} else if (status != 0) {
+		error_msg_and_fail("unexpected child exit status %d", status);
+	}
+}
+
+int
+main(void)
+{
+	test_no_namespace();
+	test_user_namespace();
+	puts("+++ exited with 0 +++");
+	return 0;
+}
diff --git a/tests/ioctl_loop.test b/tests/ioctl_nsfs.test
similarity index 60%
rename from tests/ioctl_loop.test
rename to tests/ioctl_nsfs.test
index 112cd63..acdfb61 100755
--- a/tests/ioctl_loop.test
+++ b/tests/ioctl_nsfs.test
@@ -1,12 +1,11 @@
 #!/bin/sh
 
-# Check decoding of LOOP_* ioctls.
+# Check decoding of NS_* ioctls.
 
 . "${srcdir=.}/init.sh"
 
-run_prog > /dev/null
-run_strace -a22 -eioctl $args > "$EXP"
 check_prog grep
+run_prog > /dev/null
+run_strace -a16 -eioctl -esignal=none $args > "$EXP"
 grep -v '^ioctl([012],' < "$LOG" > "$OUT"
 match_diff "$OUT" "$EXP"
-rm -f "$EXP" "$OUT"
diff --git a/tests/ioctl_rtc-v.gen.test b/tests/ioctl_rtc-v.gen.test
new file mode 100755
index 0000000..b534a02
--- /dev/null
+++ b/tests/ioctl_rtc-v.gen.test
@@ -0,0 +1,3 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (ioctl_rtc-v +ioctl-v.sh); do not edit.
+. "${srcdir=.}/ioctl-v.sh"
diff --git a/tests/ioctl_rtc-v.test b/tests/ioctl_rtc-v.test
deleted file mode 100755
index a255322..0000000
--- a/tests/ioctl_rtc-v.test
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-
-# Check verbose decoding of RTC_* ioctls.
-
-. "${srcdir=.}/init.sh"
-
-run_prog > /dev/null
-run_strace -a16 -veioctl $args > "$EXP"
-check_prog grep
-grep -v '^ioctl([012],' < "$LOG" > "$OUT"
-match_diff "$OUT" "$EXP"
-rm -f "$EXP" "$OUT"
diff --git a/tests/ioctl_rtc.c b/tests/ioctl_rtc.c
index 49d7ec7..466a1d3 100644
--- a/tests/ioctl_rtc.c
+++ b/tests/ioctl_rtc.c
@@ -2,6 +2,7 @@
  * This file is part of ioctl_rtc strace test.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -73,13 +74,13 @@
 	void *const page = tail_alloc(size);
 	fill_memory(page, size);
 
-	struct rtc_time *rt = tail_alloc(sizeof(*rt));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct rtc_time, rt);
 	fill_memory(rt, sizeof(*rt));
 
-	struct rtc_wkalrm *wk = tail_alloc(sizeof(*wk));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct rtc_wkalrm, wk);
 	fill_memory(wk, sizeof(*wk));
 
-	struct rtc_pll_info *pll = tail_alloc(sizeof(*pll));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct rtc_pll_info, pll);
 	fill_memory(pll, sizeof(*pll));
 
 	/* RTC_ALM_READ */
diff --git a/tests/ioctl_rtc.gen.test b/tests/ioctl_rtc.gen.test
new file mode 100755
index 0000000..e430a82
--- /dev/null
+++ b/tests/ioctl_rtc.gen.test
@@ -0,0 +1,3 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (ioctl_rtc +ioctl.test); do not edit.
+. "${srcdir=.}/ioctl.test"
diff --git a/tests/ioctl_rtc.test b/tests/ioctl_rtc.test
deleted file mode 100755
index 4545f2a..0000000
--- a/tests/ioctl_rtc.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check basic decoding of RTC_* ioctls.
-
-. "${srcdir=.}/ioctl.test"
diff --git a/tests/ioctl_scsi.c b/tests/ioctl_scsi.c
index 0db94d8..a9ecf28 100644
--- a/tests/ioctl_scsi.c
+++ b/tests/ioctl_scsi.c
@@ -69,7 +69,7 @@
 int
 main(void)
 {
-	int *const pint = tail_alloc(sizeof(*pint));
+	TAIL_ALLOC_OBJECT_CONST_PTR(int, pint);
 	*pint = (int) 0xfacefeed;
 
 	TEST_NO_ARG(SG_GET_TIMEOUT);
diff --git a/tests/ioctl_scsi.gen.test b/tests/ioctl_scsi.gen.test
new file mode 100755
index 0000000..23ac307
--- /dev/null
+++ b/tests/ioctl_scsi.gen.test
@@ -0,0 +1,3 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (ioctl_scsi +ioctl.test); do not edit.
+. "${srcdir=.}/ioctl.test"
diff --git a/tests/ioctl_scsi.test b/tests/ioctl_scsi.test
deleted file mode 100755
index 2710f12..0000000
--- a/tests/ioctl_scsi.test
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/sh
-
-# Check decoding of SCSI ioctl commands.
-. "${srcdir=.}/ioctl.test"
diff --git a/tests/ioctl_sg_io_v3.c b/tests/ioctl_sg_io_v3.c
index ef25795..3808b20 100644
--- a/tests/ioctl_sg_io_v3.c
+++ b/tests/ioctl_sg_io_v3.c
@@ -43,7 +43,7 @@
 	ioctl(-1, SG_IO, 0);
 	printf("ioctl(-1, SG_IO, NULL) = -1 EBADF (%m)\n");
 
-	struct sg_io_hdr *const sg_io = tail_alloc(sizeof(*sg_io));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct sg_io_hdr, sg_io);
 	fill_memory(sg_io, sizeof(*sg_io));
 
 	const void *const efault = sg_io + 1;
@@ -53,7 +53,7 @@
 	ioctl(-1, SG_IO, sg_io);
 	printf("ioctl(-1, SG_IO, [%u]) = -1 EBADF (%m)\n", sg_io->interface_id);
 
-	unsigned int *const piid = tail_alloc(sizeof(*piid));
+	TAIL_ALLOC_OBJECT_CONST_PTR(unsigned int, piid);
 	*piid = (unsigned char) 'S';
 	ioctl(-1, SG_IO, piid);
 	printf("ioctl(-1, SG_IO, {interface_id='S', %p}) = -1 EBADF (%m)\n", piid + 1);
diff --git a/tests/ioctl_sg_io_v3.gen.test b/tests/ioctl_sg_io_v3.gen.test
new file mode 100755
index 0000000..e7e5ea5
--- /dev/null
+++ b/tests/ioctl_sg_io_v3.gen.test
@@ -0,0 +1,3 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (ioctl_sg_io_v3 +ioctl.test); do not edit.
+. "${srcdir=.}/ioctl.test"
diff --git a/tests/ioctl_sg_io_v3.test b/tests/ioctl_sg_io_v3.test
deleted file mode 100755
index dacacdf..0000000
--- a/tests/ioctl_sg_io_v3.test
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/sh
-
-# Check decoding of ioctl SG_IO v3 commands.
-. "${srcdir=.}/ioctl.test"
diff --git a/tests/ioctl_sg_io_v4.c b/tests/ioctl_sg_io_v4.c
index 5f899ee..9c1e9fa 100644
--- a/tests/ioctl_sg_io_v4.c
+++ b/tests/ioctl_sg_io_v4.c
@@ -45,7 +45,7 @@
 	ioctl(-1, SG_IO, 0);
 	printf("ioctl(-1, SG_IO, NULL) = -1 EBADF (%m)\n");
 
-	struct sg_io_v4 *const sg_io = tail_alloc(sizeof(*sg_io));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct sg_io_v4, sg_io);
 	fill_memory(sg_io, sizeof(*sg_io));
 
 	const void *const efault = sg_io + 1;
@@ -55,7 +55,7 @@
 	ioctl(-1, SG_IO, sg_io);
 	printf("ioctl(-1, SG_IO, [%u]) = -1 EBADF (%m)\n", sg_io->guard);
 
-	unsigned int *const pguard = tail_alloc(sizeof(*pguard));
+	TAIL_ALLOC_OBJECT_CONST_PTR(unsigned int, pguard);
 	*pguard = (unsigned char) 'Q';
 	ioctl(-1, SG_IO, pguard);
 	printf("ioctl(-1, SG_IO, {guard='Q', %p}) = -1 EBADF (%m)\n", pguard + 1);
diff --git a/tests/ioctl_sg_io_v4.gen.test b/tests/ioctl_sg_io_v4.gen.test
new file mode 100755
index 0000000..575ad96
--- /dev/null
+++ b/tests/ioctl_sg_io_v4.gen.test
@@ -0,0 +1,3 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (ioctl_sg_io_v4 +ioctl.test); do not edit.
+. "${srcdir=.}/ioctl.test"
diff --git a/tests/ioctl_sg_io_v4.test b/tests/ioctl_sg_io_v4.test
deleted file mode 100755
index 2556722..0000000
--- a/tests/ioctl_sg_io_v4.test
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/sh
-
-# Check decoding of ioctl SG_IO v4 commands.
-. "${srcdir=.}/ioctl.test"
diff --git a/tests/ioctl_sock_gifconf.c b/tests/ioctl_sock_gifconf.c
index ae0bea4..f81faef 100644
--- a/tests/ioctl_sock_gifconf.c
+++ b/tests/ioctl_sock_gifconf.c
@@ -2,6 +2,7 @@
  * Check decoding of SIOCGIFCONF command of ioctl syscall.
  *
  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -134,7 +135,7 @@
 main(int argc, char *argv[])
 {
 	struct ifreq *ifr = tail_alloc(2 * sizeof(*ifr));
-	struct ifconf *ifc = tail_alloc(sizeof(*ifc));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct ifconf, ifc);
 
 	struct sockaddr_in addr;
 	int fd;
diff --git a/tests/ioctl_sock_gifconf.test b/tests/ioctl_sock_gifconf.test
index 2e2fc01..22d7ea4 100755
--- a/tests/ioctl_sock_gifconf.test
+++ b/tests/ioctl_sock_gifconf.test
@@ -4,9 +4,8 @@
 
 . "${srcdir=.}/init.sh"
 
+check_prog grep
 run_prog > /dev/null
 run_strace -a28 -s1 -eioctl $args > "$EXP"
-check_prog grep
 grep -v '^ioctl([012],' < "$LOG" > "$OUT"
 match_diff "$OUT" "$EXP"
-rm -f "$EXP" "$OUT"
diff --git a/tests/ioctl_uffdio.c b/tests/ioctl_uffdio.c
index 10b8b84..c98e4a0 100644
--- a/tests/ioctl_uffdio.c
+++ b/tests/ioctl_uffdio.c
@@ -1,6 +1,7 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
  * Copyright (c)      2016 Red Hat, Inc.
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -54,7 +55,7 @@
 		perror_msg_and_skip("userfaultfd");
 
 	/* ---- API ---- */
-	struct uffdio_api *api_struct = tail_alloc(sizeof(*api_struct));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct uffdio_api, api_struct);
 
 	/* With a bad fd */
 	memset(api_struct, 0, sizeof(*api_struct));
@@ -127,7 +128,7 @@
 	 * userfaultfd will cause us to stall.
 	 */
 	/* ---- COPY ---- */
-	struct uffdio_copy *copy_struct = tail_alloc(sizeof(*copy_struct));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct uffdio_copy, copy_struct);
 
 	memset(copy_struct, 0, sizeof(*copy_struct));
 	rc = ioctl(-1, UFFDIO_COPY, copy_struct);
@@ -148,7 +149,7 @@
 	       fd, area2, area1, pagesize, pagesize, rc);
 
 	/* ---- ZEROPAGE ---- */
-	struct uffdio_zeropage *zero_struct = tail_alloc(sizeof(*zero_struct));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct uffdio_zeropage, zero_struct);
 	madvise(area2, pagesize, MADV_DONTNEED);
 
 	memset(zero_struct, 0, sizeof(*zero_struct));
@@ -169,7 +170,7 @@
 	       fd, area2, pagesize, pagesize, rc);
 
 	/* ---- WAKE ---- */
-	struct uffdio_range *range_struct = tail_alloc(sizeof(*range_struct));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct uffdio_range, range_struct);
 	memset(range_struct, 0, sizeof(*range_struct));
 
 	rc = ioctl(-1, UFFDIO_WAKE, range_struct);
diff --git a/tests/ioctl_uffdio.gen.test b/tests/ioctl_uffdio.gen.test
new file mode 100755
index 0000000..80fd2a6
--- /dev/null
+++ b/tests/ioctl_uffdio.gen.test
@@ -0,0 +1,3 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (ioctl_uffdio +ioctl.test); do not edit.
+. "${srcdir=.}/ioctl.test"
diff --git a/tests/ioctl_uffdio.test b/tests/ioctl_uffdio.test
deleted file mode 100755
index fae9b55..0000000
--- a/tests/ioctl_uffdio.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check userfaultfd ioctl decoding.
-
-. "${srcdir=.}/ioctl.test"
diff --git a/tests/ioctl_v4l2.c b/tests/ioctl_v4l2.c
index af8c341..921e7a8 100644
--- a/tests/ioctl_v4l2.c
+++ b/tests/ioctl_v4l2.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -56,6 +57,272 @@
 
 static const unsigned int magic = 0xdeadbeef;
 
+static void
+init_v4l2_format(struct v4l2_format *const f,
+		 const unsigned int buf_type)
+{
+	memset(f, -1, sizeof(*f));
+	f->type = buf_type;
+	switch (buf_type) {
+	case V4L2_BUF_TYPE_VIDEO_CAPTURE:
+	case V4L2_BUF_TYPE_VIDEO_OUTPUT:
+		f->fmt.pix.width = 0x657b8160;
+		f->fmt.pix.height = 0x951c0047;
+		f->fmt.pix.pixelformat = magic;
+		f->fmt.pix.field = V4L2_FIELD_NONE;
+		f->fmt.pix.bytesperline = 0xdf20d185;
+		f->fmt.pix.sizeimage = 0x0cf7be41;
+		f->fmt.pix.colorspace = V4L2_COLORSPACE_JPEG;
+		break;
+#if HAVE_DECL_V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
+	case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
+	case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE: {
+		unsigned int i;
+
+		f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+		f->fmt.pix_mp.width = 0x1f3b774b;
+		f->fmt.pix_mp.height = 0xab96a8d6;
+		f->fmt.pix_mp.pixelformat = magic;
+		f->fmt.pix_mp.field = V4L2_FIELD_NONE;
+		f->fmt.pix_mp.colorspace = V4L2_COLORSPACE_JPEG;
+		struct v4l2_plane_pix_format* cur_pix =
+		       f->fmt.pix_mp.plane_fmt;
+		for (i = 0;
+		     i < ARRAY_SIZE(f->fmt.pix_mp.plane_fmt);
+		     i++) {
+			cur_pix[i].sizeimage = 0x1e3c531c | i;
+			cur_pix[i].bytesperline = 0xa983d721 | i;
+		}
+		break;
+	}
+#endif
+#if HAVE_DECL_V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY
+	case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
+#endif
+	case V4L2_BUF_TYPE_VIDEO_OVERLAY:
+		f->fmt.win.w.left = 0xe8373662;
+		f->fmt.win.w.top = 0x0336d283;
+		f->fmt.win.w.width = 0x9235fe72;
+		f->fmt.win.w.height = 0xbbd886c8;
+		f->fmt.win.field = V4L2_FIELD_ANY;
+		f->fmt.win.chromakey = 0xdb1f991f;
+		f->fmt.win.clipcount = 2;
+		f->fmt.win.clips =
+			tail_alloc(sizeof(*f->fmt.win.clips) *
+			f->fmt.win.clipcount);
+		f->fmt.win.clips[0].c.left = 0x3313d36e;
+		f->fmt.win.clips[0].c.top = 0xcdffe510;
+		f->fmt.win.clips[0].c.width = 0x2064f3a8;
+		f->fmt.win.clips[0].c.height = 0xd06d314a;
+		f->fmt.win.clips[1].c.left = 0xd8c8a83f;
+		f->fmt.win.clips[1].c.top = 0x336e87ba;
+		f->fmt.win.clips[1].c.width = 0x9e3a6fb3;
+		f->fmt.win.clips[1].c.height = 0x05617b76;
+
+		f->fmt.win.bitmap = (void*) -2UL;
+#if HAVE_STRUCT_V4L2_WINDOW_GLOBAL_ALPHA
+		f->fmt.win.global_alpha = 0xce;
+#endif
+		break;
+	case V4L2_BUF_TYPE_VBI_CAPTURE:
+	case V4L2_BUF_TYPE_VBI_OUTPUT:
+		f->fmt.vbi.sampling_rate = 0x3d9b5b79;
+		f->fmt.vbi.offset = 0x055b3a09;
+		f->fmt.vbi.samples_per_line = 0xf176d436;
+		f->fmt.vbi.sample_format = magic;
+		f->fmt.vbi.start[0] = 0x9858e2eb;
+		f->fmt.vbi.start[1] = 0x8a4dc8c1;
+		f->fmt.vbi.count[0] = 0x4bcf36a3;
+		f->fmt.vbi.count[1] = 0x97dff65f;
+		f->fmt.vbi.flags = V4L2_VBI_INTERLACED;
+		break;
+#if HAVE_DECL_V4L2_BUF_TYPE_SLICED_VBI_CAPTURE
+	case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
+	case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT: {
+		unsigned int i;
+
+		f->fmt.sliced.service_set = V4L2_SLICED_VPS;
+		f->fmt.sliced.io_size = 0xd897925a;
+		for (i = 0;
+		     i < ARRAY_SIZE(f->fmt.sliced.service_lines[0]);
+		     i++) {
+			f->fmt.sliced.service_lines[0][i] = 0xc38e | i;
+			f->fmt.sliced.service_lines[1][i] = 0x3abb | i;
+		}
+		break;
+	}
+#endif
+#if HAVE_DECL_V4L2_BUF_TYPE_SDR_OUTPUT
+	case V4L2_BUF_TYPE_SDR_OUTPUT:
+#endif
+#if HAVE_DECL_V4L2_BUF_TYPE_SDR_CAPTURE
+	case V4L2_BUF_TYPE_SDR_CAPTURE:
+		f->fmt.sdr.pixelformat = magic;
+#if HAVE_STRUCT_V4L2_SDR_FORMAT_BUFFERSIZE
+		f->fmt.sdr.buffersize = 0x25afabfb;
+#endif
+		break;
+#endif
+	}
+}
+
+static void
+dprint_ioctl_v4l2(struct v4l2_format *const f,
+		  const char* request, const unsigned int buf_type,
+		  const char* buf_type_string)
+{
+	switch (buf_type) {
+	case V4L2_BUF_TYPE_VIDEO_CAPTURE:
+	case V4L2_BUF_TYPE_VIDEO_OUTPUT:
+		printf("ioctl(-1, %s, {type=%s"
+		       ", fmt.pix={width=%u, height=%u, pixelformat="
+		       "v4l2_fourcc('\\x%x', '\\x%x', '\\x%x', '\\x%x')"
+		       ", field=V4L2_FIELD_NONE, bytesperline=%u, sizeimage=%u"
+		       ", colorspace=V4L2_COLORSPACE_JPEG}}) = -1 EBADF (%m)\n",
+		       request,
+		       buf_type_string,
+		       f->fmt.pix.width, f->fmt.pix.height,
+		       cc0(magic), cc1(magic), cc2(magic), cc3(magic),
+		       f->fmt.pix.bytesperline,
+		       f->fmt.pix.sizeimage);
+		break;
+#if HAVE_DECL_V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
+	case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
+	case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE: {
+		unsigned int i;
+
+		printf("ioctl(-1, %s"
+		       ", {type=%s"
+		       ", fmt.pix_mp={width=%u, height=%u, pixelformat="
+		       "v4l2_fourcc('\\x%x', '\\x%x', '\\x%x', '\\x%x')"
+		       ", field=V4L2_FIELD_NONE, colorspace="
+		       "V4L2_COLORSPACE_JPEG, plane_fmt=[",
+		       request,
+		       buf_type_string,
+		       f->fmt.pix_mp.width, f->fmt.pix_mp.height,
+		       cc0(magic), cc1(magic), cc2(magic), cc3(magic));
+		for (i = 0;
+		     i < ARRAY_SIZE(f->fmt.pix_mp.plane_fmt);
+		     ++i) {
+			if (i)
+				printf(", ");
+			printf("{sizeimage=%u, bytesperline=%u}",
+			f->fmt.pix_mp.plane_fmt[i].sizeimage,
+			f->fmt.pix_mp.plane_fmt[i].bytesperline);
+		}
+		printf("], num_planes=%u}}) = -1 EBADF (%m)\n",
+		f->fmt.pix_mp.num_planes);
+		break;
+	}
+#endif
+#if HAVE_DECL_V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY
+	case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
+#endif
+	case V4L2_BUF_TYPE_VIDEO_OVERLAY:
+		printf("ioctl(-1, %s, {type=%s"
+		       ", fmt.win={left=%d, top=%d, width=%u, height=%u"
+		       ", field=V4L2_FIELD_ANY, chromakey=%#x, clips="
+		       "[{left=%d, top=%d, width=%u, height=%u}, "
+		       "{left=%d, top=%d, width=%u, height=%u}]"
+		       ", clipcount=%u, bitmap=%p"
+#if HAVE_STRUCT_V4L2_WINDOW_GLOBAL_ALPHA
+		       ", global_alpha=%#x"
+#endif
+		       "}}) = -1 EBADF (%m)\n",
+		       request,
+		       buf_type_string,
+		       f->fmt.win.w.left, f->fmt.win.w.top,
+		       f->fmt.win.w.width, f->fmt.win.w.height,
+		       f->fmt.win.chromakey,
+		       f->fmt.win.clips[0].c.left,
+		       f->fmt.win.clips[0].c.top,
+		       f->fmt.win.clips[0].c.width,
+		       f->fmt.win.clips[0].c.height,
+		       f->fmt.win.clips[1].c.left,
+		       f->fmt.win.clips[1].c.top,
+		       f->fmt.win.clips[1].c.width,
+		       f->fmt.win.clips[1].c.height,
+		       f->fmt.win.clipcount, f->fmt.win.bitmap
+#if HAVE_STRUCT_V4L2_WINDOW_GLOBAL_ALPHA
+		       , f->fmt.win.global_alpha
+#endif
+		       );
+		break;
+	case V4L2_BUF_TYPE_VBI_CAPTURE:
+	case V4L2_BUF_TYPE_VBI_OUTPUT:
+		printf("ioctl(-1, %s, {type=%s"
+		       ", fmt.vbi={sampling_rate=%u, offset=%u"
+		       ", samples_per_line=%u, sample_format="
+		       "v4l2_fourcc('\\x%x', '\\x%x', '\\x%x', '\\x%x')"
+		       ", start=[%u, %u], count=[%u, %u]"
+		       ", flags=V4L2_VBI_INTERLACED}})"
+		       " = -1 EBADF (%m)\n",
+		       request,
+		       buf_type_string,
+		       f->fmt.vbi.sampling_rate, f->fmt.vbi.offset,
+		       f->fmt.vbi.samples_per_line,
+		       cc0(magic), cc1(magic), cc2(magic), cc3(magic),
+		       f->fmt.vbi.start[0], f->fmt.vbi.start[1],
+		       f->fmt.vbi.count[0], f->fmt.vbi.count[1]);
+		break;
+#if HAVE_DECL_V4L2_BUF_TYPE_SLICED_VBI_CAPTURE
+	case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
+	case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT: {
+		unsigned int i, j;
+
+		printf("ioctl(-1, %s, {type=%s"
+		       ", fmt.sliced={service_set=V4L2_SLICED_VPS"
+		       ", io_size=%u, service_lines=[",
+		       request,
+		       buf_type_string,
+		       f->fmt.sliced.io_size);
+		for (i = 0;
+		     i < ARRAY_SIZE(f->fmt.sliced.service_lines);
+		     i++) {
+			if (i > 0)
+				printf(", ");
+			printf("[");
+			for (j = 0;
+			     j < ARRAY_SIZE(f->fmt.sliced.service_lines[0]);
+			     j++) {
+				if (j > 0)
+					printf(", ");
+				printf("%#x",
+				       f->fmt.sliced.service_lines[i][j]);
+			}
+			printf("]");
+		}
+		printf("]}}) = -1 EBADF (%m)\n");
+		break;
+	}
+#endif
+#if HAVE_DECL_V4L2_BUF_TYPE_SDR_OUTPUT
+	case V4L2_BUF_TYPE_SDR_OUTPUT:
+#endif
+#if HAVE_DECL_V4L2_BUF_TYPE_SDR_CAPTURE
+	case V4L2_BUF_TYPE_SDR_CAPTURE:
+		printf("ioctl(-1, %s, {type=%s"
+		       ", fmt.sdr={pixelformat=v4l2_fourcc('\\x%x', '\\x%x',"
+		       " '\\x%x', '\\x%x')"
+#if HAVE_STRUCT_V4L2_SDR_FORMAT_BUFFERSIZE
+		       ", buffersize=%u"
+#endif
+		       "}}) = -1 EBADF (%m)\n",
+		       request,
+		       buf_type_string,
+		       cc0(magic), cc1(magic), cc2(magic), cc3(magic)
+#if HAVE_STRUCT_V4L2_SDR_FORMAT_BUFFERSIZE
+		       , f->fmt.sdr.buffersize
+#endif
+		       );
+		break;
+#endif
+	}
+}
+#define print_ioctl_v4l2(v4l2_format, request, buf_type) do { \
+	dprint_ioctl_v4l2((v4l2_format), (request), (buf_type), #buf_type); \
+} while (0)
+
 int
 main(void )
 {
@@ -76,7 +343,7 @@
 	ioctl(-1, VIDIOC_ENUM_FMT, 0);
 	printf("ioctl(-1, VIDIOC_ENUM_FMT, NULL) = -1 EBADF (%m)\n");
 
-	struct v4l2_fmtdesc *const p_fmtdesc = tail_alloc(sizeof(*p_fmtdesc));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct v4l2_fmtdesc, p_fmtdesc);
 	p_fmtdesc->index = magic;
 	p_fmtdesc->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 	ioctl(-1, VIDIOC_ENUM_FMT, p_fmtdesc);
@@ -88,78 +355,146 @@
 	ioctl(-1, VIDIOC_G_FMT, 0);
 	printf("ioctl(-1, VIDIOC_G_FMT, NULL) = -1 EBADF (%m)\n");
 
-	struct v4l2_format *const p_format = tail_alloc(sizeof(*p_format));
-	p_format->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct v4l2_format, p_format);
 
+	p_format->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 	ioctl(-1, VIDIOC_G_FMT, p_format);
 	printf("ioctl(-1, VIDIOC_G_FMT"
 	       ", {type=V4L2_BUF_TYPE_VIDEO_CAPTURE}) = -1 EBADF (%m)\n");
+#if HAVE_DECL_V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
+	p_format->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+	ioctl(-1, VIDIOC_G_FMT, p_format);
+	printf("ioctl(-1, VIDIOC_G_FMT"
+	       ", {type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE}) ="
+	       " -1 EBADF (%m)\n");
+#endif
+#if HAVE_DECL_V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY
+	p_format->type = V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY;
+	ioctl(-1, VIDIOC_G_FMT, p_format);
+	printf("ioctl(-1, VIDIOC_G_FMT"
+	       ", {type=V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY}) ="
+	       " -1 EBADF (%m)\n");
+#endif
+	p_format->type = V4L2_BUF_TYPE_VIDEO_OVERLAY;
+	ioctl(-1, VIDIOC_G_FMT, p_format);
+	printf("ioctl(-1, VIDIOC_G_FMT"
+	       ", {type=V4L2_BUF_TYPE_VIDEO_OVERLAY}) ="
+	       " -1 EBADF (%m)\n");
 
+	p_format->type = V4L2_BUF_TYPE_VBI_CAPTURE;
+	ioctl(-1, VIDIOC_G_FMT, p_format);
+	printf("ioctl(-1, VIDIOC_G_FMT"
+	       ", {type=V4L2_BUF_TYPE_VBI_CAPTURE}) = -1 EBADF (%m)\n");
+#if HAVE_DECL_V4L2_BUF_TYPE_SLICED_VBI_CAPTURE
+	p_format->type = V4L2_BUF_TYPE_SLICED_VBI_CAPTURE;
+	ioctl(-1, VIDIOC_G_FMT, p_format);
+	printf("ioctl(-1, VIDIOC_G_FMT"
+	       ", {type=V4L2_BUF_TYPE_SLICED_VBI_CAPTURE}) = -1 EBADF (%m)\n");
+#endif
+#if HAVE_DECL_V4L2_BUF_TYPE_SDR_CAPTURE
+	p_format->type = V4L2_BUF_TYPE_SDR_CAPTURE;
+	ioctl(-1, VIDIOC_G_FMT, p_format);
+	printf("ioctl(-1, VIDIOC_G_FMT"
+	       ", {type=V4L2_BUF_TYPE_SDR_CAPTURE}) = -1 EBADF (%m)\n");
+#endif
+#if HAVE_DECL_V4L2_BUF_TYPE_SDR_OUTPUT
+	p_format->type = V4L2_BUF_TYPE_SDR_OUTPUT;
+	ioctl(-1, VIDIOC_G_FMT, p_format);
+	printf("ioctl(-1, VIDIOC_G_FMT"
+	       ", {type=V4L2_BUF_TYPE_SDR_OUTPUT}) = -1 EBADF (%m)\n");
+#endif
 	/* VIDIOC_S_FMT */
 	ioctl(-1, VIDIOC_S_FMT, 0);
 	printf("ioctl(-1, VIDIOC_S_FMT, NULL) = -1 EBADF (%m)\n");
 
-	p_format->type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
-	p_format->fmt.pix.width = 0xdad1beaf;
-	p_format->fmt.pix.height = 0xdad2beaf;
-	p_format->fmt.pix.pixelformat = magic;
-	p_format->fmt.pix.field = V4L2_FIELD_NONE;
-	p_format->fmt.pix.bytesperline = 0xdad3beaf;
-	p_format->fmt.pix.sizeimage = 0xdad4beaf;
-	p_format->fmt.pix.colorspace = V4L2_COLORSPACE_JPEG;
-
+	init_v4l2_format(p_format, V4L2_BUF_TYPE_VIDEO_OUTPUT);
 	ioctl(-1, VIDIOC_S_FMT, p_format);
-	printf("ioctl(-1, VIDIOC_S_FMT, {type=V4L2_BUF_TYPE_VIDEO_OUTPUT"
-	       ", fmt.pix={width=%u, height=%u, pixelformat="
-	       "v4l2_fourcc('\\x%x', '\\x%x', '\\x%x', '\\x%x')"
-	       ", field=V4L2_FIELD_NONE, bytesperline=%u, sizeimage=%u"
-	       ", colorspace=V4L2_COLORSPACE_JPEG}}) = -1 EBADF (%m)\n",
-	       p_format->fmt.pix.width, p_format->fmt.pix.height,
-	       cc0(magic), cc1(magic), cc2(magic), cc3(magic),
-	       p_format->fmt.pix.bytesperline, p_format->fmt.pix.sizeimage);
+	print_ioctl_v4l2(p_format, "VIDIOC_S_FMT", V4L2_BUF_TYPE_VIDEO_OUTPUT);
+#if HAVE_DECL_V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
+	init_v4l2_format(p_format, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
+	ioctl(-1, VIDIOC_S_FMT, p_format);
+	print_ioctl_v4l2(p_format, "VIDIOC_S_FMT",
+			 V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
+#endif
+#if HAVE_DECL_V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY
+	init_v4l2_format(p_format, V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY);
+	ioctl(-1, VIDIOC_S_FMT, p_format);
+	print_ioctl_v4l2(p_format, "VIDIOC_S_FMT",
+			 V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY);
+#endif
+	init_v4l2_format(p_format, V4L2_BUF_TYPE_VIDEO_OVERLAY);
+	ioctl(-1, VIDIOC_S_FMT, p_format);
+	print_ioctl_v4l2(p_format, "VIDIOC_S_FMT",
+			 V4L2_BUF_TYPE_VIDEO_OVERLAY);
 
+	init_v4l2_format(p_format, V4L2_BUF_TYPE_VBI_CAPTURE);
+	ioctl(-1, VIDIOC_S_FMT, p_format);
+	print_ioctl_v4l2(p_format, "VIDIOC_S_FMT", V4L2_BUF_TYPE_VBI_CAPTURE);
+#if HAVE_DECL_V4L2_BUF_TYPE_SLICED_VBI_CAPTURE
+	init_v4l2_format(p_format, V4L2_BUF_TYPE_SLICED_VBI_CAPTURE);
+	ioctl(-1, VIDIOC_S_FMT, p_format);
+	print_ioctl_v4l2(p_format, "VIDIOC_S_FMT",
+			 V4L2_BUF_TYPE_SLICED_VBI_CAPTURE);
+#endif
+#if HAVE_DECL_V4L2_BUF_TYPE_SDR_CAPTURE
+	init_v4l2_format(p_format, V4L2_BUF_TYPE_SDR_CAPTURE);
+	ioctl(-1, VIDIOC_S_FMT, p_format);
+	print_ioctl_v4l2(p_format, "VIDIOC_S_FMT", V4L2_BUF_TYPE_SDR_CAPTURE);
+#endif
+#if HAVE_DECL_V4L2_BUF_TYPE_SDR_OUTPUT
+	init_v4l2_format(p_format, V4L2_BUF_TYPE_SDR_OUTPUT);
+	ioctl(-1, VIDIOC_S_FMT, p_format);
+	print_ioctl_v4l2(p_format, "VIDIOC_S_FMT", V4L2_BUF_TYPE_SDR_OUTPUT);
+#endif
 	/* VIDIOC_TRY_FMT */
 	ioctl(-1, VIDIOC_TRY_FMT, 0);
 	printf("ioctl(-1, VIDIOC_TRY_FMT, NULL) = -1 EBADF (%m)\n");
 
-#if HAVE_DECL_V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
-	memset(p_format, -1, sizeof(*p_format));
-	p_format->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-	p_format->fmt.pix_mp.width = 0xdad1beaf;
-	p_format->fmt.pix_mp.height = 0xdad2beaf;
-	p_format->fmt.pix_mp.pixelformat = magic;
-	p_format->fmt.pix_mp.field = V4L2_FIELD_NONE;
-	p_format->fmt.pix_mp.colorspace = V4L2_COLORSPACE_JPEG;
-	unsigned int i;
-	for (i = 0; i < ARRAY_SIZE(p_format->fmt.pix_mp.plane_fmt); ++i) {
-		p_format->fmt.pix_mp.plane_fmt[i].sizeimage = 0xbadc0de0 | i;
-		p_format->fmt.pix_mp.plane_fmt[i].bytesperline = 0xdadbeaf0 | i;
-	}
+	init_v4l2_format(p_format, V4L2_BUF_TYPE_VIDEO_OUTPUT);
 	ioctl(-1, VIDIOC_TRY_FMT, p_format);
-	printf("ioctl(-1, VIDIOC_TRY_FMT"
-	       ", {type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE"
-	       ", fmt.pix_mp={width=%u, height=%u, pixelformat="
-	       "v4l2_fourcc('\\x%x', '\\x%x', '\\x%x', '\\x%x')"
-	       ", field=V4L2_FIELD_NONE, colorspace=V4L2_COLORSPACE_JPEG"
-	       ", plane_fmt=[",
-	       p_format->fmt.pix_mp.width, p_format->fmt.pix_mp.height,
-	       cc0(magic), cc1(magic), cc2(magic), cc3(magic));
-	for (i = 0; i < ARRAY_SIZE(p_format->fmt.pix_mp.plane_fmt); ++i) {
-		if (i)
-			printf(", ");
-		printf("{sizeimage=%u, bytesperline=%u}",
-		       p_format->fmt.pix_mp.plane_fmt[i].sizeimage,
-		       p_format->fmt.pix_mp.plane_fmt[i].bytesperline);
-	}
-	printf("], num_planes=%u}}) = -1 EBADF (%m)\n",
-	       p_format->fmt.pix_mp.num_planes);
-#else
+	print_ioctl_v4l2(p_format, "VIDIOC_TRY_FMT",
+			 V4L2_BUF_TYPE_VIDEO_OUTPUT);
+#if HAVE_DECL_V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
+	init_v4l2_format(p_format, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
+	ioctl(-1, VIDIOC_TRY_FMT, p_format);
+	print_ioctl_v4l2(p_format, "VIDIOC_TRY_FMT",
+			 V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
+#endif
+#if HAVE_DECL_V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY
+	init_v4l2_format(p_format, V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY);
+	ioctl(-1, VIDIOC_TRY_FMT, p_format);
+	print_ioctl_v4l2(p_format, "VIDIOC_TRY_FMT",
+			 V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY);
+#endif
+	init_v4l2_format(p_format, V4L2_BUF_TYPE_VIDEO_OVERLAY);
+	ioctl(-1, VIDIOC_TRY_FMT, p_format);
+	print_ioctl_v4l2(p_format, "VIDIOC_TRY_FMT",
+			 V4L2_BUF_TYPE_VIDEO_OVERLAY);
+
+	init_v4l2_format(p_format, V4L2_BUF_TYPE_VBI_CAPTURE);
+	ioctl(-1, VIDIOC_TRY_FMT, p_format);
+	print_ioctl_v4l2(p_format, "VIDIOC_TRY_FMT", V4L2_BUF_TYPE_VBI_CAPTURE);
+#if HAVE_DECL_V4L2_BUF_TYPE_SLICED_VBI_CAPTURE
+	init_v4l2_format(p_format, V4L2_BUF_TYPE_SLICED_VBI_CAPTURE);
+	ioctl(-1, VIDIOC_TRY_FMT, p_format);
+	print_ioctl_v4l2(p_format, "VIDIOC_TRY_FMT",
+			 V4L2_BUF_TYPE_SLICED_VBI_CAPTURE);
+#endif
+#if HAVE_DECL_V4L2_BUF_TYPE_SDR_CAPTURE
+	init_v4l2_format(p_format, V4L2_BUF_TYPE_SDR_CAPTURE);
+	ioctl(-1, VIDIOC_TRY_FMT, p_format);
+	print_ioctl_v4l2(p_format, "VIDIOC_TRY_FMT", V4L2_BUF_TYPE_SDR_CAPTURE);
+#endif
+#if HAVE_DECL_V4L2_BUF_TYPE_SDR_OUTPUT
+	init_v4l2_format(p_format, V4L2_BUF_TYPE_SDR_OUTPUT);
+	ioctl(-1, VIDIOC_TRY_FMT, p_format);
+	print_ioctl_v4l2(p_format, "VIDIOC_TRY_FMT", V4L2_BUF_TYPE_SDR_OUTPUT);
+#endif
 	struct v4l2_format *const p_v4l2_format =
 		page + size - sizeof(*p_v4l2_format);
 	ioctl(-1, VIDIOC_TRY_FMT, p_v4l2_format);
 	printf("ioctl(-1, VIDIOC_TRY_FMT, {type=%#x /* V4L2_BUF_TYPE_??? */})"
 	       " = -1 EBADF (%m)\n", p_v4l2_format->type);
-#endif
 
 	/* VIDIOC_REQBUFS */
 	ioctl(-1, VIDIOC_REQBUFS, 0);
@@ -259,8 +594,7 @@
 	printf("ioctl(-1, VIDIOC_S_PARM, {type=%#x /* V4L2_BUF_TYPE_??? */})"
 	       " = -1 EBADF (%m)\n", p_v4l2_streamparm->type);
 
-	struct v4l2_streamparm *const p_streamparm =
-		tail_alloc(sizeof(*p_streamparm));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct v4l2_streamparm, p_streamparm);
 	p_streamparm->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 	p_streamparm->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
 	p_streamparm->parm.capture.capturemode = V4L2_MODE_HIGHQUALITY;
@@ -339,6 +673,42 @@
 	       ", value=%d}) = -1 EBADF (%m)\n",
 	       p_v4l2_control->id, p_v4l2_control->value);
 
+	/* VIDIOC_G_TUNER */
+	ioctl(-1, VIDIOC_G_TUNER, 0);
+	printf("ioctl(-1, VIDIOC_G_TUNER, NULL) = -1 EBADF (%m)\n");
+
+	struct v4l2_tuner *const p_v4l2_tuner =
+		page + size - sizeof(*p_v4l2_tuner);
+	ioctl(-1, VIDIOC_G_TUNER, p_v4l2_tuner);
+	printf("ioctl(-1, VIDIOC_G_TUNER, {index=%u})"
+	       " = -1 EBADF (%m)\n", p_v4l2_tuner->index);
+
+	/* VIDIOC_S_TUNER */
+	ioctl(-1, VIDIOC_S_TUNER, 0);
+	printf("ioctl(-1, VIDIOC_S_TUNER, NULL) = -1 EBADF (%m)\n");
+
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct v4l2_tuner, p_tuner);
+	p_tuner->index = 0x4fb6df39;
+	strcpy((char*)p_tuner->name, "cum tacent clamant");
+	p_tuner->type = V4L2_TUNER_RADIO;
+	p_tuner->capability = V4L2_TUNER_CAP_LOW;
+	p_tuner->rangelow = 0xa673bc29;
+	p_tuner->rangehigh = 0xbaf16d12;
+	p_tuner->rxsubchans = V4L2_TUNER_SUB_MONO;
+	p_tuner->audmode = V4L2_TUNER_MODE_MONO;
+	p_tuner->signal = 0x10bf92c8;
+	p_tuner->afc = 0x3bf7e18b;
+	ioctl(-1, VIDIOC_S_TUNER, p_tuner);
+	printf("ioctl(-1, VIDIOC_S_TUNER, {index=%u"
+	       ", name=\"cum tacent clamant\""
+	       ", type=V4L2_TUNER_RADIO, capability=V4L2_TUNER_CAP_LOW"
+	       ", rangelow=%u, rangehigh=%u"
+	       ", rxsubchans=V4L2_TUNER_SUB_MONO"
+	       ", audmode=V4L2_TUNER_MODE_MONO, signal=%d, afc=%d"
+	       "}) = -1 EBADF (%m)\n",
+	       p_tuner->index, p_tuner->rangelow,
+	       p_tuner->rangehigh, p_tuner->signal, p_tuner->afc);
+
 	/* VIDIOC_QUERYCTRL */
 	ioctl(-1, VIDIOC_QUERYCTRL, 0);
 	printf("ioctl(-1, VIDIOC_QUERYCTRL, NULL) = -1 EBADF (%m)\n");
@@ -355,8 +725,7 @@
 	       " = -1 EBADF (%m)\n", p_v4l2_queryctrl->id);
 # endif
 
-	struct v4l2_queryctrl *const p_queryctrl =
-		tail_alloc(sizeof(*p_queryctrl));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct v4l2_queryctrl, p_queryctrl);
 	p_queryctrl->id = V4L2_CID_SATURATION;
 	ioctl(-1, VIDIOC_QUERYCTRL, p_queryctrl);
 	printf("ioctl(-1, VIDIOC_QUERYCTRL, {id=V4L2_CID_SATURATION})"
@@ -414,8 +783,7 @@
 	ioctl(-1, VIDIOC_S_EXT_CTRLS, 0);
 	printf("ioctl(-1, VIDIOC_S_EXT_CTRLS, NULL) = -1 EBADF (%m)\n");
 
-	struct v4l2_ext_controls *const p_ext_controls =
-		tail_alloc(sizeof(*p_ext_controls));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct v4l2_ext_controls, p_ext_controls);
 	p_ext_controls->ctrl_class = V4L2_CTRL_CLASS_USER;
 	p_ext_controls->count = 0;
 	p_ext_controls->controls = (void *) -2UL;
@@ -500,8 +868,7 @@
 	ioctl(-1, VIDIOC_ENUM_FRAMESIZES, 0);
 	printf("ioctl(-1, VIDIOC_ENUM_FRAMESIZES, NULL) = -1 EBADF (%m)\n");
 
-	struct v4l2_frmsizeenum *const p_frmsizeenum =
-		tail_alloc(sizeof(*p_frmsizeenum));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct v4l2_frmsizeenum, p_frmsizeenum);
 	p_frmsizeenum->index = magic;
 	p_frmsizeenum->pixel_format = fourcc(cc[0], cc[1], cc[2], cc[3]);
 
diff --git a/tests/ioctl_v4l2.gen.test b/tests/ioctl_v4l2.gen.test
new file mode 100755
index 0000000..cbd36ba
--- /dev/null
+++ b/tests/ioctl_v4l2.gen.test
@@ -0,0 +1,3 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (ioctl_v4l2 +ioctl.test); do not edit.
+. "${srcdir=.}/ioctl.test"
diff --git a/tests/ioctl_v4l2.test b/tests/ioctl_v4l2.test
deleted file mode 100755
index a092a3c..0000000
--- a/tests/ioctl_v4l2.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check basic VIDIOC_* ioctl decoding.
-
-. "${srcdir=.}/ioctl.test"
diff --git a/tests/ioperm.gen.test b/tests/ioperm.gen.test
new file mode 100755
index 0000000..154d60a
--- /dev/null
+++ b/tests/ioperm.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (ioperm -a27); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a27
diff --git a/tests/ioperm.test b/tests/ioperm.test
deleted file mode 100755
index 8c1c1cc..0000000
--- a/tests/ioperm.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check ioperm syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a27
diff --git a/tests/iopl.gen.test b/tests/iopl.gen.test
new file mode 100755
index 0000000..3d9704c
--- /dev/null
+++ b/tests/iopl.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (iopl -a8); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a8
diff --git a/tests/iopl.test b/tests/iopl.test
deleted file mode 100755
index d0b5b11..0000000
--- a/tests/iopl.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check iopl syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a8
diff --git a/tests/ioprio.gen.test b/tests/ioprio.gen.test
new file mode 100755
index 0000000..f43f78e
--- /dev/null
+++ b/tests/ioprio.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (ioprio -a18 -e trace=ioprio_get,ioprio_set); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a18 -e trace=ioprio_get,ioprio_set
diff --git a/tests/ioprio.test b/tests/ioprio.test
deleted file mode 100755
index e79310b..0000000
--- a/tests/ioprio.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check iprio_get and iprio_set syscalls decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a18 -e trace=ioprio_get,ioprio_set
diff --git a/tests/ip_mreq.c b/tests/ip_mreq.c
index fa0c504..4bcda09 100644
--- a/tests/ip_mreq.c
+++ b/tests/ip_mreq.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -44,8 +45,8 @@
 	static const char multi6addr[] = "ff01::c";
 	static const char interface[] = "127.0.0.1";
 
-	struct ip_mreq *const m4 = tail_alloc(sizeof(*m4));
-	struct ipv6_mreq *const m6 = tail_alloc(sizeof(*m6));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct ip_mreq, m4);
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct ipv6_mreq, m6);
 	unsigned int i;
 	int rc;
 
diff --git a/tests/ip_mreq.gen.test b/tests/ip_mreq.gen.test
new file mode 100755
index 0000000..990387a
--- /dev/null
+++ b/tests/ip_mreq.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (ip_mreq -e trace=setsockopt); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -e trace=setsockopt
diff --git a/tests/ip_mreq.test b/tests/ip_mreq.test
deleted file mode 100755
index d0a9e0f..0000000
--- a/tests/ip_mreq.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check {IP,IPV6}_{ADD,DROP}_MEMBERSHIP setsockopt decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -e trace=setsockopt
diff --git a/tests/ipc.gen.test b/tests/ipc.gen.test
new file mode 100755
index 0000000..5ed1f0d
--- /dev/null
+++ b/tests/ipc.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (ipc -a19); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a19
diff --git a/tests/ipc.sh b/tests/ipc.sh
index 752d4bb..5943c1a 100644
--- a/tests/ipc.sh
+++ b/tests/ipc.sh
@@ -5,9 +5,7 @@
 . "${srcdir=.}/init.sh"
 
 run_prog > /dev/null
-run_strace -eipc $args > "$OUT"
-match_grep "$LOG" "$OUT"
-
-rm -f "$OUT"
+run_strace -eipc $args > "$EXP"
+match_grep "$LOG" "$EXP"
 
 exit 0
diff --git a/tests/ipc.test b/tests/ipc.test
deleted file mode 100755
index aa33fa6..0000000
--- a/tests/ipc.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of ipc syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a19
diff --git a/tests/ipc_msg.gen.test b/tests/ipc_msg.gen.test
new file mode 100755
index 0000000..f4fec80
--- /dev/null
+++ b/tests/ipc_msg.gen.test
@@ -0,0 +1,3 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (ipc_msg +ipc.sh); do not edit.
+. "${srcdir=.}/ipc.sh"
diff --git a/tests/ipc_msg.test b/tests/ipc_msg.test
deleted file mode 100755
index 177495b..0000000
--- a/tests/ipc_msg.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check decoding of ipc msgget/msgctl syscalls
-
-. "${srcdir=.}/ipc.sh"
diff --git a/tests/ipc_sem.c b/tests/ipc_sem.c
index 8f6382c..0b730c1 100644
--- a/tests/ipc_sem.c
+++ b/tests/ipc_sem.c
@@ -1,6 +1,7 @@
 /*
  * Copyright (c) 2015 Andreas Schwab <[email protected]>
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff --git a/tests/ipc_sem.gen.test b/tests/ipc_sem.gen.test
new file mode 100755
index 0000000..54159a6
--- /dev/null
+++ b/tests/ipc_sem.gen.test
@@ -0,0 +1,3 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (ipc_sem +ipc.sh); do not edit.
+. "${srcdir=.}/ipc.sh"
diff --git a/tests/ipc_sem.test b/tests/ipc_sem.test
deleted file mode 100755
index cc93d07..0000000
--- a/tests/ipc_sem.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check decoding of ipc semget/semctl syscalls
-
-. "${srcdir=.}/ipc.sh"
diff --git a/tests/ipc_shm.gen.test b/tests/ipc_shm.gen.test
new file mode 100755
index 0000000..505eaba
--- /dev/null
+++ b/tests/ipc_shm.gen.test
@@ -0,0 +1,3 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (ipc_shm +ipc.sh); do not edit.
+. "${srcdir=.}/ipc.sh"
diff --git a/tests/ipc_shm.test b/tests/ipc_shm.test
deleted file mode 100755
index a67ea29..0000000
--- a/tests/ipc_shm.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check decoding of ipc shmget/shmctl syscalls
-
-. "${srcdir=.}/ipc.sh"
diff --git a/tests/kcmp.gen.test b/tests/kcmp.gen.test
new file mode 100755
index 0000000..da79d7c
--- /dev/null
+++ b/tests/kcmp.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (kcmp -a27); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a27
diff --git a/tests/kcmp.test b/tests/kcmp.test
deleted file mode 100755
index d022aeb..0000000
--- a/tests/kcmp.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of kcmp syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a27
diff --git a/tests/kexec_file_load.c b/tests/kexec_file_load.c
index be90a37..c939e4f 100644
--- a/tests/kexec_file_load.c
+++ b/tests/kexec_file_load.c
@@ -2,6 +2,7 @@
  * Check decoding of kexec_file_load syscall.
  *
  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff --git a/tests/kexec_file_load.gen.test b/tests/kexec_file_load.gen.test
new file mode 100755
index 0000000..aefaab3
--- /dev/null
+++ b/tests/kexec_file_load.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (kexec_file_load -s9); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -s9
diff --git a/tests/kexec_file_load.test b/tests/kexec_file_load.test
deleted file mode 100755
index c95e123..0000000
--- a/tests/kexec_file_load.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of kexec_file_load syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -s9
diff --git a/tests/kexec_load.c b/tests/kexec_load.c
index 330238d..2a6b441 100644
--- a/tests/kexec_load.c
+++ b/tests/kexec_load.c
@@ -2,6 +2,7 @@
  * Check decoding of kexec_load syscall.
  *
  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -62,8 +63,7 @@
 	};
 
 	static const kernel_ulong_t bogus_zero =
-		sizeof(long) < sizeof(kernel_long_t) ?
-			(kernel_ulong_t) 0xffffffff00000000ULL : 0;
+		sizeof(long) < sizeof(kernel_long_t) ? F8ILL_KULONG_MASK : 0;
 	static const kernel_ulong_t bogus_entry =
 		(kernel_ulong_t) 0xdeadca57badda7a1ULL;
 	static const kernel_ulong_t bogus_nsegs =
diff --git a/tests/kexec_load.gen.test b/tests/kexec_load.gen.test
new file mode 100755
index 0000000..0af9527
--- /dev/null
+++ b/tests/kexec_load.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (kexec_load -s9); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -s9
diff --git a/tests/kexec_load.test b/tests/kexec_load.test
deleted file mode 100755
index 4b1511e..0000000
--- a/tests/kexec_load.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of kexec_load syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -s9
diff --git a/tests/keyctl.gen.test b/tests/keyctl.gen.test
new file mode 100755
index 0000000..82afad9
--- /dev/null
+++ b/tests/keyctl.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (keyctl -a31 -s10); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a31 -s10
diff --git a/tests/keyctl.test b/tests/keyctl.test
deleted file mode 100755
index 875a82d..0000000
--- a/tests/keyctl.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of keyctl syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a31 -s10
diff --git a/tests/kill.gen.test b/tests/kill.gen.test
new file mode 100755
index 0000000..08a004e
--- /dev/null
+++ b/tests/kill.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (kill -a12 -esignal=none); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a12 -esignal=none
diff --git a/tests/kill.test b/tests/kill.test
deleted file mode 100755
index 7a3a51a..0000000
--- a/tests/kill.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of kill syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a12 -esignal=none
diff --git a/tests/ksysent.c b/tests/ksysent.c
index 8cac93c..f598664 100644
--- a/tests/ksysent.c
+++ b/tests/ksysent.c
@@ -2,6 +2,7 @@
  * Validate syscallent.h file.
  *
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -40,6 +41,13 @@
 #define TP 0
 #define TS 0
 #define TM 0
+#define TST 0
+#define TLST 0
+#define TFST 0
+#define TSTA 0
+#define TSF 0
+#define TFSF 0
+#define TSFA 0
 #define NF 0
 #define MA 0
 #define SI 0
diff --git a/tests/lchown.gen.test b/tests/lchown.gen.test
new file mode 100755
index 0000000..b31e29d
--- /dev/null
+++ b/tests/lchown.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (lchown -a30); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a30
diff --git a/tests/lchown.test b/tests/lchown.test
deleted file mode 100755
index ceeaa85..0000000
--- a/tests/lchown.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check lchown syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a30
diff --git a/tests/lchown32.gen.test b/tests/lchown32.gen.test
new file mode 100755
index 0000000..83be4bc
--- /dev/null
+++ b/tests/lchown32.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (lchown32 -a32); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a32
diff --git a/tests/lchown32.test b/tests/lchown32.test
deleted file mode 100755
index 6ee1ac9..0000000
--- a/tests/lchown32.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check lchown32 syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a32
diff --git a/tests/link.gen.test b/tests/link.gen.test
new file mode 100755
index 0000000..b6db34d
--- /dev/null
+++ b/tests/link.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (link ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/link.test b/tests/link.test
deleted file mode 100755
index cfa2b0c..0000000
--- a/tests/link.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check link syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff
diff --git a/tests/linkat.gen.test b/tests/linkat.gen.test
new file mode 100755
index 0000000..54b12b9
--- /dev/null
+++ b/tests/linkat.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (linkat ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/linkat.test b/tests/linkat.test
deleted file mode 100755
index 5627de7..0000000
--- a/tests/linkat.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check linkat syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff
diff --git a/tests/llseek.test b/tests/llseek.test
index cf1607e..8dcd65d 100755
--- a/tests/llseek.test
+++ b/tests/llseek.test
@@ -9,7 +9,3 @@
 run_strace -e_llseek $args > "$EXP"
 grep -v '^lseek([0-9]' < "$LOG" > "$OUT"
 match_diff "$OUT" "$EXP"
-
-rm -f "$EXP" "$OUT"
-
-exit 0
diff --git a/tests/lookup_dcookie.gen.test b/tests/lookup_dcookie.gen.test
new file mode 100755
index 0000000..6357e19
--- /dev/null
+++ b/tests/lookup_dcookie.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (lookup_dcookie -a27); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a27
diff --git a/tests/lookup_dcookie.test b/tests/lookup_dcookie.test
deleted file mode 100755
index 47e1c2d..0000000
--- a/tests/lookup_dcookie.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of lookup_cookie syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a27
diff --git a/tests/lseek.test b/tests/lseek.test
index f96a91d..5b20a7f 100755
--- a/tests/lseek.test
+++ b/tests/lseek.test
@@ -9,7 +9,3 @@
 run_strace -a30 -elseek $args > "$EXP"
 grep -v '^lseek([0-9]' < "$LOG" > "$OUT"
 match_diff "$OUT" "$EXP"
-
-rm -f "$EXP" "$OUT"
-
-exit 0
diff --git a/tests/lstat.c b/tests/lstat.c
index 3754f76..8441bf8 100644
--- a/tests/lstat.c
+++ b/tests/lstat.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff --git a/tests/lstat.gen.test b/tests/lstat.gen.test
new file mode 100755
index 0000000..7231c49
--- /dev/null
+++ b/tests/lstat.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (lstat -a32 -v -P stat.sample -P /dev/full); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a32 -v -P stat.sample -P /dev/full
diff --git a/tests/lstat.test b/tests/lstat.test
deleted file mode 100755
index f513bb4..0000000
--- a/tests/lstat.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check lstat syscall decoding.
-
-. "${srcdir=.}/statx.sh"
diff --git a/tests/lstat64.c b/tests/lstat64.c
index da06609..500b60f 100644
--- a/tests/lstat64.c
+++ b/tests/lstat64.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff --git a/tests/lstat64.gen.test b/tests/lstat64.gen.test
new file mode 100755
index 0000000..124cce4
--- /dev/null
+++ b/tests/lstat64.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (lstat64 -a32 -v -P stat.sample -P /dev/full); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a32 -v -P stat.sample -P /dev/full
diff --git a/tests/lstat64.test b/tests/lstat64.test
deleted file mode 100755
index fcafe79..0000000
--- a/tests/lstat64.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check lstat64 syscall decoding.
-
-. "${srcdir=.}/statx.sh"
diff --git a/tests/lstatx.c b/tests/lstatx.c
index cdd1124..8049bea 100644
--- a/tests/lstatx.c
+++ b/tests/lstatx.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff --git a/tests/madvise.c b/tests/madvise.c
new file mode 100644
index 0000000..bf9cd78
--- /dev/null
+++ b/tests/madvise.c
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2017 The strace developers.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "tests.h"
+#include <stdint.h>
+#include <stdio.h>
+#include <sys/mman.h>
+#include <unistd.h>
+#include <asm/unistd.h>
+
+static const char *errstr;
+
+static long
+k_madvise(const kernel_ulong_t addr,
+	  const kernel_ulong_t length,
+	  const kernel_ulong_t advice)
+{
+	long rc = syscall(__NR_madvise, addr, length, advice);
+	errstr = sprintrc(rc);
+	return rc;
+}
+
+int
+main(void)
+{
+	const unsigned long length = get_page_size();
+	void *const addr = tail_alloc(length);
+	long rc;
+
+	rc = madvise(addr, length, MADV_NORMAL);
+	printf("madvise(%p, %lu, MADV_NORMAL) = %s\n",
+	       addr, length, sprintrc(rc));
+
+	static const kernel_ulong_t advice =
+		(kernel_ulong_t) 0xfacefeed00000000ULL | MADV_RANDOM;
+	rc = k_madvise((uintptr_t) addr, length, advice);
+	printf("madvise(%p, %lu, MADV_RANDOM) = %s\n",
+	       addr, length, sprintrc(rc));
+
+	static const kernel_ulong_t bogus_length =
+		(kernel_ulong_t) 0xfffffffffffffaceULL;
+	rc = k_madvise(0, bogus_length, MADV_SEQUENTIAL);
+	printf("madvise(NULL, %llu, MADV_SEQUENTIAL) = %s\n",
+	       (unsigned long long) bogus_length, sprintrc(rc));
+
+	if (F8ILL_KULONG_SUPPORTED) {
+		rc = k_madvise(f8ill_ptr_to_kulong(addr), length, MADV_NORMAL);
+		printf("madvise(%#llx, %lu, MADV_NORMAL) = %s\n",
+		       (unsigned long long) f8ill_ptr_to_kulong(addr),
+		       length, sprintrc(rc));
+	}
+
+	puts("+++ exited with 0 +++");
+	return 0;
+}
diff --git a/tests/madvise.gen.test b/tests/madvise.gen.test
new file mode 100755
index 0000000..bd36dad
--- /dev/null
+++ b/tests/madvise.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (madvise -a33); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a33
diff --git a/tests/mbind.gen.test b/tests/mbind.gen.test
new file mode 100755
index 0000000..a0d144d
--- /dev/null
+++ b/tests/mbind.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (mbind ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/mbind.test b/tests/mbind.test
deleted file mode 100755
index 2a07cac..0000000
--- a/tests/mbind.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of mbind syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff
diff --git a/tests/membarrier.gen.test b/tests/membarrier.gen.test
new file mode 100755
index 0000000..7a6ea10
--- /dev/null
+++ b/tests/membarrier.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (membarrier -a36); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a36
diff --git a/tests/membarrier.test b/tests/membarrier.test
deleted file mode 100755
index ad1f713..0000000
--- a/tests/membarrier.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check membarrier syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a36
diff --git a/tests/memfd_create.gen.test b/tests/memfd_create.gen.test
new file mode 100755
index 0000000..11762be
--- /dev/null
+++ b/tests/memfd_create.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (memfd_create ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/memfd_create.test b/tests/memfd_create.test
deleted file mode 100755
index 4361dae..0000000
--- a/tests/memfd_create.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of memfd_create syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff
diff --git a/tests/migrate_pages.gen.test b/tests/migrate_pages.gen.test
new file mode 100755
index 0000000..20b7cad
--- /dev/null
+++ b/tests/migrate_pages.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (migrate_pages -a33); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a33
diff --git a/tests/migrate_pages.test b/tests/migrate_pages.test
deleted file mode 100755
index fad53b7..0000000
--- a/tests/migrate_pages.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check migrate_pages syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a33
diff --git a/tests/mincore.gen.test b/tests/mincore.gen.test
new file mode 100755
index 0000000..dc40726
--- /dev/null
+++ b/tests/mincore.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (mincore -a22); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a22
diff --git a/tests/mincore.test b/tests/mincore.test
deleted file mode 100755
index 6af9f49..0000000
--- a/tests/mincore.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check mincore syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a22
diff --git a/tests/mkdir.gen.test b/tests/mkdir.gen.test
new file mode 100755
index 0000000..80b4995
--- /dev/null
+++ b/tests/mkdir.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (mkdir -a20); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a20
diff --git a/tests/mkdir.test b/tests/mkdir.test
deleted file mode 100755
index 38ed692..0000000
--- a/tests/mkdir.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check mkdir syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a20
diff --git a/tests/mkdirat.gen.test b/tests/mkdirat.gen.test
new file mode 100755
index 0000000..0f3fdae
--- /dev/null
+++ b/tests/mkdirat.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (mkdirat -a28); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a28
diff --git a/tests/mkdirat.test b/tests/mkdirat.test
deleted file mode 100755
index 0fcb841..0000000
--- a/tests/mkdirat.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check mkdirat syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a28
diff --git a/tests/mknod.c b/tests/mknod.c
index 4cc1c5c..b387149 100644
--- a/tests/mknod.c
+++ b/tests/mknod.c
@@ -8,7 +8,7 @@
 # include <sys/sysmacros.h>
 # include <unistd.h>
 
-static const char sample[] = "mknod";
+static const char *sample;
 
 static long
 call_mknod(unsigned short mode, unsigned long dev)
@@ -18,9 +18,10 @@
 }
 
 int
-main(void)
+main(int ac, char **av)
 {
 	unsigned long dev = (unsigned long) 0xdeadbeefbadc0dedULL;
+	sample = av[0];
 
 	long rc = call_mknod(0, dev);
 	printf("mknod(\"%s\", 000) = %ld %s (%m)\n",
diff --git a/tests/mknod.gen.test b/tests/mknod.gen.test
new file mode 100755
index 0000000..870c88b
--- /dev/null
+++ b/tests/mknod.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (mknod -a18); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a18
diff --git a/tests/mknod.test b/tests/mknod.test
deleted file mode 100755
index 195f1e3..0000000
--- a/tests/mknod.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check mknod syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a18
diff --git a/tests/mknodat.gen.test b/tests/mknodat.gen.test
new file mode 100755
index 0000000..747fcbe
--- /dev/null
+++ b/tests/mknodat.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (mknodat -a35); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a35
diff --git a/tests/mknodat.test b/tests/mknodat.test
deleted file mode 100755
index 1701a36..0000000
--- a/tests/mknodat.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check mknodat syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a35
diff --git a/tests/mlock.gen.test b/tests/mlock.gen.test
new file mode 100755
index 0000000..2c8ea5e
--- /dev/null
+++ b/tests/mlock.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (mlock -a20 -e trace=mlock,munlock); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a20 -e trace=mlock,munlock
diff --git a/tests/mlock.test b/tests/mlock.test
deleted file mode 100755
index 9a73a30..0000000
--- a/tests/mlock.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check mlock and munlock syscalls decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -e trace=mlock,munlock -a20
diff --git a/tests/mlock2.gen.test b/tests/mlock2.gen.test
new file mode 100755
index 0000000..aa1818e
--- /dev/null
+++ b/tests/mlock2.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (mlock2 ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/mlock2.test b/tests/mlock2.test
deleted file mode 100755
index bc412e9..0000000
--- a/tests/mlock2.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check mlock2 syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff
diff --git a/tests/mlockall.gen.test b/tests/mlockall.gen.test
new file mode 100755
index 0000000..06d8ca4
--- /dev/null
+++ b/tests/mlockall.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (mlockall -a12); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a12
diff --git a/tests/mlockall.test b/tests/mlockall.test
deleted file mode 100755
index d7a6182..0000000
--- a/tests/mlockall.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of mlockall syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a12
diff --git a/tests/mmap.c b/tests/mmap.c
index f726f63..0321bf5 100644
--- a/tests/mmap.c
+++ b/tests/mmap.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -89,10 +90,6 @@
 	printf("mremap(%p, %lu, %lu, MREMAP_MAYMOVE|MREMAP_FIXED"
 	       ", %p) = %p\n", addr, length2, length3, addr + length2, p);
 
-	if (madvise(p, length3, MADV_NORMAL))
-		perror_msg_and_fail("madvise");
-	printf("madvise(%p, %lu, MADV_NORMAL) = 0\n", p, length3);
-
 	if (munmap(p, length3))
 		perror_msg_and_fail("munmap");
 	printf("munmap(%p, %lu) = 0\n", p, length3);
diff --git a/tests/mmap.test b/tests/mmap.test
index 0b87114..7ba664e 100755
--- a/tests/mmap.test
+++ b/tests/mmap.test
@@ -4,6 +4,7 @@
 # syscalls decoding.
 #
 # Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+# Copyright (c) 2015-2017 The strace developers.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -50,9 +51,7 @@
 
 syscall=$mmap,madvise,mlockall,mprotect,mremap,msync,munmap
 
-run_prog "./$NAME" $mmap > /dev/null
+run_prog "../$NAME" $mmap > /dev/null
 run_strace -a20 -e$syscall $args > "$EXP"
 sed -n "/^$mmap(NULL, 0, PROT_NONE,/,\$p" < "$LOG" > "$OUT"
 match_diff "$OUT" "$EXP"
-
-rm -f "$EXP" "$OUT"
diff --git a/tests/mmap64.gen.test b/tests/mmap64.gen.test
new file mode 100755
index 0000000..5e747b0
--- /dev/null
+++ b/tests/mmap64.gen.test
@@ -0,0 +1,3 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (mmap64 +mmap.test); do not edit.
+. "${srcdir=.}/mmap.test"
diff --git a/tests/mmap64.test b/tests/mmap64.test
deleted file mode 100755
index 51f1896..0000000
--- a/tests/mmap64.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check mmap/mprotect/munmap syscalls decoding.
-# Target executable was compiled with -D_FILE_OFFSET_BITS=64.
-
-. "${srcdir=.}/mmap.test"
diff --git a/tests/mmsg-silent.gen.test b/tests/mmsg-silent.gen.test
new file mode 100755
index 0000000..47863f2
--- /dev/null
+++ b/tests/mmsg-silent.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (mmsg-silent -a25 -e verbose=none -e trace=sendmmsg,recvmmsg); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a25 -e verbose=none -e trace=sendmmsg,recvmmsg
diff --git a/tests/mmsg-silent.test b/tests/mmsg-silent.test
deleted file mode 100755
index 775e0ad..0000000
--- a/tests/mmsg-silent.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check silent decoding of sendmmsg and recvmmsg syscalls.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a25 -e verbose=none -e trace=sendmmsg,recvmmsg
diff --git a/tests/mmsg.gen.test b/tests/mmsg.gen.test
new file mode 100755
index 0000000..4d90e3d
--- /dev/null
+++ b/tests/mmsg.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (mmsg -e read=0 -e write=1 -e trace=recvmmsg,sendmmsg); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -e read=0 -e write=1 -e trace=recvmmsg,sendmmsg
diff --git a/tests/mmsg.test b/tests/mmsg.test
deleted file mode 100755
index a8148ba..0000000
--- a/tests/mmsg.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check how iovecs in struct mmsghdr are decoded.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -e trace=recvmmsg,sendmmsg -e read=0 -e write=1
diff --git a/tests/mmsg_name-v.gen.test b/tests/mmsg_name-v.gen.test
new file mode 100755
index 0000000..e34946f
--- /dev/null
+++ b/tests/mmsg_name-v.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (mmsg_name-v -v -a25 -e trace=sendmmsg,recvmmsg); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -v -a25 -e trace=sendmmsg,recvmmsg
diff --git a/tests/mmsg_name-v.test b/tests/mmsg_name-v.test
deleted file mode 100755
index ab8dfba..0000000
--- a/tests/mmsg_name-v.test
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/sh
-
-# Check verbose decoding of msg_name* fields of struct msghdr array argument
-# of sendmmsg and recvmmsg syscalls.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -v -a25 -e trace=sendmmsg,recvmmsg
diff --git a/tests/mmsg_name.gen.test b/tests/mmsg_name.gen.test
new file mode 100755
index 0000000..ac54294
--- /dev/null
+++ b/tests/mmsg_name.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (mmsg_name -a25 -e trace=sendmmsg,recvmmsg); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a25 -e trace=sendmmsg,recvmmsg
diff --git a/tests/mmsg_name.test b/tests/mmsg_name.test
deleted file mode 100755
index e18c972..0000000
--- a/tests/mmsg_name.test
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/sh
-
-# Check decoding of msg_name* fields of struct msghdr array argument
-# of sendmmsg and recvmmsg syscalls.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a25 -e trace=sendmmsg,recvmmsg
diff --git a/tests/mount.gen.test b/tests/mount.gen.test
new file mode 100755
index 0000000..0b124bc
--- /dev/null
+++ b/tests/mount.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (mount ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/mount.test b/tests/mount.test
deleted file mode 100755
index 40fdca9..0000000
--- a/tests/mount.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of mount syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff
diff --git a/tests/move_pages.c b/tests/move_pages.c
index f4ccafa..5ec25aa 100644
--- a/tests/move_pages.c
+++ b/tests/move_pages.c
@@ -2,6 +2,7 @@
  * Check decoding of move_pages syscall.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -126,7 +127,7 @@
 			printf("%d", status[i]);
 		} else {
 			errno = -status[i];
-			printf("%s", errno2name());
+			printf("-%s", errno2name());
 		}
 	}
 	printf("]");
@@ -190,9 +191,9 @@
 	const unsigned page_size = get_page_size();
 	const void *const page = tail_alloc(page_size);
 	const void *const efault = page + page_size;
-	const void **pages = tail_alloc(sizeof(*pages));
-	int *nodes = tail_alloc(sizeof(*nodes));
-	int *status = tail_alloc(sizeof(*status));
+	TAIL_ALLOC_OBJECT_VAR_PTR(const void *, pages);
+	TAIL_ALLOC_OBJECT_VAR_PTR(int, nodes);
+	TAIL_ALLOC_OBJECT_VAR_PTR(int, status);
 
 	print_stat_pages(pid, 0, pages, status);
 	print_move_pages(pid, 0, 0, pages, nodes, status);
diff --git a/tests/move_pages.gen.test b/tests/move_pages.gen.test
new file mode 100755
index 0000000..2f060fa
--- /dev/null
+++ b/tests/move_pages.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (move_pages -s3); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -s3
diff --git a/tests/move_pages.test b/tests/move_pages.test
deleted file mode 100755
index f957717..0000000
--- a/tests/move_pages.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of move_pages syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -s3
diff --git a/tests/mq.c b/tests/mq.c
index 9c2ffc8..ee2d059 100644
--- a/tests/mq.c
+++ b/tests/mq.c
@@ -1,6 +1,7 @@
 /*
  * Copyright (c) 2015 Elvira Khabirova <[email protected]>
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -37,17 +38,19 @@
 # include <unistd.h>
 # include <sys/stat.h>
 
-# define NAME "strace-mq.test"
-
 int
 main (void)
 {
 	struct mq_attr attr;
 	(void) close(0);
 
-	if (mq_open("/" NAME, O_CREAT, 0700, NULL))
+	char *name;
+	if (asprintf(&name, "/strace-mq-%u.sample", getpid()) < 0)
+		perror_msg_and_fail("asprintf");
+
+	if (mq_open(name, O_CREAT, 0700, NULL))
 		perror_msg_and_skip("mq_open");
-	printf("mq_open(\"%s\", O_RDONLY|O_CREAT, 0700, NULL) = 0\n", NAME);
+	printf("mq_open(\"%s\", O_RDONLY|O_CREAT, 0700, NULL) = 0\n", name + 1);
 
 	if (mq_getattr(0, &attr))
 		perror_msg_and_skip("mq_getattr");
@@ -63,9 +66,9 @@
 	       (long long) attr.mq_maxmsg,
 	       (long long) attr.mq_msgsize);
 
-	if (mq_unlink("/" NAME))
+	if (mq_unlink(name))
 		perror_msg_and_skip("mq_unlink");
-	printf("mq_unlink(\"%s\") = 0\n", NAME);
+	printf("mq_unlink(\"%s\") = 0\n", name + 1);
 
 	puts("+++ exited with 0 +++");
 	return 0;
diff --git a/tests/mq.gen.test b/tests/mq.gen.test
new file mode 100755
index 0000000..8be520d
--- /dev/null
+++ b/tests/mq.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (mq -a32 -e trace=mq_getsetattr,mq_open,mq_unlink); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a32 -e trace=mq_getsetattr,mq_open,mq_unlink
diff --git a/tests/mq.test b/tests/mq.test
deleted file mode 100755
index 746b07b..0000000
--- a/tests/mq.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of mq_open, mq_getsetattr, and mq_unlink syscalls.
-. "${srcdir=.}/init.sh"
-
-run_strace_match_diff -a28 -e trace=mq_getsetattr,mq_open,mq_unlink
diff --git a/tests/mq_sendrecv-read.gen.test b/tests/mq_sendrecv-read.gen.test
new file mode 100755
index 0000000..278e9b7
--- /dev/null
+++ b/tests/mq_sendrecv-read.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (mq_sendrecv-read -eread=0 -a14 -e trace=mq_open,mq_notify,mq_timedsend,mq_timedreceive,mq_unlink); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -eread=0 -a14 -e trace=mq_open,mq_notify,mq_timedsend,mq_timedreceive,mq_unlink
diff --git a/tests/mq_sendrecv-read.test b/tests/mq_sendrecv-read.test
deleted file mode 100755
index eb4ad75..0000000
--- a/tests/mq_sendrecv-read.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of mq_open, mq_notify, mq_timedsend, mq_timedreceive syscalls.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -e trace=mq_open,mq_notify,mq_timedsend,mq_timedreceive,mq_unlink -eread=0 -a14
diff --git a/tests/mq_sendrecv-write.gen.test b/tests/mq_sendrecv-write.gen.test
new file mode 100755
index 0000000..5963eb4
--- /dev/null
+++ b/tests/mq_sendrecv-write.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (mq_sendrecv-write -ewrite=0 -a14 -e trace=mq_open,mq_notify,mq_timedsend,mq_timedreceive,mq_unlink); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -ewrite=0 -a14 -e trace=mq_open,mq_notify,mq_timedsend,mq_timedreceive,mq_unlink
diff --git a/tests/mq_sendrecv-write.test b/tests/mq_sendrecv-write.test
deleted file mode 100755
index 38277ec..0000000
--- a/tests/mq_sendrecv-write.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of mq_open, mq_notify, mq_timedsend, mq_timedreceive syscalls.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -e trace=mq_open,mq_notify,mq_timedsend,mq_timedreceive,mq_unlink -ewrite=0 -a14
diff --git a/tests/mq_sendrecv.c b/tests/mq_sendrecv.c
index c151542..e3ad0d5 100644
--- a/tests/mq_sendrecv.c
+++ b/tests/mq_sendrecv.c
@@ -3,6 +3,7 @@
  * mq_unlink syscalls.
  *
  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -49,10 +50,6 @@
 
 # include "sigevent.h"
 
-# ifndef MQ_NAME
-#  define MQ_NAME "mq_sendrecv.sample"
-# endif
-
 # ifndef DUMPIO_READ
 #  define DUMPIO_READ 0
 # endif
@@ -61,6 +58,7 @@
 #  define DUMPIO_WRITE 0
 # endif
 
+static char *mq_name;
 
 enum {
 	NUM_ATTRS = 8,
@@ -124,8 +122,8 @@
 {
 	long rc;
 
-	rc = syscall(__NR_mq_unlink, MQ_NAME);
-	printf("mq_unlink(\"" MQ_NAME "\") = %s\n", sprintrc(rc));
+	rc = syscall(__NR_mq_unlink, mq_name);
+	printf("mq_unlink(\"%s\") = %s\n", mq_name, sprintrc(rc));
 
 	puts("+++ exited with 0 +++");
 }
@@ -147,9 +145,9 @@
 		if (cropped)
 			printf("...");
 		errno = saved_errno;
-		printf(", %u, 42, {tv_sec=%jd, tv_nsec=%jd}) = %s\n", msg_size,
-		       (intmax_t) tmout->tv_sec, (intmax_t) tmout->tv_nsec,
-		       sprintrc(rc));
+		printf(", %u, 42, {tv_sec=%lld, tv_nsec=%llu}) = %s\n", msg_size,
+		       (long long) tmout->tv_sec,
+		       zero_extend_signed_to_ull(tmout->tv_nsec), sprintrc(rc));
 		errno = saved_errno;
 
 		if (rc == -1) {
@@ -185,9 +183,9 @@
 			printf("%p", msg);
 		}
 		errno = saved_errno;
-		printf(", %u, [42], {tv_sec=%jd, tv_nsec=%jd}) = %s\n", MSG_SIZE,
-		       (intmax_t) tmout->tv_sec,
-		       (intmax_t) tmout->tv_nsec, sprintrc(rc));
+		printf(", %u, [42], {tv_sec=%lld, tv_nsec=%llu}) = %s\n", MSG_SIZE,
+		       (long long) tmout->tv_sec,
+		       zero_extend_signed_to_ull(tmout->tv_nsec), sprintrc(rc));
 		errno = saved_errno;
 
 		if (rc == -1) {
@@ -242,7 +240,7 @@
 	kernel_long_t *bogus_attrs = tail_alloc(sizeof(*bogus_attrs) *
 		NUM_ATTRS);
 	char *msg = tail_alloc(MSG_SIZE);
-	unsigned *bogus_prio_ptr = tail_alloc(sizeof(*bogus_prio_ptr));
+	TAIL_ALLOC_OBJECT_CONST_PTR(unsigned, bogus_prio_ptr);
 	struct timespec *bogus_tmout = tail_memdup(&bogus_tmout_data,
 		sizeof(*bogus_tmout));
 	struct timespec *future_tmout = tail_memdup(&future_tmout_data,
@@ -278,8 +276,8 @@
 	/* Valid attributes structure */
 	rc = syscall(__NR_mq_open, msg, O_CREAT | bogus_oflags, bogus_mode,
 		     bogus_attrs);
-	printf("mq_open(%p, O_ACCMODE|O_CREAT, %#o, {mq_flags=%#llx, "
-	       "mq_maxmsg=%lld, mq_msgsize=%lld, mq_curmsgs=%lld}) = %s\n",
+	printf("mq_open(%p, O_ACCMODE|O_CREAT, %#o, {mq_flags=%#llx"
+	       ", mq_maxmsg=%lld, mq_msgsize=%lld, mq_curmsgs=%lld}) = %s\n",
 	       msg, (unsigned short) bogus_mode,
 	       (unsigned long long) (kernel_ulong_t) bogus_attrs[0],
 	       (long long) bogus_attrs[1],
@@ -304,12 +302,12 @@
 	/* Partially invalid message (memory only partially available) */
 	rc = syscall(__NR_mq_timedsend, bogus_fd, msg + MSG_SIZE - MSG_CUT,
 		     MSG_SIZE, bogus_prio, bogus_tmout);
-	printf("mq_timedsend(%d, %p, %llu, %u, {tv_sec=%jd, tv_nsec=%jd}) = "
-	       "%s\n",
+	printf("mq_timedsend(%d, %p, %llu, %u, {tv_sec=%lld, tv_nsec=%llu})"
+	       " = %s\n",
 	       (int) bogus_fd, msg + MSG_SIZE - MSG_CUT,
 	       (unsigned long long) MSG_SIZE, (unsigned) bogus_prio,
-	       (intmax_t) bogus_tmout->tv_sec, (intmax_t) bogus_tmout->tv_nsec,
-	       sprintrc(rc));
+	       (long long) bogus_tmout->tv_sec,
+	       zero_extend_signed_to_ull(bogus_tmout->tv_nsec), sprintrc(rc));
 
 	/* Fully valid message, uncut */
 	rc = syscall(__NR_mq_timedsend, bogus_fd, msg + MSG_SIZE - MSG_CUT,
@@ -317,10 +315,10 @@
 	errstr = sprintrc(rc);
 	printf("mq_timedsend(%d, ", (int) bogus_fd);
 	printstr(MSG_START + MSG_SIZE - MSG_CUT, MSG_CUT);
-	printf(", %llu, %u, {tv_sec=%jd, tv_nsec=%jd}) = %s\n",
+	printf(", %llu, %u, {tv_sec=%lld, tv_nsec=%llu}) = %s\n",
 	       (unsigned long long) MSG_CUT, (unsigned) bogus_prio,
-	       (intmax_t) bogus_tmout->tv_sec, (intmax_t) bogus_tmout->tv_nsec,
-	       errstr);
+	       (long long) bogus_tmout->tv_sec,
+	       zero_extend_signed_to_ull(bogus_tmout->tv_nsec), errstr);
 
 	/* Partially invalid message, cut at maxstrlen */
 	rc = syscall(__NR_mq_timedsend, bogus_fd, msg + MSG_CUT, MSG_SIZE,
@@ -328,10 +326,10 @@
 	errstr = sprintrc(rc);
 	printf("mq_timedsend(%d, ", (int) bogus_fd);
 	printstr(MSG_START + MSG_CUT, MSG_MAX_UNCUT);
-	printf("..., %llu, %u, {tv_sec=%jd, tv_nsec=%jd}) = %s\n",
+	printf("..., %llu, %u, {tv_sec=%lld, tv_nsec=%llu}) = %s\n",
 	       (unsigned long long) MSG_SIZE, (unsigned) bogus_prio,
-	       (intmax_t) bogus_tmout->tv_sec, (intmax_t) bogus_tmout->tv_nsec,
-	       errstr);
+	       (long long) bogus_tmout->tv_sec,
+	       zero_extend_signed_to_ull(bogus_tmout->tv_nsec), errstr);
 
 
 	/* mq_timedreceive */
@@ -351,11 +349,11 @@
 	/* Invalid fd, valid msg pointer */
 	rc = syscall(__NR_mq_timedreceive, bogus_fd, msg, bogus_size,
 		     bogus_prio_ptr, bogus_tmout);
-	printf("mq_timedreceive(%d, %p, %llu, %p, {tv_sec=%jd, tv_nsec=%jd}) = "
-	       "%s\n",
+	printf("mq_timedreceive(%d, %p, %llu, %p, {tv_sec=%lld, tv_nsec=%llu}) "
+	       "= %s\n",
 	       (int) bogus_fd, msg, (unsigned long long) bogus_size,
-	       bogus_prio_ptr, (intmax_t) bogus_tmout->tv_sec,
-	       (intmax_t) bogus_tmout->tv_nsec, sprintrc(rc));
+	       bogus_prio_ptr, (long long) bogus_tmout->tv_sec,
+	       zero_extend_signed_to_ull(bogus_tmout->tv_nsec), sprintrc(rc));
 
 
 	/* mq_notify */
@@ -381,8 +379,8 @@
 	/* SIGEV_NONE */
 	bogus_sev->sigev_notify = SIGEV_NONE;
 	rc = syscall(__NR_mq_notify, bogus_fd, bogus_sev);
-	printf("mq_notify(%d, {sigev_value={sival_int=%d, sival_ptr=%#lx}, "
-	       "sigev_signo=%u, sigev_notify=SIGEV_NONE}) = %s\n",
+	printf("mq_notify(%d, {sigev_value={sival_int=%d, sival_ptr=%#lx}"
+	       ", sigev_signo=%u, sigev_notify=SIGEV_NONE}) = %s\n",
 	       (int) bogus_fd, bogus_sev->sigev_value.sival_int,
 	       bogus_sev->sigev_value.sival_ptr,
 	       bogus_sev->sigev_signo, sprintrc(rc));
@@ -391,8 +389,8 @@
 	bogus_sev->sigev_notify = SIGEV_SIGNAL;
 	bogus_sev->sigev_signo = SIGALRM;
 	rc = syscall(__NR_mq_notify, bogus_fd, bogus_sev);
-	printf("mq_notify(%d, {sigev_value={sival_int=%d, sival_ptr=%#lx}, "
-	       "sigev_signo=SIGALRM, sigev_notify=SIGEV_SIGNAL}) = %s\n",
+	printf("mq_notify(%d, {sigev_value={sival_int=%d, sival_ptr=%#lx}"
+	       ", sigev_signo=SIGALRM, sigev_notify=SIGEV_SIGNAL}) = %s\n",
 	       (int) bogus_fd, bogus_sev->sigev_value.sival_int,
 	       bogus_sev->sigev_value.sival_ptr, sprintrc(rc));
 
@@ -403,10 +401,10 @@
 	bogus_sev->sigev_un.sigev_thread.attribute =
 		(unsigned long) 0xcafef00dfacefeedULL;
 	rc = syscall(__NR_mq_notify, bogus_fd, bogus_sev);
-	printf("mq_notify(%d, {sigev_value={sival_int=%d, sival_ptr=%#lx}, "
-	       "sigev_signo=SIGALRM, sigev_notify=SIGEV_THREAD, "
-	       "sigev_notify_function=%#lx, sigev_notify_attributes=%#lx}) = "
-	       "%s\n",
+	printf("mq_notify(%d, {sigev_value={sival_int=%d, sival_ptr=%#lx}"
+	       ", sigev_signo=SIGALRM, sigev_notify=SIGEV_THREAD"
+	       ", sigev_notify_function=%#lx, sigev_notify_attributes=%#lx})"
+	       " = %s\n",
 	       (int) bogus_fd, bogus_sev->sigev_value.sival_int,
 	       bogus_sev->sigev_value.sival_ptr,
 	       bogus_sev->sigev_un.sigev_thread.function,
@@ -430,12 +428,15 @@
 
 	/* Sending and receiving test */
 
+	if (asprintf(&mq_name, "strace-mq_sendrecv-%u.sample", getpid()) < 0)
+		perror_msg_and_fail("asprintf");
+
 # if DUMPIO_READ || DUMPIO_WRITE
 	close(0);
 # endif
 	bogus_attrs[1] = 2;
 	bogus_attrs[2] = MSG_SIZE;
-	fd = rc = syscall(__NR_mq_open, MQ_NAME,
+	fd = rc = syscall(__NR_mq_open, mq_name,
 		          O_CREAT|O_RDWR|O_NONBLOCK, S_IRWXU, bogus_attrs);
 	errstr = sprintrc(rc);
 	if (rc < 0)
@@ -448,11 +449,11 @@
 # endif
 	fill_memory_ex(bogus_attrs, sizeof(*bogus_attrs) * NUM_ATTRS,
 		       0xbb, 0x70);
-	printf("mq_open(\"" MQ_NAME "\", O_RDWR|O_CREAT|O_NONBLOCK, "
-	       "0700, {mq_flags=%#llx, mq_maxmsg=2, mq_msgsize=%u, "
-	       "mq_curmsgs=%lld}) = %s\n",
-	       (unsigned long long) (kernel_ulong_t) bogus_attrs[0], MSG_SIZE,
-	       (long long) bogus_attrs[3], errstr);
+	printf("mq_open(\"%s\", O_RDWR|O_CREAT|O_NONBLOCK, 0700"
+	       ", {mq_flags=%#llx, mq_maxmsg=2, mq_msgsize=%u"
+	       ", mq_curmsgs=%lld}) = %s\n",
+	       mq_name, (unsigned long long) (kernel_ulong_t) bogus_attrs[0],
+	       MSG_SIZE, (long long) bogus_attrs[3], errstr);
 
 	rc = syscall(__NR_mq_getsetattr, fd, NULL, bogus_attrs);
 	if (rc < 0)
diff --git a/tests/mq_sendrecv.gen.test b/tests/mq_sendrecv.gen.test
new file mode 100755
index 0000000..d82576f
--- /dev/null
+++ b/tests/mq_sendrecv.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (mq_sendrecv -a14 -e trace=mq_open,mq_notify,mq_timedsend,mq_timedreceive,mq_unlink); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a14 -e trace=mq_open,mq_notify,mq_timedsend,mq_timedreceive,mq_unlink
diff --git a/tests/mq_sendrecv.test b/tests/mq_sendrecv.test
deleted file mode 100755
index 67f4d63..0000000
--- a/tests/mq_sendrecv.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of mq_open, mq_notify, mq_timedsend, mq_timedreceive syscalls.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -e trace=mq_open,mq_notify,mq_timedsend,mq_timedreceive,mq_unlink -a14
diff --git a/tests/msg_control-v.gen.test b/tests/msg_control-v.gen.test
new file mode 100755
index 0000000..0a0de15
--- /dev/null
+++ b/tests/msg_control-v.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (msg_control-v -v -a21 -e trace=sendmsg); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -v -a21 -e trace=sendmsg
diff --git a/tests/msg_control-v.test b/tests/msg_control-v.test
deleted file mode 100755
index 41f9842..0000000
--- a/tests/msg_control-v.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check verbose decoding of struct msghdr ancillary data.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -v -a21 -e trace=sendmsg
diff --git a/tests/msg_control.c b/tests/msg_control.c
index 709a307..1e64f1a 100644
--- a/tests/msg_control.c
+++ b/tests/msg_control.c
@@ -2,6 +2,7 @@
  * Check decoding of struct msghdr ancillary data.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -689,7 +690,7 @@
 	int rc = sendmsg(-1, 0, 0);
 	printf("sendmsg(-1, NULL, 0) = %d %s (%m)\n", rc, errno2name());
 
-	struct msghdr *mh = tail_alloc(sizeof(*mh));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct msghdr, mh);
 	memset(mh, 0, sizeof(*mh));
 	test_big_len(mh);
 
diff --git a/tests/msg_control.gen.test b/tests/msg_control.gen.test
new file mode 100755
index 0000000..446ebcb
--- /dev/null
+++ b/tests/msg_control.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (msg_control -a21 -e trace=sendmsg); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a21 -e trace=sendmsg
diff --git a/tests/msg_control.test b/tests/msg_control.test
deleted file mode 100755
index 809ec7b..0000000
--- a/tests/msg_control.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of struct msghdr ancillary data.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a21 -e trace=sendmsg
diff --git a/tests/msg_name.c b/tests/msg_name.c
index c2ddda2..9e98e4e 100644
--- a/tests/msg_name.c
+++ b/tests/msg_name.c
@@ -2,6 +2,7 @@
  * Check decoding of struct msghdr.msg_name* arguments of recvmsg syscall.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -47,13 +48,13 @@
 static void
 test_msg_name(const int send_fd, const int recv_fd)
 {
-	char *const recv_buf = tail_alloc(sizeof(*recv_buf));
-	struct iovec *const iov = tail_alloc(sizeof(*iov));
+	TAIL_ALLOC_OBJECT_CONST_PTR(char, recv_buf);
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct iovec, iov);
 	iov->iov_base = recv_buf;
 	iov->iov_len = sizeof(*recv_buf);
 
-	struct sockaddr_un *const addr = tail_alloc(sizeof(*addr));
-	struct msghdr *const msg = tail_alloc(sizeof(*msg));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct sockaddr_un, addr);
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct msghdr, msg);
 	msg->msg_name = addr;
 	msg->msg_namelen = sizeof(*addr);
 	msg->msg_iov = iov;
diff --git a/tests/msg_name.gen.test b/tests/msg_name.gen.test
new file mode 100755
index 0000000..2d0ae90
--- /dev/null
+++ b/tests/msg_name.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (msg_name -a20 -e trace=recvmsg); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a20 -e trace=recvmsg
diff --git a/tests/msg_name.test b/tests/msg_name.test
deleted file mode 100755
index ac06dd5..0000000
--- a/tests/msg_name.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of struct msghdr.msg_name* arguments of recvmsg syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a20 -e trace=recvmsg
diff --git a/tests/munlockall.gen.test b/tests/munlockall.gen.test
new file mode 100755
index 0000000..18343cb
--- /dev/null
+++ b/tests/munlockall.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (munlockall -a13); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a13
diff --git a/tests/munlockall.test b/tests/munlockall.test
deleted file mode 100755
index e25d60a..0000000
--- a/tests/munlockall.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check munlockall syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a13
diff --git a/tests/nanosleep.c b/tests/nanosleep.c
index 9f0e626..8f9724e 100644
--- a/tests/nanosleep.c
+++ b/tests/nanosleep.c
@@ -1,5 +1,8 @@
 /*
+ * Check decoding of nanosleep syscall.
+ *
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -57,40 +60,62 @@
 
 	if (nanosleep(&req.ts, NULL))
 		perror_msg_and_fail("nanosleep");
-	printf("nanosleep({tv_sec=%jd, tv_nsec=%jd}, NULL) = 0\n",
-	       (intmax_t) req.ts.tv_sec, (intmax_t) req.ts.tv_nsec);
+	printf("nanosleep({tv_sec=%lld, tv_nsec=%llu}, NULL) = 0\n",
+	       (long long) req.ts.tv_sec,
+	       zero_extend_signed_to_ull(req.ts.tv_nsec));
 
 	assert(nanosleep(NULL, &rem.ts) == -1);
 	printf("nanosleep(NULL, %p) = -1 EFAULT (%m)\n", &rem.ts);
 
 	if (nanosleep(&req.ts, &rem.ts))
 		perror_msg_and_fail("nanosleep");
-	printf("nanosleep({tv_sec=%jd, tv_nsec=%jd}, %p) = 0\n",
-	       (intmax_t) req.ts.tv_sec, (intmax_t) req.ts.tv_nsec, &rem.ts);
+	printf("nanosleep({tv_sec=%lld, tv_nsec=%llu}, %p) = 0\n",
+	       (long long) req.ts.tv_sec,
+	       zero_extend_signed_to_ull(req.ts.tv_nsec), &rem.ts);
 
 	req.ts.tv_nsec = 1000000000;
 	assert(nanosleep(&req.ts, &rem.ts) == -1);
-	printf("nanosleep({tv_sec=%jd, tv_nsec=%jd}, %p) = -1 EINVAL (%m)\n",
-	       (intmax_t) req.ts.tv_sec, (intmax_t) req.ts.tv_nsec, &rem.ts);
+	printf("nanosleep({tv_sec=%lld, tv_nsec=%llu}, %p) = -1 EINVAL (%m)\n",
+	       (long long) req.ts.tv_sec,
+	       zero_extend_signed_to_ull(req.ts.tv_nsec), &rem.ts);
+
+	req.ts.tv_sec = 0xdeadbeefU;
+	req.ts.tv_nsec = 0xfacefeedU;
+	assert(nanosleep(&req.ts, &rem.ts) == -1);
+	printf("nanosleep({tv_sec=%lld, tv_nsec=%llu}, %p) = -1 EINVAL (%m)\n",
+	       (long long) req.ts.tv_sec,
+	       zero_extend_signed_to_ull(req.ts.tv_nsec), &rem.ts);
+
+	req.ts.tv_sec = (time_t) 0xcafef00ddeadbeefLL;
+	req.ts.tv_nsec = (long) 0xbadc0dedfacefeedLL;
+	assert(nanosleep(&req.ts, &rem.ts) == -1);
+	printf("nanosleep({tv_sec=%lld, tv_nsec=%llu}, %p) = -1 EINVAL (%m)\n",
+	       (long long) req.ts.tv_sec,
+	       zero_extend_signed_to_ull(req.ts.tv_nsec), &rem.ts);
+
+	req.ts.tv_sec = -1;
+	req.ts.tv_nsec = -1;
+	assert(nanosleep(&req.ts, &rem.ts) == -1);
+	printf("nanosleep({tv_sec=%lld, tv_nsec=%llu}, %p) = -1 EINVAL (%m)\n",
+	       (long long) req.ts.tv_sec,
+	       zero_extend_signed_to_ull(req.ts.tv_nsec), &rem.ts);
 
 	assert(sigaction(SIGALRM, &act, NULL) == 0);
 	assert(sigprocmask(SIG_SETMASK, &set, NULL) == 0);
 
 	if (setitimer(ITIMER_REAL, &itv, NULL))
 		perror_msg_and_skip("setitimer");
-	printf("setitimer(ITIMER_REAL, {it_interval={tv_sec=%jd, tv_usec=%jd}"
-	       ", it_value={tv_sec=%jd, tv_usec=%jd}}, NULL) = 0\n",
-	       (intmax_t) itv.it_interval.tv_sec,
-	       (intmax_t) itv.it_interval.tv_usec,
-	       (intmax_t) itv.it_value.tv_sec,
-	       (intmax_t) itv.it_value.tv_usec);
 
+	req.ts.tv_sec = 0;
 	req.ts.tv_nsec = 999999999;
 	assert(nanosleep(&req.ts, &rem.ts) == -1);
-	printf("nanosleep({tv_sec=%jd, tv_nsec=%jd}, {tv_sec=%jd, tv_nsec=%jd})"
+	printf("nanosleep({tv_sec=%lld, tv_nsec=%llu}"
+	       ", {tv_sec=%lld, tv_nsec=%llu})"
 	       " = ? ERESTART_RESTARTBLOCK (Interrupted by signal)\n",
-	       (intmax_t) req.ts.tv_sec, (intmax_t) req.ts.tv_nsec,
-	       (intmax_t) rem.ts.tv_sec, (intmax_t) rem.ts.tv_nsec);
+	       (long long) req.ts.tv_sec,
+	       zero_extend_signed_to_ull(req.ts.tv_nsec),
+	       (long long) rem.ts.tv_sec,
+	       zero_extend_signed_to_ull(rem.ts.tv_nsec));
 	puts("--- SIGALRM {si_signo=SIGALRM, si_code=SI_KERNEL} ---");
 
 	puts("+++ exited with 0 +++");
diff --git a/tests/nanosleep.gen.test b/tests/nanosleep.gen.test
new file mode 100755
index 0000000..ea5b19a
--- /dev/null
+++ b/tests/nanosleep.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (nanosleep -a20); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a20
diff --git a/tests/nanosleep.test b/tests/nanosleep.test
deleted file mode 100755
index 055a8dc..0000000
--- a/tests/nanosleep.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check nanosleep and setitimer syscalls decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a20 -e trace=nanosleep,setitimer
diff --git a/tests/net-icmp_filter.c b/tests/net-icmp_filter.c
index f3f99f1..71e530d 100644
--- a/tests/net-icmp_filter.c
+++ b/tests/net-icmp_filter.c
@@ -2,6 +2,7 @@
  * Check decoding of ICMP_FILTER.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -43,9 +44,9 @@
 	printf("setsockopt(-1, SOL_RAW, ICMP_FILTER, NULL, 0) = -1 %s (%m)\n",
 	       errno2name());
 
-	socklen_t *const plen = tail_alloc(sizeof(*plen));
+	TAIL_ALLOC_OBJECT_CONST_PTR(socklen_t, plen);
 	void *const efault = plen + 1;
-	struct icmp_filter *const f = tail_alloc(sizeof(*f));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct icmp_filter, f);
 
 	getsockopt(-1, SOL_RAW, ICMP_FILTER, f, plen);
 	printf("getsockopt(-1, SOL_RAW, ICMP_FILTER, %p, %p) = -1 %s (%m)\n",
diff --git a/tests/net-icmp_filter.gen.test b/tests/net-icmp_filter.gen.test
new file mode 100755
index 0000000..bf6c765
--- /dev/null
+++ b/tests/net-icmp_filter.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (net-icmp_filter -e trace=getsockopt,setsockopt); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -e trace=getsockopt,setsockopt
diff --git a/tests/net-icmp_filter.test b/tests/net-icmp_filter.test
deleted file mode 100755
index c05a5e6..0000000
--- a/tests/net-icmp_filter.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of ICMP_FILTER.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -e trace=getsockopt,setsockopt
diff --git a/tests/net-sockaddr.c b/tests/net-sockaddr.c
index bf37779..9dc9ecf 100644
--- a/tests/net-sockaddr.c
+++ b/tests/net-sockaddr.c
@@ -2,6 +2,7 @@
  * Check decoding of sockaddr structures
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -57,7 +58,7 @@
 static void
 check_un(void)
 {
-	struct sockaddr_un *un = tail_alloc(sizeof(*un));
+	TAIL_ALLOC_OBJECT_VAR_PTR(struct sockaddr_un, un);
 	un->sun_family = AF_UNIX;
 	memset(un->sun_path, '0', sizeof(un->sun_path));
 	unsigned int len = sizeof(*un);
@@ -133,7 +134,7 @@
 	const unsigned short h_port = 12345;
 	static const char h_addr[] = "12.34.56.78";
 
-	struct sockaddr_in *in = tail_alloc(sizeof(*in));
+	TAIL_ALLOC_OBJECT_VAR_PTR(struct sockaddr_in, in);
 	in->sin_family = AF_INET;
 	in->sin_port = htons(h_port);
 	in->sin_addr.s_addr = inet_addr(h_addr);
@@ -207,7 +208,7 @@
 	const unsigned int h_flowinfo = 1234567890;
 	static const char h_addr[] = "12:34:56:78:90:ab:cd:ef";
 
-	struct sockaddr_in6 *in6 = tail_alloc(sizeof(*in6));
+	TAIL_ALLOC_OBJECT_VAR_PTR(struct sockaddr_in6, in6);
 	in6->sin6_family = AF_INET6;
 	in6->sin6_port = htons(h_port);
 	in6->sin6_flowinfo = htonl(h_flowinfo);
@@ -298,7 +299,7 @@
 static void
 check_nl(void)
 {
-	struct sockaddr_nl *nl = tail_alloc(sizeof(*nl));
+	TAIL_ALLOC_OBJECT_VAR_PTR(struct sockaddr_nl, nl);
 	nl->nl_family = AF_NETLINK;
 	nl->nl_pid = 1234567890;
 	nl->nl_groups = 0xfacefeed;
@@ -390,7 +391,7 @@
 check_hci(void)
 {
 	const unsigned short h_port = 12345;
-	struct sockaddr_hci *hci = tail_alloc(sizeof(*hci));
+	TAIL_ALLOC_OBJECT_VAR_PTR(struct sockaddr_hci, hci);
 	hci->hci_family = AF_BLUETOOTH;
 	hci->hci_dev = htobs(h_port);
 	hci->hci_channel = HCI_CHANNEL_RAW;
diff --git a/tests/net-sockaddr.gen.test b/tests/net-sockaddr.gen.test
new file mode 100755
index 0000000..53c8335
--- /dev/null
+++ b/tests/net-sockaddr.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (net-sockaddr -a24 -e trace=connect); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a24 -e trace=connect
diff --git a/tests/net-sockaddr.test b/tests/net-sockaddr.test
deleted file mode 100755
index cdfe536..0000000
--- a/tests/net-sockaddr.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of sockaddr structures.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a24 -e trace=connect
diff --git a/tests/net-y-unix.c b/tests/net-y-unix.c
index 3efc2f6..df56ad6 100644
--- a/tests/net-y-unix.c
+++ b/tests/net-y-unix.c
@@ -1,7 +1,7 @@
 /*
  * This file is part of net-y-unix strace test.
  *
- * Copyright (c) 2013-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2013-2017 Dmitry V. Levin <[email protected]>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -38,19 +38,21 @@
 #include <sys/socket.h>
 #include <sys/un.h>
 
-int
-main(int ac, const char **av)
-{
-	assert(ac == 2);
+#define TEST_SOCKET "net-y-unix.socket"
 
-	struct sockaddr_un addr = { .sun_family = AF_UNIX };
-	unsigned int sun_path_len = strlen(av[1]);
-	assert(sun_path_len > 0 && sun_path_len <= sizeof(addr.sun_path));
-	strncpy(addr.sun_path, av[1], sizeof(addr.sun_path));
+int
+main(void)
+{
+	skip_if_unavailable("/proc/self/fd/");
+
+	static const struct sockaddr_un addr = {
+		.sun_family = AF_UNIX,
+		.sun_path = TEST_SOCKET
+	};
 	struct sockaddr * const listen_sa = tail_memdup(&addr, sizeof(addr));
 
-	socklen_t * const len = tail_alloc(sizeof(socklen_t));
-	*len = offsetof(struct sockaddr_un, sun_path) + strlen(av[1]) + 1;
+	TAIL_ALLOC_OBJECT_CONST_PTR(socklen_t, len);
+	*len = offsetof(struct sockaddr_un, sun_path) + strlen(TEST_SOCKET) + 1;
 	if (*len > sizeof(addr))
 		*len = sizeof(addr);
 
@@ -61,17 +63,18 @@
 	printf("socket(AF_UNIX, SOCK_STREAM, 0) = %d<socket:[%lu]>\n",
 	       listen_fd, listen_inode);
 
-	(void) unlink(av[1]);
+	(void) unlink(TEST_SOCKET);
 	if (bind(listen_fd, listen_sa, *len))
 		perror_msg_and_skip("bind");
 	printf("bind(%d<socket:[%lu]>, {sa_family=AF_UNIX, sun_path=\"%s\"}"
-	       ", %u) = 0\n", listen_fd, listen_inode, av[1], (unsigned) *len);
+	       ", %u) = 0\n",
+	       listen_fd, listen_inode, TEST_SOCKET, (unsigned) *len);
 
 	if (listen(listen_fd, 1))
 		perror_msg_and_skip("listen");
 	printf("listen(%d<socket:[%lu]>, 1) = 0\n", listen_fd, listen_inode);
 
-	unsigned int * const optval = tail_alloc(sizeof(unsigned int));
+	TAIL_ALLOC_OBJECT_CONST_PTR(unsigned int, optval);
 	*len = sizeof(*optval);
 	if (getsockopt(listen_fd, SOL_SOCKET, SO_PASSCRED, optval, len))
 		perror_msg_and_fail("getsockopt");
@@ -85,7 +88,7 @@
 		perror_msg_and_fail("getsockname");
 	printf("getsockname(%d<socket:[%lu]>, {sa_family=AF_UNIX"
 	       ", sun_path=\"%s\"}, [%d->%d]) = 0\n", listen_fd, listen_inode,
-	       av[1], (int) sizeof(addr), (int) *len);
+	       TEST_SOCKET, (int) sizeof(addr), (int) *len);
 
 	int connect_fd = socket(AF_UNIX, SOCK_STREAM, 0);
 	if (connect_fd < 0)
@@ -98,7 +101,7 @@
 		perror_msg_and_fail("connect");
 	printf("connect(%d<socket:[%lu]>, {sa_family=AF_UNIX"
 	       ", sun_path=\"%s\"}, %u) = 0\n",
-	       connect_fd, connect_inode, av[1], (unsigned) *len);
+	       connect_fd, connect_inode, TEST_SOCKET, (unsigned) *len);
 
 	struct sockaddr * const accept_sa = tail_alloc(sizeof(addr));
 	memset(accept_sa, 0, sizeof(addr));
@@ -119,7 +122,7 @@
 		perror_msg_and_fail("getpeername");
 	printf("getpeername(%d<socket:[%lu]>, {sa_family=AF_UNIX"
 	       ", sun_path=\"%s\"}, [%d->%d]) = 0\n", connect_fd, connect_inode,
-	       av[1], (int) sizeof(addr), (int) *len);
+	       TEST_SOCKET, (int) sizeof(addr), (int) *len);
 
 	char text[] = "text";
 	assert(sendto(connect_fd, text, sizeof(text) - 1, MSG_DONTWAIT, NULL, 0)
@@ -163,14 +166,14 @@
 		perror_msg_and_fail("getsockname");
 	printf("getsockname(%d<socket:[%lu]>, {sa_family=AF_UNIX"
 	       ", sun_path=\"%s\"}, [%d->%d]) = 0\n",
-	       listen_fd, listen_inode, av[1],
+	       listen_fd, listen_inode, TEST_SOCKET,
 	       (int) sizeof(addr), (int) *len);
 
 	if (connect(connect_fd, listen_sa, *len))
 		perror_msg_and_fail("connect");
 	printf("connect(%d<socket:[%lu]>, {sa_family=AF_UNIX"
 	       ", sun_path=\"%s\"}, %u) = 0\n",
-	       connect_fd, connect_inode, av[1], (unsigned) *len);
+	       connect_fd, connect_inode, TEST_SOCKET, (unsigned) *len);
 
 	memset(accept_sa, 0, sizeof(addr));
 	*len = sizeof(addr);
@@ -192,7 +195,7 @@
 		perror_msg_and_fail("getpeername");
 	printf("getpeername(%d<socket:[%lu]>, {sa_family=AF_UNIX"
 	       ", sun_path=\"%s\"}, [%d->%d]) = 0\n",
-	       connect_fd, connect_inode, av[1],
+	       connect_fd, connect_inode, TEST_SOCKET,
 	       (int) sizeof(addr), (int) *len);
 
 	memset(accept_sa, 0, sizeof(addr));
@@ -224,7 +227,7 @@
 	assert(close(accept_fd) == 0);
 	printf("close(%d<socket:[%lu]>) = 0\n", accept_fd, accept_inode);
 
-	assert(unlink(av[1]) == 0);
+	assert(unlink(TEST_SOCKET) == 0);
 
 	assert(close(listen_fd) == 0);
 	printf("close(%d<socket:[%lu]>) = 0\n",
diff --git a/tests/net-y-unix.test b/tests/net-y-unix.test
index aec8159..fd3fd68 100755
--- a/tests/net-y-unix.test
+++ b/tests/net-y-unix.test
@@ -2,7 +2,7 @@
 #
 # Check decoding of network syscalls in -y mode.
 #
-# Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+# Copyright (c) 2016-2017 Dmitry V. Levin <[email protected]>
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -29,18 +29,11 @@
 
 . "${srcdir=.}/init.sh"
 
-# strace -y is implemented using /proc/self/fd
-[ -d /proc/self/fd/ ] ||
-	framework_skip_ '/proc/self/fd/ is not available'
-
 check_prog sed
 
-addr="$NAME-local-stream"
-run_prog "./$NAME" $addr > /dev/null
-
+run_prog > /dev/null
 run_strace -a20 -y -eclose,network $args > "$EXP"
+
 # Filter out close() calls made by ld.so and libc.
 sed -n '/socket/,$p' < "$LOG" > "$OUT"
-
 match_diff "$OUT" "$EXP"
-rm -f "$EXP" "$OUT"
diff --git a/tests/net-yy-inet.c b/tests/net-yy-inet.c
index f76f941..af1262e 100644
--- a/tests/net-yy-inet.c
+++ b/tests/net-yy-inet.c
@@ -2,6 +2,7 @@
  * This file is part of net-yy-inet strace test.
  *
  * Copyright (c) 2014-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -41,12 +42,14 @@
 int
 main(void)
 {
+	skip_if_unavailable("/proc/self/fd/");
+
 	const struct sockaddr_in addr = {
 		.sin_family = AF_INET,
 		.sin_addr.s_addr = htonl(INADDR_LOOPBACK)
 	};
 	struct sockaddr * const listen_sa = tail_memdup(&addr, sizeof(addr));
-	socklen_t * const len = tail_alloc(sizeof(socklen_t));
+	TAIL_ALLOC_OBJECT_CONST_PTR(socklen_t, len);
 	*len = sizeof(addr);
 
 	const int listen_fd = socket(AF_INET, SOCK_STREAM, 0);
@@ -77,7 +80,7 @@
 	       ", [%u]) = 0\n",
 	       listen_fd, listen_port, listen_port, (unsigned) *len);
 
-	unsigned int * const optval = tail_alloc(sizeof(unsigned int));
+	TAIL_ALLOC_OBJECT_CONST_PTR(unsigned int, optval);
 	*len = sizeof(*optval);
 	if (getsockopt(listen_fd, SOL_TCP, TCP_MAXSEG, optval, len))
 		perror_msg_and_fail("getsockopt");
diff --git a/tests/net-yy-inet.test b/tests/net-yy-inet.test
index 2ebf91f..6b527db 100755
--- a/tests/net-yy-inet.test
+++ b/tests/net-yy-inet.test
@@ -3,6 +3,7 @@
 # Check decoding of ip:port pairs associated with socket descriptors
 #
 # Copyright (c) 2014-2016 Dmitry V. Levin <[email protected]>
+# Copyright (c) 2016-2017 The strace developers.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -29,18 +30,12 @@
 
 . "${srcdir=.}/init.sh"
 
-# strace -yy is implemented using /proc/self/fd
-[ -d /proc/self/fd/ ] ||
-	framework_skip_ '/proc/self/fd/ is not available'
-
 check_prog sed
-run_prog ./netlink_inet_diag
 
-run_prog "./$NAME" > /dev/null
-
+run_prog ../netlink_inet_diag
+run_prog > /dev/null
 run_strace -a22 -yy -eclose,network $args > "$EXP"
+
 # Filter out close() calls made by ld.so and libc.
 sed -n '/socket/,$p' < "$LOG" > "$OUT"
-
 match_diff "$OUT" "$EXP"
-rm -f "$EXP" "$OUT"
diff --git a/tests/net-yy-netlink.c b/tests/net-yy-netlink.c
index 64d0efc..6539eda 100644
--- a/tests/net-yy-netlink.c
+++ b/tests/net-yy-netlink.c
@@ -1,7 +1,7 @@
 /*
  * This file is part of net-yy-netlink strace test.
  *
- * Copyright (c) 2013-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2013-2017 Dmitry V. Levin <[email protected]>
  * Copyright (c) 2016 Fabien Siron <[email protected]>
  * All rights reserved.
  *
@@ -47,13 +47,14 @@
 int
 main(void)
 {
-	unsigned magic = 1234;
+	skip_if_unavailable("/proc/self/fd/");
+
 	struct sockaddr_nl addr = {
 		.nl_family = AF_NETLINK,
-		.nl_pid = 1234
+		.nl_pid = getpid()
 	};
 	struct sockaddr *const sa = tail_memdup(&addr, sizeof(addr));
-	socklen_t * const len = tail_alloc(sizeof(socklen_t));
+	TAIL_ALLOC_OBJECT_CONST_PTR(socklen_t, len);
 	*len = sizeof(addr);
 
 	const int fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_SOCK_DIAG);
@@ -67,17 +68,17 @@
 		perror_msg_and_skip("bind");
 	printf("bind(%d<NETLINK:[%lu]>, {sa_family=AF_NETLINK"
 	       ", nl_pid=%u, nl_groups=00000000}, %u) = 0\n",
-	       fd, inode, magic, (unsigned) *len);
+	       fd, inode, addr.nl_pid, (unsigned) *len);
 
 	if (getsockname(fd, sa, len))
 		perror_msg_and_fail("getsockname");
 	printf("getsockname(%d<NETLINK:[SOCK_DIAG:%u]>, {sa_family=AF_NETLINK"
 	       ", nl_pid=%u, nl_groups=00000000}, [%u]) = 0\n",
-	       fd, magic, magic, (unsigned) *len);
+	       fd, addr.nl_pid, addr.nl_pid, (unsigned) *len);
 
 	if (close(fd))
 		perror_msg_and_fail("close");
-	printf("close(%d<NETLINK:[SOCK_DIAG:%u]>) = 0\n", fd, magic);
+	printf("close(%d<NETLINK:[SOCK_DIAG:%u]>) = 0\n", fd, addr.nl_pid);
 
 	puts("+++ exited with 0 +++");
 	return 0;
diff --git a/tests/net-yy-netlink.test b/tests/net-yy-netlink.test
index bff1d86..3a07e45 100755
--- a/tests/net-yy-netlink.test
+++ b/tests/net-yy-netlink.test
@@ -6,6 +6,7 @@
 # Copyright (c) 2014 Masatake YAMATO <[email protected]>
 # Copyright (c) 2014-2016 Dmitry V. Levin <[email protected]>
 # Copyright (c) 2016 Fabien Siron <[email protected]>
+# Copyright (c) 2016-2017 The strace developers.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -32,18 +33,12 @@
 
 . "${srcdir=.}/init.sh"
 
-# strace -yy is implemented using /proc/self/fd
-[ -d /proc/self/fd/ ] ||
-	framework_skip_ '/proc/self/fd/ is not available'
-
 check_prog sed
-run_prog ./netlink_netlink_diag
 
-run_prog "./$NAME" > /dev/null
-
+run_prog ../netlink_netlink_diag
+run_prog > /dev/null
 run_strace -a22 -yy -eclose,network $args > "$EXP"
+
 # Filter out close() calls made by ld.so and libc.
 sed -n '/socket/,$p' < "$LOG" > "$OUT"
-
 match_diff "$OUT" "$EXP"
-rm -f "$EXP" "$OUT"
diff --git a/tests/net-yy-unix.c b/tests/net-yy-unix.c
index 63637bd..f27cdc0 100644
--- a/tests/net-yy-unix.c
+++ b/tests/net-yy-unix.c
@@ -1,7 +1,7 @@
 /*
  * This file is part of net-yy-unix strace test.
  *
- * Copyright (c) 2013-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2013-2017 Dmitry V. Levin <[email protected]>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -38,19 +38,21 @@
 #include <sys/socket.h>
 #include <sys/un.h>
 
-int
-main(int ac, const char **av)
-{
-	assert(ac == 2);
+#define TEST_SOCKET "net-yy-unix.socket"
 
-	struct sockaddr_un addr = { .sun_family = AF_UNIX };
-	unsigned int sun_path_len = strlen(av[1]);
-	assert(sun_path_len > 0 && sun_path_len <= sizeof(addr.sun_path));
-	strncpy(addr.sun_path, av[1], sizeof(addr.sun_path));
+int
+main(void)
+{
+	skip_if_unavailable("/proc/self/fd/");
+
+	struct sockaddr_un addr = {
+		.sun_family = AF_UNIX,
+		.sun_path = TEST_SOCKET
+	};
 	struct sockaddr * const listen_sa = tail_memdup(&addr, sizeof(addr));
 
-	socklen_t * const len = tail_alloc(sizeof(socklen_t));
-	*len = offsetof(struct sockaddr_un, sun_path) + strlen(av[1]) + 1;
+	TAIL_ALLOC_OBJECT_CONST_PTR(socklen_t, len);
+	*len = offsetof(struct sockaddr_un, sun_path) + strlen(TEST_SOCKET) + 1;
 	if (*len > sizeof(addr))
 		*len = sizeof(addr);
 
@@ -61,24 +63,25 @@
 	printf("socket(AF_UNIX, SOCK_STREAM, 0) = %d<UNIX:[%lu]>\n",
 	       listen_fd, listen_inode);
 
-	(void) unlink(av[1]);
+	(void) unlink(TEST_SOCKET);
 	if (bind(listen_fd, listen_sa, *len))
 		perror_msg_and_skip("bind");
 	printf("bind(%d<UNIX:[%lu]>, {sa_family=AF_UNIX, sun_path=\"%s\"}"
-	       ", %u) = 0\n", listen_fd, listen_inode, av[1], (unsigned) *len);
+	       ", %u) = 0\n",
+	       listen_fd, listen_inode, TEST_SOCKET, (unsigned) *len);
 
 	if (listen(listen_fd, 1))
 		perror_msg_and_skip("listen");
 	printf("listen(%d<UNIX:[%lu,\"%s\"]>, 1) = 0\n",
-	       listen_fd, listen_inode, av[1]);
+	       listen_fd, listen_inode, TEST_SOCKET);
 
-	unsigned int * const optval = tail_alloc(sizeof(unsigned int));
+	TAIL_ALLOC_OBJECT_CONST_PTR(unsigned int, optval);
 	*len = sizeof(*optval);
 	if (getsockopt(listen_fd, SOL_SOCKET, SO_PASSCRED, optval, len))
 		perror_msg_and_fail("getsockopt");
 	printf("getsockopt(%d<UNIX:[%lu,\"%s\"]>, SOL_SOCKET, SO_PASSCRED"
 	       ", [%u], [%u]) = 0\n",
-	       listen_fd, listen_inode, av[1], *optval, (unsigned) *len);
+	       listen_fd, listen_inode, TEST_SOCKET, *optval, (unsigned) *len);
 
 	memset(listen_sa, 0, sizeof(addr));
 	*len = sizeof(addr);
@@ -86,7 +89,7 @@
 		perror_msg_and_fail("getsockname");
 	printf("getsockname(%d<UNIX:[%lu,\"%s\"]>, {sa_family=AF_UNIX"
 	       ", sun_path=\"%s\"}, [%d->%d]) = 0\n", listen_fd, listen_inode,
-	       av[1], av[1], (int) sizeof(addr), (int) *len);
+	       TEST_SOCKET, TEST_SOCKET, (int) sizeof(addr), (int) *len);
 
 	int connect_fd = socket(AF_UNIX, SOCK_STREAM, 0);
 	if (connect_fd < 0)
@@ -99,7 +102,7 @@
 		perror_msg_and_fail("connect");
 	printf("connect(%d<UNIX:[%lu]>, {sa_family=AF_UNIX"
 	       ", sun_path=\"%s\"}, %u) = 0\n",
-	       connect_fd, connect_inode, av[1], (unsigned) *len);
+	       connect_fd, connect_inode, TEST_SOCKET, (unsigned) *len);
 
 	struct sockaddr * const accept_sa = tail_alloc(sizeof(addr));
 	memset(accept_sa, 0, sizeof(addr));
@@ -110,8 +113,9 @@
 	unsigned long accept_inode = inode_of_sockfd(accept_fd);
 	printf("accept(%d<UNIX:[%lu,\"%s\"]>, {sa_family=AF_UNIX}"
 	       ", [%d->%d]) = %d<UNIX:[%lu->%lu,\"%s\"]>\n",
-	       listen_fd, listen_inode, av[1], (int) sizeof(addr), (int) *len,
-	       accept_fd, accept_inode, connect_inode, av[1]);
+	       listen_fd, listen_inode, TEST_SOCKET,
+	       (int) sizeof(addr), (int) *len,
+	       accept_fd, accept_inode, connect_inode, TEST_SOCKET);
 
 	memset(listen_sa, 0, sizeof(addr));
 	*len = sizeof(addr);
@@ -120,7 +124,7 @@
 	printf("getpeername(%d<UNIX:[%lu->%lu]>, {sa_family=AF_UNIX"
 	       ", sun_path=\"%s\"}, [%d->%d]) = 0\n",
 	       connect_fd, connect_inode,
-	       accept_inode, av[1], (int) sizeof(addr), (int) *len);
+	       accept_inode, TEST_SOCKET, (int) sizeof(addr), (int) *len);
 
 	char text[] = "text";
 	assert(sendto(connect_fd, text, sizeof(text) - 1, MSG_DONTWAIT, NULL, 0)
@@ -134,7 +138,7 @@
 	       == sizeof(text) - 1);
 	printf("recvfrom(%d<UNIX:[%lu->%lu,\"%s\"]>, \"%s\", %u, MSG_DONTWAIT"
 	       ", NULL, NULL) = %u\n",
-	       accept_fd, accept_inode, connect_inode, av[1], text,
+	       accept_fd, accept_inode, connect_inode, TEST_SOCKET, text,
 	       (unsigned) sizeof(text) - 1, (unsigned) sizeof(text) - 1);
 
 	assert(close(connect_fd) == 0);
@@ -143,7 +147,7 @@
 
 	assert(close(accept_fd) == 0);
 	printf("close(%d<UNIX:[%lu->%lu,\"%s\"]>) = 0\n",
-	       accept_fd, accept_inode, connect_inode, av[1]);
+	       accept_fd, accept_inode, connect_inode, TEST_SOCKET);
 
 	connect_fd = socket(AF_UNIX, SOCK_STREAM, 0);
 	if (connect_fd < 0)
@@ -166,13 +170,13 @@
 		perror_msg_and_fail("getsockname");
 	printf("getsockname(%d<UNIX:[%lu,\"%s\"]>, {sa_family=AF_UNIX"
 	       ", sun_path=\"%s\"}, [%d->%d]) = 0\n", listen_fd, listen_inode,
-	       av[1], av[1], (int) sizeof(addr), (int) *len);
+	       TEST_SOCKET, TEST_SOCKET, (int) sizeof(addr), (int) *len);
 
 	if (connect(connect_fd, listen_sa, *len))
 		perror_msg_and_fail("connect");
 	printf("connect(%d<UNIX:[%lu]>, {sa_family=AF_UNIX"
 	       ", sun_path=\"%s\"}, %u) = 0\n",
-	       connect_fd, connect_inode, av[1], (unsigned) *len);
+	       connect_fd, connect_inode, TEST_SOCKET, (unsigned) *len);
 
 	memset(accept_sa, 0, sizeof(addr));
 	*len = sizeof(addr);
@@ -184,9 +188,9 @@
 		((struct sockaddr_un *) accept_sa) -> sun_path + 1;
 	printf("accept(%d<UNIX:[%lu,\"%s\"]>, {sa_family=AF_UNIX"
 	       ", sun_path=@\"%s\"}, [%d->%d]) = %d<UNIX:[%lu->%lu,\"%s\"]>\n",
-	       listen_fd, listen_inode, av[1], sun_path1,
+	       listen_fd, listen_inode, TEST_SOCKET, sun_path1,
 	       (int) sizeof(addr), (int) *len,
-	       accept_fd, accept_inode, connect_inode, av[1]);
+	       accept_fd, accept_inode, connect_inode, TEST_SOCKET);
 
 	memset(listen_sa, 0, sizeof(addr));
 	*len = sizeof(addr);
@@ -194,7 +198,7 @@
 		perror_msg_and_fail("getpeername");
 	printf("getpeername(%d<UNIX:[%lu->%lu,@\"%s\"]>, {sa_family=AF_UNIX"
 	       ", sun_path=\"%s\"}, [%d->%d]) = 0\n", connect_fd, connect_inode,
-	       accept_inode, sun_path1, av[1], (int) sizeof(addr), (int) *len);
+	       accept_inode, sun_path1, TEST_SOCKET, (int) sizeof(addr), (int) *len);
 
 	assert(sendto(connect_fd, text, sizeof(text) - 1, MSG_DONTWAIT, NULL, 0)
 	       == sizeof(text) - 1);
@@ -207,7 +211,7 @@
 	       == sizeof(text) - 1);
 	printf("recvfrom(%d<UNIX:[%lu->%lu,\"%s\"]>, \"%s\", %u, MSG_DONTWAIT"
 	       ", NULL, NULL) = %u\n",
-	       accept_fd, accept_inode, connect_inode, av[1], text,
+	       accept_fd, accept_inode, connect_inode, TEST_SOCKET, text,
 	       (unsigned) sizeof(text) - 1, (unsigned) sizeof(text) - 1);
 
 	assert(close(connect_fd) == 0);
@@ -216,13 +220,13 @@
 
 	assert(close(accept_fd) == 0);
 	printf("close(%d<UNIX:[%lu->%lu,\"%s\"]>) = 0\n",
-	       accept_fd, accept_inode, connect_inode, av[1]);
+	       accept_fd, accept_inode, connect_inode, TEST_SOCKET);
 
-	assert(unlink(av[1]) == 0);
+	assert(unlink(TEST_SOCKET) == 0);
 
 	assert(close(listen_fd) == 0);
 	printf("close(%d<UNIX:[%lu,\"%s\"]>) = 0\n",
-	       listen_fd, listen_inode, av[1]);
+	       listen_fd, listen_inode, TEST_SOCKET);
 
 	puts("+++ exited with 0 +++");
 	return 0;
diff --git a/tests/net-yy-unix.test b/tests/net-yy-unix.test
index b82761c..59323a4 100755
--- a/tests/net-yy-unix.test
+++ b/tests/net-yy-unix.test
@@ -4,7 +4,7 @@
 # associated with unix domain socket descriptors.
 #
 # Copyright (c) 2014 Masatake YAMATO <[email protected]>
-# Copyright (c) 2014-2016 Dmitry V. Levin <[email protected]>
+# Copyright (c) 2014-2017 Dmitry V. Levin <[email protected]>
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -31,19 +31,12 @@
 
 . "${srcdir=.}/init.sh"
 
-# strace -yy is implemented using /proc/self/fd
-[ -d /proc/self/fd/ ] ||
-	framework_skip_ '/proc/self/fd/ is not available'
-
 check_prog sed
-run_prog ./netlink_unix_diag
 
-addr="$NAME-local-stream"
-run_prog "./$NAME" $addr > /dev/null
-
+run_prog ../netlink_unix_diag
+run_prog > /dev/null
 run_strace -a22 -yy -eclose,network $args > "$EXP"
+
 # Filter out close() calls made by ld.so and libc.
 sed -n '/socket/,$p' < "$LOG" > "$OUT"
-
 match_diff "$OUT" "$EXP"
-rm -f "$EXP" "$OUT"
diff --git a/tests/net.test b/tests/net.test
index cf943ff..8320707 100755
--- a/tests/net.test
+++ b/tests/net.test
@@ -4,8 +4,8 @@
 
 . "${srcdir=.}/init.sh"
 
-run_prog ./net-accept-connect net-local-stream
-run_strace_merge -enetwork $args
+run_prog ../net-accept-connect net-local-stream
+run_strace_merge -e%network $args
 match_grep
 
 exit 0
diff --git a/tests/netlink_protocol.c b/tests/netlink_protocol.c
index 34e114b..35f954f 100644
--- a/tests/netlink_protocol.c
+++ b/tests/netlink_protocol.c
@@ -1,7 +1,7 @@
 /*
  * Check decoding of netlink protocol.
  *
- * Copyright (c) 2014-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2014-2017 Dmitry V. Levin <[email protected]>
  * Copyright (c) 2016 Fabien Siron <[email protected]>
  * All rights reserved.
  *
@@ -199,6 +199,121 @@
 	printf(", ...], %u, MSG_DONTWAIT, NULL, 0) = %s\n", msg_len, errstr);
 }
 
+static void
+test_nlmsgerr(const int fd)
+{
+	struct nlmsgerr *err;
+	struct nlmsghdr *nlh;
+	void *const nlh0 = tail_alloc(NLMSG_HDRLEN);
+	long rc;
+
+	/* error message without enough room for the error code */
+	nlh = nlh0;
+	nlh->nlmsg_len = NLMSG_HDRLEN + 4;
+	nlh->nlmsg_type = NLMSG_ERROR;
+	nlh->nlmsg_flags = NLM_F_REQUEST;
+	nlh->nlmsg_seq = 0;
+	nlh->nlmsg_pid = 0;
+
+	rc = sendto(fd, nlh, nlh->nlmsg_len, MSG_DONTWAIT, NULL, 0);
+	printf("sendto(%d, {{len=%u, type=NLMSG_ERROR, flags=NLM_F_REQUEST"
+	       ", seq=0, pid=0}, %p}, %u, MSG_DONTWAIT, NULL, 0) = %s\n",
+	       fd, nlh->nlmsg_len, nlh0 + NLMSG_HDRLEN,
+	       nlh->nlmsg_len, sprintrc(rc));
+
+	nlh->nlmsg_len = NLMSG_HDRLEN + 2;
+	nlh = nlh0 - 2;
+	memmove(nlh, nlh0, sizeof(*nlh));
+	memcpy(NLMSG_DATA(nlh), "42", 2);
+
+	rc = sendto(fd, nlh, NLMSG_HDRLEN + 2, MSG_DONTWAIT, NULL, 0);
+	printf("sendto(%d, {{len=%u, type=NLMSG_ERROR, flags=NLM_F_REQUEST"
+	       ", seq=0, pid=0}, \"42\"}, %u, MSG_DONTWAIT, NULL, 0) = %s\n",
+	       fd, NLMSG_HDRLEN + 2, NLMSG_HDRLEN + 2, sprintrc(rc));
+
+	/* error message with room for the error code only */
+	nlh = nlh0 - sizeof(err->error);
+	nlh->nlmsg_len = NLMSG_HDRLEN + sizeof(err->error);
+	nlh->nlmsg_type = NLMSG_ERROR;
+	nlh->nlmsg_flags = NLM_F_REQUEST;
+	nlh->nlmsg_seq = 0;
+	nlh->nlmsg_pid = 0;
+	err = NLMSG_DATA(nlh);
+	err->error = 42;
+
+	rc = sendto(fd, nlh, nlh->nlmsg_len, MSG_DONTWAIT, NULL, 0);
+	printf("sendto(%d, {{len=%u, type=NLMSG_ERROR, flags=NLM_F_REQUEST"
+	       ", seq=0, pid=0}, {error=42}}, %u, MSG_DONTWAIT, NULL, 0)"
+	       " = %s\n", fd, nlh->nlmsg_len, nlh->nlmsg_len, sprintrc(rc));
+
+	err->error = -1;
+
+	rc = sendto(fd, nlh, nlh->nlmsg_len, MSG_DONTWAIT, NULL, 0);
+	printf("sendto(%d, {{len=%u, type=NLMSG_ERROR, flags=NLM_F_REQUEST"
+	       ", seq=0, pid=0}, {error=-EPERM}}, %u, MSG_DONTWAIT, NULL, 0)"
+	       " = %s\n", fd, nlh->nlmsg_len, nlh->nlmsg_len, sprintrc(rc));
+
+	err->error = -32767;
+	nlh->nlmsg_len += sizeof(err->msg.nlmsg_len);
+
+	rc = sendto(fd, nlh, nlh->nlmsg_len, MSG_DONTWAIT, NULL, 0);
+	printf("sendto(%d, {{len=%u, type=NLMSG_ERROR, flags=NLM_F_REQUEST"
+	       ", seq=0, pid=0}, {error=-32767, msg=%p}}"
+	       ", %u, MSG_DONTWAIT, NULL, 0) = %s\n",
+	       fd, nlh->nlmsg_len, nlh0 + NLMSG_HDRLEN,
+	       nlh->nlmsg_len, sprintrc(rc));
+
+	/* error message with room for the error code and a header */
+	nlh = nlh0 - sizeof(*err);
+	nlh->nlmsg_len = NLMSG_HDRLEN + sizeof(*err);
+	nlh->nlmsg_type = NLMSG_ERROR;
+	nlh->nlmsg_flags = NLM_F_REQUEST;
+	nlh->nlmsg_seq = 0;
+	nlh->nlmsg_pid = 0;
+	err = NLMSG_DATA(nlh);
+	err->error = -13;
+	err->msg.nlmsg_len = NLMSG_HDRLEN;
+	err->msg.nlmsg_type = NLMSG_NOOP;
+	err->msg.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST;
+	err->msg.nlmsg_seq = 42;
+	err->msg.nlmsg_pid = 1234;
+
+	rc = sendto(fd, nlh, nlh->nlmsg_len, MSG_DONTWAIT, NULL, 0);
+	printf("sendto(%d, {{len=%u, type=NLMSG_ERROR, flags=NLM_F_REQUEST"
+	       ", seq=0, pid=0}, {error=-EACCES"
+	       ", msg={{len=%u, type=NLMSG_NOOP, flags=NLM_F_REQUEST|0x%x"
+	       ", seq=%u, pid=%u}}}}, %u, MSG_DONTWAIT, NULL, 0) = %s\n",
+	       fd, nlh->nlmsg_len, err->msg.nlmsg_len, NLM_F_DUMP,
+	       err->msg.nlmsg_seq, err->msg.nlmsg_pid,
+	       nlh->nlmsg_len, sprintrc(rc));
+
+	/* error message with room for the error code, a header, and some data */
+	nlh = nlh0 - sizeof(*err) - 4;
+	nlh->nlmsg_len = NLMSG_HDRLEN + sizeof(*err) + 4;
+	nlh->nlmsg_type = NLMSG_ERROR;
+	nlh->nlmsg_flags = NLM_F_REQUEST;
+	nlh->nlmsg_seq = 0;
+	nlh->nlmsg_pid = 0;
+	err = NLMSG_DATA(nlh);
+	err->error = -13;
+	err->msg.nlmsg_len = NLMSG_HDRLEN + 4;
+	err->msg.nlmsg_type = NLMSG_NOOP;
+	err->msg.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST;
+	err->msg.nlmsg_seq = 421;
+	err->msg.nlmsg_pid = 12345;
+	memcpy(NLMSG_DATA(&err->msg), "abcd", 4);
+
+	rc = sendto(fd, nlh, nlh->nlmsg_len, MSG_DONTWAIT, NULL, 0);
+	printf("sendto(%d, {{len=%u, type=NLMSG_ERROR, flags=NLM_F_REQUEST"
+	       ", seq=0, pid=0}, {error=-EACCES"
+	       ", msg={{len=%u, type=NLMSG_NOOP, flags=NLM_F_REQUEST|0x%x"
+	       ", seq=%u, pid=%u}, \"abcd\"}}}, %u, MSG_DONTWAIT, NULL, 0)"
+	       " = %s\n",
+	       fd, nlh->nlmsg_len, err->msg.nlmsg_len, NLM_F_DUMP,
+	       err->msg.nlmsg_seq, err->msg.nlmsg_pid,
+	       nlh->nlmsg_len, sprintrc(rc));
+}
+
 int main(void)
 {
 	struct sockaddr_nl addr;
@@ -227,6 +342,7 @@
 	free(path);
 
 	send_query(fd);
+	test_nlmsgerr(fd);
 
 	printf("+++ exited with 0 +++\n");
 
diff --git a/tests/netlink_protocol.gen.test b/tests/netlink_protocol.gen.test
new file mode 100755
index 0000000..9a132fa
--- /dev/null
+++ b/tests/netlink_protocol.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (netlink_protocol -e trace=%network); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -e trace=%network
diff --git a/tests/netlink_protocol.test b/tests/netlink_protocol.test
deleted file mode 100755
index ab2bb1e..0000000
--- a/tests/netlink_protocol.test
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-
-# Check decoding of netlink protocol.
-
-. "${srcdir=.}/init.sh"
-
-# getfdproto is implemented using /proc/self/fd
-[ -d /proc/self/fd/ ] ||
-    framework_skip_ '/proc/self/fd/ is not available'
-
-run_strace_match_diff -e trace=network
diff --git a/tests/newfstatat.gen.test b/tests/newfstatat.gen.test
new file mode 100755
index 0000000..40ec797
--- /dev/null
+++ b/tests/newfstatat.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (newfstatat -a32 -v -P stat.sample -P /dev/full); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a32 -v -P stat.sample -P /dev/full
diff --git a/tests/newfstatat.test b/tests/newfstatat.test
deleted file mode 100755
index 6d83ec0..0000000
--- a/tests/newfstatat.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check newfstatat syscall decoding.
-
-. "${srcdir=.}/statx.sh"
diff --git a/tests/nsyscalls.c b/tests/nsyscalls.c
index aecf7aa..7fda5ba 100644
--- a/tests/nsyscalls.c
+++ b/tests/nsyscalls.c
@@ -2,6 +2,7 @@
  * Check decoding of out-of-range syscalls.
  *
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -41,6 +42,13 @@
 #define TP 0
 #define TS 0
 #define TM 0
+#define TST 0
+#define TLST 0
+#define TFST 0
+#define TSTA 0
+#define TSF 0
+#define TFSF 0
+#define TSFA 0
 #define NF 0
 #define MA 0
 #define SI 0
diff --git a/tests/old_mmap.gen.test b/tests/old_mmap.gen.test
new file mode 100755
index 0000000..1913eec
--- /dev/null
+++ b/tests/old_mmap.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (old_mmap -a11 -e trace=mmap); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a11 -e trace=mmap
diff --git a/tests/old_mmap.test b/tests/old_mmap.test
deleted file mode 100755
index af776ff..0000000
--- a/tests/old_mmap.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of "old mmap" edition of mmap syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a11 -e trace=mmap
diff --git a/tests/oldfstat.c b/tests/oldfstat.c
index f5a9441..353614c 100644
--- a/tests/oldfstat.c
+++ b/tests/oldfstat.c
@@ -3,6 +3,7 @@
  *
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff --git a/tests/oldfstat.gen.test b/tests/oldfstat.gen.test
new file mode 100755
index 0000000..2b48b39
--- /dev/null
+++ b/tests/oldfstat.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (oldfstat -a18 -v -P stat.sample); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a18 -v -P stat.sample
diff --git a/tests/oldfstat.test b/tests/oldfstat.test
deleted file mode 100755
index 66a1056..0000000
--- a/tests/oldfstat.test
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/sh
-
-# Check oldfstat syscall decoding.
-
-. "${srcdir=.}/init.sh"
-
-# strace -P is implemented using /proc/self/fd
-[ -d /proc/self/fd/ ] ||
-	framework_skip_ '/proc/self/fd/ is not available'
-
-syscall=$NAME
-run_prog > /dev/null
-sample=$syscall.sample
-> "$sample"
-run_strace -ve$syscall -P$sample -a21 $args > "$OUT"
-match_diff "$LOG" "$OUT"
-rm -f "$OUT"
-
-exit 0
diff --git a/tests/oldlstat.c b/tests/oldlstat.c
index 6613237..6f07531 100644
--- a/tests/oldlstat.c
+++ b/tests/oldlstat.c
@@ -3,6 +3,7 @@
  *
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff --git a/tests/oldlstat.gen.test b/tests/oldlstat.gen.test
new file mode 100755
index 0000000..3202b92
--- /dev/null
+++ b/tests/oldlstat.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (oldlstat -a32 -v -P stat.sample -P /dev/full); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a32 -v -P stat.sample -P /dev/full
diff --git a/tests/oldlstat.test b/tests/oldlstat.test
deleted file mode 100755
index a0f9ab9..0000000
--- a/tests/oldlstat.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check oldlstat syscall decoding.
-
-. "${srcdir=.}/statx.sh"
diff --git a/tests/oldstat.c b/tests/oldstat.c
index d06e2bc..ddacd24 100644
--- a/tests/oldstat.c
+++ b/tests/oldstat.c
@@ -3,6 +3,7 @@
  *
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff --git a/tests/oldstat.gen.test b/tests/oldstat.gen.test
new file mode 100755
index 0000000..f265ac5
--- /dev/null
+++ b/tests/oldstat.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (oldstat -a32 -v -P stat.sample -P /dev/full); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a32 -v -P stat.sample -P /dev/full
diff --git a/tests/oldstat.test b/tests/oldstat.test
deleted file mode 100755
index 42d70f7..0000000
--- a/tests/oldstat.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check oldstat syscall decoding.
-
-. "${srcdir=.}/statx.sh"
diff --git a/tests/open.gen.test b/tests/open.gen.test
new file mode 100755
index 0000000..eb931a3
--- /dev/null
+++ b/tests/open.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (open -a30 -P $NAME.sample); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a30 -P $NAME.sample
diff --git a/tests/open.test b/tests/open.test
deleted file mode 100755
index 6df19cb..0000000
--- a/tests/open.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check open syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a30 -P $NAME.sample
diff --git a/tests/openat.gen.test b/tests/openat.gen.test
new file mode 100755
index 0000000..fe29e1c
--- /dev/null
+++ b/tests/openat.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (openat -P $NAME.sample); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -P $NAME.sample
diff --git a/tests/openat.test b/tests/openat.test
deleted file mode 100755
index 68c4cee..0000000
--- a/tests/openat.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check openat syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -P $NAME.sample
diff --git a/tests/opipe.test b/tests/opipe.test
index 90e6838..f622045 100755
--- a/tests/opipe.test
+++ b/tests/opipe.test
@@ -6,11 +6,9 @@
 
 check_prog grep
 run_prog grep chdir $srcdir/umovestr.expected > "$EXP"
-run_prog ./umovestr
+run_prog ../umovestr
 
-> "$LOG" || fail_ "failed to write $LOG"
 $STRACE -o "|cat > $LOG && $SLEEP_A_BIT && grep chdir < $LOG > $OUT" -e chdir $args ||
 	dump_log_and_fail_with "$STRACE $args failed"
 
 match_diff "$OUT" "$EXP"
-rm -f "$EXP" "$OUT"
diff --git a/tests/options-syntax.test b/tests/options-syntax.test
index 592b0e0..4c778b3 100755
--- a/tests/options-syntax.test
+++ b/tests/options-syntax.test
@@ -3,6 +3,7 @@
 # Check strace options syntax.
 #
 # Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+# Copyright (c) 2016-2017 The strace developers.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -39,6 +40,16 @@
 			"strace $* failed to print expected diagnostics"
 }
 
+check_exit_status_and_stderr_using_grep()
+{
+	$STRACE "$@" 2> "$LOG" &&
+		dump_log_and_fail_with \
+			"strace $* failed to handle the error properly"
+	match_grep "$LOG" "$EXP" ||
+		dump_log_and_fail_with \
+			"strace $* failed to print expected diagnostics"
+}
+
 strace_exp="${STRACE##* }"
 
 check_e()
@@ -50,6 +61,15 @@
 	check_exit_status_and_stderr "$@"
 }
 
+check_e_using_grep()
+{
+	local pattern="$1"; shift
+	cat > "$EXP" << __EOF__
+$strace_exp: $pattern
+__EOF__
+	check_exit_status_and_stderr_using_grep "$@"
+}
+
 check_h()
 {
 	local pattern="$1"; shift
@@ -72,6 +92,7 @@
 check_e "invalid system call '-3'" -etrace=-3
 check_e "invalid system call '-4'" -e trace=-4
 check_e "invalid system call '-5'" -e trace=1,-5
+check_e "invalid system call '/non_syscall'" -e trace=/non_syscall
 check_e "invalid system call '2147483647'" -e 2147483647
 check_e "invalid system call '2147483648'" -e 2147483648
 check_e "invalid system call '4294967295'" -e 4294967295
@@ -88,6 +109,12 @@
 check_e "invalid descriptor '!'" -eread='0,!'
 check_e "invalid descriptor '!,'" -ewrite='!,'
 
+check_e_using_grep 'regcomp: \+id: [[:alpha:]].+' -e trace='/+id'
+check_e_using_grep 'regcomp: \*id: [[:alpha:]].+' -e trace='/*id'
+check_e_using_grep 'regcomp: \{id: [[:alpha:]].+' -e trace='/{id'
+check_e_using_grep 'regcomp: \(id: [[:alpha:]].+' -e trace='/(id'
+check_e_using_grep 'regcomp: \[id: [[:alpha:]].+' -e trace='/[id'
+
 check_h 'must have PROG [ARGS] or -p PID'
 check_h 'PROG [ARGS] must be specified with -D' -D -p $$
 check_h '-c and -C are mutually exclusive' -c -C true
@@ -144,5 +171,3 @@
 [ -z "$args" ] ||
 	dump_log_and_fail_with \
 		"strace $args failed to print expected diagnostics"
-
-rm -f "$EXP"
diff --git a/tests/osf_utimes.c b/tests/osf_utimes.c
new file mode 100644
index 0000000..7ac083e
--- /dev/null
+++ b/tests/osf_utimes.c
@@ -0,0 +1,45 @@
+/*
+ * Check decoding of osf_utimes syscall.
+ *
+ * Copyright (c) 2015-2017 Dmitry V. Levin <[email protected]>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "tests.h"
+#include <asm/unistd.h>
+
+#ifdef __NR_osf_utimes
+
+# define TEST_SYSCALL_NR	__NR_osf_utimes
+# define TEST_SYSCALL_STR	"osf_utimes"
+# define TEST_STRUCT		struct timeval32
+struct timeval32 { int tv_sec, tv_usec; };
+# include "xutimes.c"
+
+#else
+
+SKIP_MAIN_UNDEFINED("__NR_osf_utimes")
+
+#endif
diff --git a/tests/osf_utimes.gen.test b/tests/osf_utimes.gen.test
new file mode 100755
index 0000000..b6be305
--- /dev/null
+++ b/tests/osf_utimes.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (osf_utimes -a21); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a21
diff --git a/tests/pause.gen.test b/tests/pause.gen.test
new file mode 100755
index 0000000..76492b6
--- /dev/null
+++ b/tests/pause.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (pause -a8 -esignal=none); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a8 -esignal=none
diff --git a/tests/pause.test b/tests/pause.test
deleted file mode 100755
index c5fdacd..0000000
--- a/tests/pause.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of pause syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a8 -esignal=none
diff --git a/tests/pc.test b/tests/pc.test
index beadb7d..af09701 100755
--- a/tests/pc.test
+++ b/tests/pc.test
@@ -3,6 +3,7 @@
 # Check -i option.
 #
 # Copyright (c) 2015 Dmitry V. Levin <[email protected]>
+# Copyright (c) 2015-2017 The strace developers.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -47,15 +48,11 @@
 [ -n "$addr" ] ||
 	dump_log_and_fail_with
 
-EXPECTED="$LOG.expected"
-cat > "$EXPECTED" << __EOF__
+cat > "$EXP" << __EOF__
 \\[[[:xdigit:]]{$len}\\] munmap\\(0x[[:xdigit:]]+, 0\\) += -1 .*
 \\[pid +$pid\\] \\[$ip\\] --- SIGSEGV \\{si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0x$addr\\} ---
 \\[pid +$pid\\] \\[\\?{$len}\\] \\+\\+\\+ killed by SIGSEGV( \\(core dumped\\))? \\+\\+\\+
 \\[\\?{$len}\\] \\+\\+\\+ exited with 0 \\+\\+\\+
 __EOF__
 
-match_grep "$LOG" "$EXPECTED"
-rm -f "$EXPECTED"
-
-exit 0
+match_grep "$LOG" "$EXP"
diff --git a/tests/perf_event_open.c b/tests/perf_event_open.c
index 0ffea29..3f544a6 100644
--- a/tests/perf_event_open.c
+++ b/tests/perf_event_open.c
@@ -2,6 +2,7 @@
  * Check verbose decoding of perf_event_open syscall.
  *
  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -681,7 +682,7 @@
 		ATTR_REC(attr_big_size),
 	};
 
-	struct perf_event_attr *small_attr = tail_alloc(sizeof(*small_attr));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct perf_event_attr, small_attr);
 
 	struct {
 		struct perf_event_attr *attr;
diff --git a/tests/perf_event_open.gen.test b/tests/perf_event_open.gen.test
new file mode 100755
index 0000000..85336c3
--- /dev/null
+++ b/tests/perf_event_open.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (perf_event_open -a1); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a1
diff --git a/tests/perf_event_open.test b/tests/perf_event_open.test
deleted file mode 100755
index 499134b..0000000
--- a/tests/perf_event_open.test
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/sh
-
-# Check perf_event_open syscall decoding.
-
-. "${srcdir=.}/init.sh"
-
-run_strace_match_diff -a1
diff --git a/tests/perf_event_open_nonverbose.c b/tests/perf_event_open_nonverbose.c
index 45d7c8f..b67715c 100644
--- a/tests/perf_event_open_nonverbose.c
+++ b/tests/perf_event_open_nonverbose.c
@@ -2,6 +2,7 @@
  * Check decoding of perf_event_open syscall.
  *
  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -62,7 +63,7 @@
 int
 main(void)
 {
-	struct perf_event_attr *attr = tail_alloc(sizeof(*attr));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct perf_event_attr, attr);
 
 	attr->type = PERF_TYPE_HARDWARE;
 	attr->size = sizeof(*attr);
diff --git a/tests/perf_event_open_nonverbose.gen.test b/tests/perf_event_open_nonverbose.gen.test
new file mode 100755
index 0000000..f1ed333
--- /dev/null
+++ b/tests/perf_event_open_nonverbose.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (perf_event_open_nonverbose -a34 -e verbose=none -e trace=perf_event_open); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a34 -e verbose=none -e trace=perf_event_open
diff --git a/tests/perf_event_open_nonverbose.test b/tests/perf_event_open_nonverbose.test
deleted file mode 100755
index 404827f..0000000
--- a/tests/perf_event_open_nonverbose.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of perf_event_open syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a34 -e verbose=none -e trace=perf_event_open
diff --git a/tests/perf_event_open_unabbrev.gen.test b/tests/perf_event_open_unabbrev.gen.test
new file mode 100755
index 0000000..1d9bd85
--- /dev/null
+++ b/tests/perf_event_open_unabbrev.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (perf_event_open_unabbrev -a1 -v -e trace=perf_event_open); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a1 -v -e trace=perf_event_open
diff --git a/tests/perf_event_open_unabbrev.test b/tests/perf_event_open_unabbrev.test
deleted file mode 100755
index f17fd17..0000000
--- a/tests/perf_event_open_unabbrev.test
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/sh
-
-# Check perf_event_open syscall decoding.
-
-. "${srcdir=.}/init.sh"
-
-run_strace_match_diff -a1 -v -e trace=perf_event_open
diff --git a/tests/personality.test b/tests/personality.test
index 8f8c0ad..ab2faf4 100755
--- a/tests/personality.test
+++ b/tests/personality.test
@@ -5,8 +5,5 @@
 . "${srcdir=.}/init.sh"
 
 run_prog > /dev/null
-run_strace -a20 -epersonality $args > "$OUT"
-match_grep "$LOG" "$OUT"
-rm -f "$OUT"
-
-exit 0
+run_strace -a20 -epersonality $args > "$EXP"
+match_grep "$LOG" "$EXP"
diff --git a/tests/pipe.c b/tests/pipe.c
index 41c7f21..3df2094 100644
--- a/tests/pipe.c
+++ b/tests/pipe.c
@@ -2,6 +2,7 @@
  * Check decoding of pipe syscall.
  *
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff --git a/tests/pipe2.c b/tests/pipe2.c
index 375ae74..3a0e046 100644
--- a/tests/pipe2.c
+++ b/tests/pipe2.c
@@ -39,18 +39,16 @@
 int
 main(void)
 {
-	static const kernel_ulong_t bogus_zero =
-		(kernel_ulong_t) 0xffffffff00000000ULL;
 	int *const fds = tail_alloc(sizeof(*fds) * 2);
 	int *const efault = fds + 1;
 	long rc;
 
-	rc = syscall(__NR_pipe2, fds, bogus_zero | O_NONBLOCK);
+	rc = syscall(__NR_pipe2, fds, F8ILL_KULONG_MASK | O_NONBLOCK);
 	if (rc)
 		perror_msg_and_skip("pipe2");
 	printf("pipe2([%d, %d], O_NONBLOCK) = 0\n", fds[0], fds[1]);
 
-	rc = syscall(__NR_pipe2, efault, bogus_zero);
+	rc = syscall(__NR_pipe2, efault, F8ILL_KULONG_MASK);
 	printf("pipe2(%p, 0) = %s\n", efault, sprintrc(rc));
 
 	if (F8ILL_KULONG_SUPPORTED) {
diff --git a/tests/pipe2.gen.test b/tests/pipe2.gen.test
new file mode 100755
index 0000000..5a06c03
--- /dev/null
+++ b/tests/pipe2.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (pipe2 -a15); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a15
diff --git a/tests/pipe2.test b/tests/pipe2.test
deleted file mode 100755
index aff6cd4..0000000
--- a/tests/pipe2.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of pipe2 syscall.
-. "${srcdir=.}/init.sh"
-
-run_strace_match_diff -a15
diff --git a/tests/pkey_alloc.gen.test b/tests/pkey_alloc.gen.test
new file mode 100755
index 0000000..b3e5869
--- /dev/null
+++ b/tests/pkey_alloc.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (pkey_alloc -a17); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a17
diff --git a/tests/pkey_alloc.test b/tests/pkey_alloc.test
deleted file mode 100755
index f168c21..0000000
--- a/tests/pkey_alloc.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of pkey_alloc syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a17
diff --git a/tests/pkey_free.gen.test b/tests/pkey_free.gen.test
new file mode 100755
index 0000000..588d1aa
--- /dev/null
+++ b/tests/pkey_free.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (pkey_free -a13); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a13
diff --git a/tests/pkey_free.test b/tests/pkey_free.test
deleted file mode 100755
index 9c01c3e..0000000
--- a/tests/pkey_free.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of pkey_free syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a13
diff --git a/tests/pkey_mprotect.gen.test b/tests/pkey_mprotect.gen.test
new file mode 100755
index 0000000..14be231
--- /dev/null
+++ b/tests/pkey_mprotect.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (pkey_mprotect -a37); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a37
diff --git a/tests/pkey_mprotect.test b/tests/pkey_mprotect.test
deleted file mode 100755
index 922d491..0000000
--- a/tests/pkey_mprotect.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of pkey_mprotect syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a37
diff --git a/tests/poll.test b/tests/poll.test
index b74be29..d09193d 100755
--- a/tests/poll.test
+++ b/tests/poll.test
@@ -5,13 +5,11 @@
 . "${srcdir=.}/init.sh"
 
 run_prog > /dev/null
-run_strace -a16 -vepoll $args > "$OUT"
-match_diff "$LOG" "$OUT"
+run_strace -a16 -vepoll $args > "$EXP"
+match_diff "$LOG" "$EXP"
 
 for abbrev in 0 1 2 3 4 5; do
-	run_prog "./$NAME" $abbrev > /dev/null
-	run_strace -a16 -epoll -s$abbrev $args > "$OUT"
-	match_diff "$LOG" "$OUT"
+	run_prog "../$NAME" $abbrev > /dev/null
+	run_strace -a16 -epoll -s$abbrev $args > "$EXP"
+	match_diff "$LOG" "$EXP"
 done
-
-rm -f "$OUT"
diff --git a/tests/ppoll-v.c b/tests/ppoll-v.c
new file mode 100644
index 0000000..cf4fdea
--- /dev/null
+++ b/tests/ppoll-v.c
@@ -0,0 +1,3 @@
+/* This file is part of ppoll-v strace test. */
+#define VERBOSE 1
+#include "ppoll.c"
diff --git a/tests/ppoll-v.expected b/tests/ppoll-v.expected
deleted file mode 100644
index 31070ad..0000000
--- a/tests/ppoll-v.expected
+++ /dev/null
@@ -1,3 +0,0 @@
-ppoll\(\[\{fd=0, events=POLLIN\|POLLPRI\|POLLRDNORM\|POLLRDBAND\}, \{fd=1, events=POLLOUT(\|POLLWRNORM)?\|POLLWRBAND\}, \{fd=3, events=POLLIN\|POLLPRI\}, \{fd=4, events=POLLOUT\}\], 4, \{tv_sec=42, tv_nsec=999999999\}, \[(USR2 CHLD|CHLD USR2)\], (4|8|16)\) = 2 \(\[\{fd=1, revents=POLLOUT(\|POLLWRNORM)?\}, \{fd=4, revents=POLLOUT\}\], left \{tv_sec=42, tv_nsec=9[0-9]{8}\}\)
-ppoll\(\[\{fd=1, events=POLLIN\|POLLPRI\|POLLRDNORM\|POLLRDBAND\}, \{fd=0, events=POLLOUT(\|POLLWRNORM)?\|POLLWRBAND\}\], 2, \{tv_sec=0, tv_nsec=999\}, ~\[HUP KILL STOP[^]]*\], (4|8|16)\) = 0 \(Timeout\)
-ppoll\(NULL, 42, NULL, NULL, (4|8|16)\) = -1 EFAULT .*
diff --git a/tests/ppoll-v.gen.test b/tests/ppoll-v.gen.test
new file mode 100755
index 0000000..cd1fcc6
--- /dev/null
+++ b/tests/ppoll-v.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (ppoll-v -v -s2 -e trace=ppoll); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -v -s2 -e trace=ppoll
diff --git a/tests/ppoll.c b/tests/ppoll.c
index 46d7e81..85a7e0c 100644
--- a/tests/ppoll.c
+++ b/tests/ppoll.c
@@ -1,5 +1,7 @@
 /*
- * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Check decoding of ppoll syscall.
+ *
+ * Copyright (c) 2015-2017 Dmitry V. Levin <[email protected]>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -26,69 +28,165 @@
  */
 
 #include "tests.h"
-#include <assert.h>
-#include <poll.h>
-#include <signal.h>
-#include <unistd.h>
+#include <asm/unistd.h>
 
-static void
-test1(void)
+#ifdef __NR_ppoll
+
+# include <errno.h>
+# include <poll.h>
+# include <signal.h>
+# include <stdio.h>
+# include <string.h>
+# include <unistd.h>
+
+static const char *errstr;
+
+static long
+sys_ppoll(const kernel_ulong_t ufds,
+	  const kernel_ulong_t nfds,
+	  const kernel_ulong_t tsp,
+	  const kernel_ulong_t sigmask,
+	  const kernel_ulong_t sigsetsize)
 {
-	const struct timespec timeout = { .tv_sec = 42, .tv_nsec = 999999999 };
-	struct pollfd fds[] = {
-		{ .fd = 0, .events = POLLIN | POLLPRI | POLLRDNORM | POLLRDBAND },
-		{ .fd = 1, .events = POLLOUT | POLLWRNORM | POLLWRBAND },
-		{ .fd = 3, .events = POLLIN | POLLPRI },
-		{ .fd = 4, .events = POLLOUT }
-	};
-
-	sigset_t mask;
-	sigemptyset(&mask);
-	sigaddset(&mask, SIGUSR2);
-	sigaddset(&mask, SIGCHLD);
-
-	int rc = ppoll(fds, sizeof(fds) / sizeof(*fds), &timeout, &mask);
-	if (rc < 0)
-		perror_msg_and_skip("ppoll");
-	assert(rc == 2);
-}
-
-static void
-test2(void)
-{
-	const struct timespec timeout = { .tv_sec = 0, .tv_nsec = 999 };
-	struct pollfd fds[] = {
-		{ .fd = 1, .events = POLLIN | POLLPRI | POLLRDNORM | POLLRDBAND },
-		{ .fd = 0, .events = POLLOUT | POLLWRNORM | POLLWRBAND }
-	};
-
-	sigset_t mask;
-	sigfillset(&mask);
-	sigdelset(&mask, SIGHUP);
-	sigdelset(&mask, SIGKILL);
-	sigdelset(&mask, SIGSTOP);
-
-	int rc = ppoll(fds, sizeof(fds) / sizeof(*fds), &timeout, &mask);
-	if (rc < 0)
-		perror_msg_and_skip("ppoll");
-	assert(rc == 0);
+	long rc = syscall(__NR_ppoll, ufds, nfds, tsp, sigmask, sigsetsize);
+	errstr = sprintrc(rc);
+	return rc;
 }
 
 int
 main(void)
 {
-	int fds[2];
+	static const kernel_ulong_t bogus_nfds =
+		(kernel_ulong_t) 0xdeadbeeffacefeedULL;
+	static const kernel_ulong_t bogus_sigsetsize =
+		(kernel_ulong_t) 0xdeadbeefbadc0dedULL;
+	static const char *const POLLWRNORM_str =
+		(POLLWRNORM == POLLOUT) ? "" : "|POLLWRNORM";
+	static const char *const USR2_CHLD_str =
+		(SIGUSR2 < SIGCHLD) ? "USR2 CHLD" : "CHLD USR2";
+	void *const efault = tail_alloc(1024) + 1024;
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct timespec, ts);
+	const unsigned int sigset_size = get_sigset_size();
+	void *const sigmask = tail_alloc(sigset_size);
+	struct pollfd *fds;
+	sigset_t mask;
+	int pipe_fd[4];
+	long rc;
 
-	(void) close(0);
-	(void) close(1);
-	(void) close(3);
-	(void) close(4);
-	if (pipe(fds) || pipe(fds))
+	sys_ppoll(0, bogus_nfds, 0, 0, bogus_sigsetsize);
+	if (ENOSYS == errno)
+		perror_msg_and_skip("ppoll");
+	printf("ppoll(NULL, %u, NULL, NULL, %llu) = %s\n",
+	       (unsigned) bogus_nfds, (unsigned long long) bogus_sigsetsize,
+	       errstr);
+
+	sys_ppoll((unsigned long) efault, 42, (unsigned long) efault + 8,
+		  (unsigned long) efault + 16, sigset_size);
+	printf("ppoll(%p, %u, %p, %p, %u) = %s\n",
+	       efault, 42, efault + 8, efault + 16, sigset_size, errstr);
+
+	ts->tv_sec = 0xdeadbeefU;
+	ts->tv_nsec = 0xfacefeedU;
+	sys_ppoll(0, 0, (unsigned long) ts, 0, sigset_size);
+	printf("ppoll(NULL, 0, {tv_sec=%lld, tv_nsec=%llu}, NULL, %u) = %s\n",
+	       (long long) ts->tv_sec, zero_extend_signed_to_ull(ts->tv_nsec),
+	       sigset_size, errstr);
+
+	ts->tv_sec = (time_t) 0xcafef00ddeadbeefLL;
+	ts->tv_nsec = (long) 0xbadc0dedfacefeedL;
+	sys_ppoll(0, 0, (unsigned long) ts, 0, sigset_size);
+	printf("ppoll(NULL, 0, {tv_sec=%lld, tv_nsec=%llu}, NULL, %u) = %s\n",
+	       (long long) ts->tv_sec, zero_extend_signed_to_ull(ts->tv_nsec),
+	       sigset_size, errstr);
+
+	if (pipe(pipe_fd) || pipe(pipe_fd + 2))
 		perror_msg_and_fail("pipe");
 
-	test1();
-	test2();
+	ts->tv_sec = 42;
+	ts->tv_nsec = 999999999;
 
-	assert(ppoll(NULL, 42, NULL, NULL) < 0);
+	const struct pollfd fds1[] = {
+		{ .fd = pipe_fd[0], .events = POLLIN | POLLPRI | POLLRDNORM | POLLRDBAND },
+		{ .fd = pipe_fd[1], .events = POLLOUT | POLLWRNORM | POLLWRBAND },
+		{ .fd = pipe_fd[2], .events = POLLIN | POLLPRI },
+		{ .fd = pipe_fd[3], .events = POLLOUT }
+	};
+	fds = efault - sizeof(fds1);
+	memcpy(fds, fds1, sizeof(fds1));
+
+	sigemptyset(&mask);
+	sigaddset(&mask, SIGUSR2);
+	sigaddset(&mask, SIGCHLD);
+	memcpy(sigmask, &mask, sigset_size);
+
+	rc = sys_ppoll((unsigned long) fds,
+		       F8ILL_KULONG_MASK | ARRAY_SIZE(fds1), (unsigned long) ts,
+		       (unsigned long) sigmask, sigset_size);
+	if (rc != 2)
+		perror_msg_and_fail("ppoll 1");
+	printf("ppoll([{fd=%d, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}"
+	       ", {fd=%d, events=POLLOUT%s|POLLWRBAND}"
+#if VERBOSE
+	       ", {fd=%d, events=POLLIN|POLLPRI}, {fd=%d, events=POLLOUT}]"
+#else
+	       ", ...]"
+#endif
+	       ", %u, {tv_sec=42, tv_nsec=999999999}, [%s], %u) = %ld"
+	       " ([{fd=%d, revents=POLLOUT%s}, {fd=%d, revents=POLLOUT}]"
+	       ", left {tv_sec=%u, tv_nsec=%u})\n",
+	       pipe_fd[0], pipe_fd[1], POLLWRNORM_str,
+#if VERBOSE
+	       pipe_fd[2], pipe_fd[3],
+#endif
+	       (unsigned) ARRAY_SIZE(fds1), USR2_CHLD_str,
+	       (unsigned) sigset_size, rc, pipe_fd[1], POLLWRNORM_str,
+	       pipe_fd[3], (unsigned ) ts->tv_sec, (unsigned) ts->tv_nsec);
+
+	ts->tv_sec = 0;
+	ts->tv_nsec = 999;
+	const struct pollfd fds2[] = {
+		{ .fd = pipe_fd[1], .events = POLLIN | POLLPRI | POLLRDNORM | POLLRDBAND },
+		{ .fd = pipe_fd[0], .events = POLLOUT | POLLWRNORM | POLLWRBAND }
+	};
+	fds = efault - sizeof(fds2);
+	memcpy(fds, fds2, sizeof(fds2));
+
+	memset(&mask, -1, sizeof(mask));
+	sigdelset(&mask, SIGHUP);
+	sigdelset(&mask, SIGKILL);
+	sigdelset(&mask, SIGSTOP);
+	memcpy(sigmask, &mask, sigset_size);
+
+	rc = sys_ppoll((unsigned long) fds,
+		       F8ILL_KULONG_MASK | ARRAY_SIZE(fds2), (unsigned long) ts,
+		       (unsigned long) sigmask, sigset_size);
+	if (rc != 0)
+		perror_msg_and_fail("ppoll 2");
+	printf("ppoll([{fd=%d, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}"
+	       ", {fd=%d, events=POLLOUT%s|POLLWRBAND}], %u"
+	       ", {tv_sec=0, tv_nsec=999}, ~[HUP KILL STOP], %u)"
+	       " = %ld (Timeout)\n",
+	       pipe_fd[1], pipe_fd[0], POLLWRNORM_str,
+	       (unsigned) ARRAY_SIZE(fds2), sigset_size, rc);
+
+	if (F8ILL_KULONG_SUPPORTED) {
+		sys_ppoll(f8ill_ptr_to_kulong(fds), ARRAY_SIZE(fds2),
+			  f8ill_ptr_to_kulong(ts), f8ill_ptr_to_kulong(sigmask),
+			  sigset_size);
+		printf("ppoll(%#llx, %u, %#llx, %#llx, %u) = %s\n",
+		       (unsigned long long) f8ill_ptr_to_kulong(fds),
+		       (unsigned) ARRAY_SIZE(fds2),
+		       (unsigned long long) f8ill_ptr_to_kulong(ts),
+		       (unsigned long long) f8ill_ptr_to_kulong(sigmask),
+		       (unsigned) sigset_size, errstr);
+	}
+
+	puts("+++ exited with 0 +++");
 	return 0;
 }
+
+#else
+
+SKIP_MAIN_UNDEFINED("__NR_ppoll")
+
+#endif
diff --git a/tests/ppoll.expected b/tests/ppoll.expected
deleted file mode 100644
index c38a206..0000000
--- a/tests/ppoll.expected
+++ /dev/null
@@ -1,3 +0,0 @@
-ppoll\(\[\{fd=0, events=POLLIN\|POLLPRI\|POLLRDNORM\|POLLRDBAND\}, \{fd=1, events=POLLOUT(\|POLLWRNORM)?\|POLLWRBAND\}, \.\.\.\], 4, \{tv_sec=42, tv_nsec=999999999\}, \[(USR2 CHLD|CHLD USR2)\], (4|8|16)\) = 2 \(\[\{fd=1, revents=POLLOUT(\|POLLWRNORM)?\}, \{fd=4, revents=POLLOUT\}\], left \{tv_sec=42, tv_nsec=9[0-9]{8}\}\)
-ppoll\(\[\{fd=1, events=POLLIN\|POLLPRI\|POLLRDNORM\|POLLRDBAND\}, \{fd=0, events=POLLOUT(\|POLLWRNORM)?\|POLLWRBAND\}\], 2, \{tv_sec=0, tv_nsec=999\}, ~\[HUP KILL STOP[^]]*\], (4|8|16)\) = 0 \(Timeout\)
-ppoll\(NULL, 42, NULL, NULL, (4|8|16)\) = -1 EFAULT .*
diff --git a/tests/ppoll.gen.test b/tests/ppoll.gen.test
new file mode 100755
index 0000000..4c07598
--- /dev/null
+++ b/tests/ppoll.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (ppoll -s2); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -s2
diff --git a/tests/ppoll.test b/tests/ppoll.test
deleted file mode 100755
index 98389ee..0000000
--- a/tests/ppoll.test
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/sh
-
-# Check ppoll syscall decoding.
-
-. "${srcdir=.}/init.sh"
-
-run_prog
-run_strace -a30 -s2 -e ppoll $args
-match_grep
-run_strace -a30 -v -s2 -e ppoll $args
-match_grep "$LOG" "$srcdir/$NAME-v.expected"
-
-exit 0
diff --git a/tests/prctl-arg2-intptr.c b/tests/prctl-arg2-intptr.c
index ee000eb..9cc3308 100644
--- a/tests/prctl-arg2-intptr.c
+++ b/tests/prctl-arg2-intptr.c
@@ -4,6 +4,7 @@
  *
  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -70,7 +71,7 @@
 		{ 11, "PR_GET_FPEXC" },
 	};
 
-	unsigned int *ptr = tail_alloc(sizeof(*ptr));
+	TAIL_ALLOC_OBJECT_CONST_PTR(unsigned int, ptr);
 	long rc;
 	unsigned int i;
 
diff --git a/tests/prctl-arg2-intptr.test b/tests/prctl-arg2-intptr.test
index bcef806..4f9e3a1 100755
--- a/tests/prctl-arg2-intptr.test
+++ b/tests/prctl-arg2-intptr.test
@@ -10,5 +10,3 @@
 LC_ALL=C grep -Ev '^prctl\(PR_[GS]ET_([^CEF]|.[^HNP]|..[^DEI])' \
 	< "$LOG" > "$OUT"
 match_diff "$OUT" "$EXP"
-
-rm -f "$EXP" "$OUT"
diff --git a/tests/prctl-dumpable.test b/tests/prctl-dumpable.test
index 08acb8b..05f1310 100755
--- a/tests/prctl-dumpable.test
+++ b/tests/prctl-dumpable.test
@@ -8,5 +8,3 @@
 run_strace -a23 -eprctl $args > "$EXP"
 grep -v '^prctl(PR_[GS]ET_[^D][^U]' < "$LOG" > "$OUT"
 match_diff "$OUT" "$EXP"
-
-rm -f "$EXP" "$OUT"
diff --git a/tests/prctl-name.test b/tests/prctl-name.test
index 071179c..95d34b6 100755
--- a/tests/prctl-name.test
+++ b/tests/prctl-name.test
@@ -8,5 +8,3 @@
 run_strace -a23 -eprctl $args > "$EXP"
 grep -v '^prctl(PR_GET_[^N][^A]' < "$LOG" > "$OUT"
 match_diff "$OUT" "$EXP"
-
-rm -f "$EXP" "$OUT"
diff --git a/tests/prctl-no-args.c b/tests/prctl-no-args.c
index 57e1b73..496cd1a 100644
--- a/tests/prctl-no-args.c
+++ b/tests/prctl-no-args.c
@@ -4,6 +4,7 @@
  * PR_TASK_PERF_EVENTS_DISABLE, and PR_TASK_PERF_EVENTS_ENABLE.
  *
  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -57,7 +58,7 @@
 		{ 32, "PR_TASK_PERF_EVENTS_ENABLE" },
 	};
 
-	unsigned int *ptr = tail_alloc(sizeof(*ptr));
+	TAIL_ALLOC_OBJECT_CONST_PTR(unsigned int, ptr);
 	unsigned int i;
 
 	for (i = 0; i < ARRAY_SIZE(options); i++) {
diff --git a/tests/prctl-no-args.test b/tests/prctl-no-args.test
index ce8ca67..8ff300b 100755
--- a/tests/prctl-no-args.test
+++ b/tests/prctl-no-args.test
@@ -10,5 +10,3 @@
 run_strace -a21 -eprctl $args > "$EXP"
 grep -v '^prctl(PR_[GS]ET_[^KST][^EI][^CEM]' < "$LOG" > "$OUT"
 match_diff "$OUT" "$EXP"
-
-rm -f "$EXP" "$OUT"
diff --git a/tests/prctl-pdeathsig.c b/tests/prctl-pdeathsig.c
index c176030..ef56374 100644
--- a/tests/prctl-pdeathsig.c
+++ b/tests/prctl-pdeathsig.c
@@ -3,6 +3,7 @@
  *
  * Copyright (c) 2016 JingPiao Chen <[email protected]>
  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -44,7 +45,7 @@
 	static const kernel_ulong_t bogus_signal =
 		(kernel_ulong_t) 0xbadc0deddeadfeedULL;
 
-	int *pdeathsig = tail_alloc(sizeof(*pdeathsig));
+	TAIL_ALLOC_OBJECT_CONST_PTR(int, pdeathsig);
 	long rc;
 
 	rc = syscall(__NR_prctl, PR_SET_PDEATHSIG, bogus_signal);
diff --git a/tests/prctl-pdeathsig.test b/tests/prctl-pdeathsig.test
index 2777503..b6e0140 100755
--- a/tests/prctl-pdeathsig.test
+++ b/tests/prctl-pdeathsig.test
@@ -9,5 +9,3 @@
 run_strace -a30 -eprctl $args > "$EXP"
 grep -v '^prctl(PR_[GS]ET_[^P][^D]' < "$LOG" > "$OUT"
 match_diff "$OUT" "$EXP"
-
-rm -f "$EXP" "$OUT"
diff --git a/tests/prctl-seccomp-filter-v.test b/tests/prctl-seccomp-filter-v.test
index 44e4a78..3663ad8 100755
--- a/tests/prctl-seccomp-filter-v.test
+++ b/tests/prctl-seccomp-filter-v.test
@@ -9,5 +9,3 @@
 run_strace -v -eprctl $args > "$EXP"
 grep -v '^prctl(PR_GET_' < "$LOG" > "$OUT"
 match_diff "$OUT" "$EXP"
-
-rm -f "$EXP" "$OUT"
diff --git a/tests/prctl-seccomp-strict.test b/tests/prctl-seccomp-strict.test
index 1f987df..bee85b8 100755
--- a/tests/prctl-seccomp-strict.test
+++ b/tests/prctl-seccomp-strict.test
@@ -5,7 +5,7 @@
 . "${srcdir=.}/init.sh"
 
 check_prog grep
-set -- "./$NAME"
+set -- "../$NAME"
 "$@" > /dev/null || {
 	case $? in
 		77) skip_ "$* exited with code 77" ;;
@@ -16,4 +16,3 @@
 run_strace -eprctl "$@" > "$EXP"
 grep -v '^prctl(PR_GET_' < "$LOG" > "$OUT"
 match_diff "$OUT" "$EXP"
-rm -f "$EXP" "$OUT"
diff --git a/tests/prctl-securebits.test b/tests/prctl-securebits.test
index c91e62a..32b0f2a 100755
--- a/tests/prctl-securebits.test
+++ b/tests/prctl-securebits.test
@@ -8,5 +8,3 @@
 run_strace -a25 -eprctl $args > "$EXP"
 grep -v '^prctl(PR_[GS]ET_[^S][^E][^C][^U]' < "$LOG" > "$OUT"
 match_diff "$OUT" "$EXP"
-
-rm -f "$EXP" "$OUT"
diff --git a/tests/prctl-tid_address.c b/tests/prctl-tid_address.c
index 24e4503..609e549 100644
--- a/tests/prctl-tid_address.c
+++ b/tests/prctl-tid_address.c
@@ -2,6 +2,7 @@
  * Check decoding of prctl PR_GET_TID_ADDRESS operation.
  *
  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -59,7 +60,7 @@
 		(kernel_ulong_t) 0xfffffffffffffffdULL;
 
 	/* Note that kernel puts kernel-sized pointer even on x32 */
-	kernel_ulong_t *ptr = tail_alloc(sizeof(*ptr));
+	TAIL_ALLOC_OBJECT_CONST_PTR(kernel_ulong_t, ptr);
 	long rc;
 	long set_ok;
 
diff --git a/tests/prctl-tid_address.test b/tests/prctl-tid_address.test
index dc7b7c3..62a39e5 100755
--- a/tests/prctl-tid_address.test
+++ b/tests/prctl-tid_address.test
@@ -8,5 +8,3 @@
 run_strace -a23 -eprctl $args > "$EXP"
 LC_ALL=C grep -Ev '^prctl\(PR_[GS]ET_([^T]|.[^I]|..[^D])' < "$LOG" > "$OUT"
 match_diff "$OUT" "$EXP"
-
-rm -f "$EXP" "$OUT"
diff --git a/tests/prctl-tsc.c b/tests/prctl-tsc.c
index fd9362d..0ddb380 100644
--- a/tests/prctl-tsc.c
+++ b/tests/prctl-tsc.c
@@ -3,6 +3,7 @@
  *
  * Copyright (c) 2016 JingPiao Chen <[email protected]>
  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -43,7 +44,7 @@
 	static const kernel_ulong_t bogus_tsc =
 		(kernel_ulong_t) 0xdeadc0defacebeefULL;
 
-	int *tsc = tail_alloc(sizeof(*tsc));
+	TAIL_ALLOC_OBJECT_CONST_PTR(int, tsc);
 	long rc;
 
 	rc = syscall(__NR_prctl, PR_SET_TSC, 0);
diff --git a/tests/prctl-tsc.test b/tests/prctl-tsc.test
index a906ba8..439d9d5 100755
--- a/tests/prctl-tsc.test
+++ b/tests/prctl-tsc.test
@@ -9,5 +9,3 @@
 run_strace -a24 -eprctl $args > "$EXP"
 grep -v '^prctl(PR_[GS]ET_[^T][^S]' < "$LOG" > "$OUT"
 match_diff "$OUT" "$EXP"
-
-rm -f "$EXP" "$OUT"
diff --git a/tests/pread64-pwrite64.c b/tests/pread64-pwrite64.c
index 4a0932a..e9d7a64 100644
--- a/tests/pread64-pwrite64.c
+++ b/tests/pread64-pwrite64.c
@@ -2,6 +2,7 @@
  * Check decoding of pread64 and pwrite64 syscalls.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -123,7 +124,9 @@
 {
 	tprintf("%s", "");
 
-	static char tmp[] = "pread64-pwrite64-tmpfile";
+	skip_if_unavailable("/proc/self/fd/");
+
+	static const char tmp[] = "pread64-pwrite64-tmpfile";
 	if (open(tmp, O_CREAT|O_RDONLY|O_TRUNC, 0600) != 0)
 		perror_msg_and_fail("creat: %s", tmp);
 	if (open(tmp, O_WRONLY) != 1)
diff --git a/tests/pread64-pwrite64.gen.test b/tests/pread64-pwrite64.gen.test
new file mode 100755
index 0000000..b53e069
--- /dev/null
+++ b/tests/pread64-pwrite64.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (pread64-pwrite64 -a21 -eread=0 -ewrite=1 -e trace=pread64,pwrite64 -P pread64-pwrite64-tmpfile -P /dev/zero -P /dev/null); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a21 -eread=0 -ewrite=1 -e trace=pread64,pwrite64 -P pread64-pwrite64-tmpfile -P /dev/zero -P /dev/null
diff --git a/tests/pread64-pwrite64.test b/tests/pread64-pwrite64.test
deleted file mode 100755
index e585406..0000000
--- a/tests/pread64-pwrite64.test
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/sh
-
-# Check decoding and dumping of pread64 and pwrite64 syscalls.
-
-. "${srcdir=.}/init.sh"
-
-# strace -P is implemented using /proc/self/fd
-[ -d /proc/self/fd/ ] ||
-	framework_skip_ '/proc/self/fd/ is not available'
-
-tmpfile=pread64-pwrite64-tmpfile
-> $tmpfile
-
-run_strace_match_diff \
-	-a21 -eread=0 -ewrite=1 -e trace=pread64,pwrite64 \
-	-P $tmpfile -P /dev/zero -P /dev/null
-
-rm -f $tmpfile
diff --git a/tests/preadv-pwritev.gen.test b/tests/preadv-pwritev.gen.test
new file mode 100755
index 0000000..5ed8297
--- /dev/null
+++ b/tests/preadv-pwritev.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (preadv-pwritev -a19 -eread=0 -ewrite=1 -e trace=preadv,pwritev); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a19 -eread=0 -ewrite=1 -e trace=preadv,pwritev
diff --git a/tests/preadv-pwritev.test b/tests/preadv-pwritev.test
deleted file mode 100755
index cb2a077..0000000
--- a/tests/preadv-pwritev.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding and dumping of preadv and pwritev syscalls.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a19 -eread=0 -ewrite=1 -e trace=preadv,pwritev
diff --git a/tests/preadv.c b/tests/preadv.c
index fb5d3ad..a55909b 100644
--- a/tests/preadv.c
+++ b/tests/preadv.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2014-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -66,7 +67,7 @@
 {
 	const off_t offset = 0xdefaceddeadbeefLL;
 	char *buf = tail_alloc(LEN);
-	struct iovec *iov = tail_alloc(sizeof(*iov));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct iovec, iov);
 	iov->iov_base = buf;
 	iov->iov_len = LEN;
 
diff --git a/tests/preadv.gen.test b/tests/preadv.gen.test
new file mode 100755
index 0000000..8fb7b54
--- /dev/null
+++ b/tests/preadv.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (preadv -a21); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a21
diff --git a/tests/preadv.test b/tests/preadv.test
deleted file mode 100755
index d1abdb7..0000000
--- a/tests/preadv.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check preadv syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a21
diff --git a/tests/preadv2-pwritev2.c b/tests/preadv2-pwritev2.c
index f7c46c0..e31e046 100644
--- a/tests/preadv2-pwritev2.c
+++ b/tests/preadv2-pwritev2.c
@@ -2,6 +2,7 @@
  * Check decoding of preadv2 and pwritev2 syscalls.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -181,26 +182,45 @@
 main(void)
 {
 	const kernel_ulong_t vlen = (kernel_ulong_t) 0xfac1fed2dad3bef4ULL;
-	const unsigned long long pos = 0xfac5fed6dad7bef8;
+	const unsigned long long pos = 0x7ac5fed6dad7bef8;
 	const kernel_ulong_t pos_l = (kernel_ulong_t) pos;
-	const kernel_ulong_t pos_h =
-		(sizeof(kernel_ulong_t) == sizeof(long long)) ?
-		(kernel_ulong_t) 0xbadc0deddeadbeefULL : 0xfac5fed6UL;
-	int test_dumpio = 1;
+	long rc;
+	int test_dumpio;
 
 	tprintf("%s", "");
 
-	syscall(__NR_preadv2, -1, NULL, vlen, pos_l, pos_h, 1);
-	if (ENOSYS == errno)
-		test_dumpio = 0;
-	tprintf("preadv2(-1, NULL, %lu, %lld, RWF_HIPRI) = -1 %s (%m)\n",
-		(unsigned long) vlen, pos, errno2name());
+#if defined __x86_64__ && defined __ILP32__
+	/*
+	 * x32 is the only architecture where preadv2 takes 5 arguments,
+	 * see preadv64v2 in kernel sources.
+	 */
+	rc = syscall(__NR_preadv2, -1, NULL, vlen, pos_l, 1);
+#else
+	const kernel_ulong_t pos_h =
+		(sizeof(pos_l) == sizeof(pos)) ?
+		(kernel_ulong_t) 0xbadc0deddeadbeefULL :
+		(kernel_ulong_t) (pos >> 32);
+	rc = syscall(__NR_preadv2, -1, NULL, vlen, pos_l, pos_h, 1);
+#endif
+	if (rc != -1 || (ENOSYS != errno && EBADF != errno))
+		perror_msg_and_fail("preadv2");
+	test_dumpio = EBADF == errno;
+	tprintf("preadv2(-1, NULL, %lu, %lld, RWF_HIPRI) = %s\n",
+		(unsigned long) vlen, pos, sprintrc(rc));
 
-	syscall(__NR_pwritev2, -1, NULL, vlen, pos_l, pos_h, 1);
-	if (ENOSYS == errno)
-		test_dumpio = 0;
-	tprintf("pwritev2(-1, NULL, %lu, %lld, RWF_HIPRI) = -1 %s (%m)\n",
-		(unsigned long) vlen, pos, errno2name());
+#if defined __x86_64__ && defined __ILP32__
+	/*
+	 * x32 is the only architecture where pwritev2 takes 5 arguments,
+	 * see pwritev64v2 in kernel sources.
+	 */
+	rc = syscall(__NR_pwritev2, -1, NULL, vlen, pos_l, 1);
+#else
+	rc = syscall(__NR_pwritev2, -1, NULL, vlen, pos_l, pos_h, 1);
+#endif
+	if (rc != -1 || (ENOSYS != errno && EBADF != errno))
+		perror_msg_and_fail("pwritev2");
+	tprintf("pwritev2(-1, NULL, %lu, %lld, RWF_HIPRI) = %s\n",
+		(unsigned long) vlen, pos, sprintrc(rc));
 
 	if (test_dumpio)
 		dumpio();
diff --git a/tests/preadv2-pwritev2.gen.test b/tests/preadv2-pwritev2.gen.test
new file mode 100755
index 0000000..2f89b41
--- /dev/null
+++ b/tests/preadv2-pwritev2.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (preadv2-pwritev2 -a22 -eread=0 -ewrite=1 -e trace=preadv2,pwritev2); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a22 -eread=0 -ewrite=1 -e trace=preadv2,pwritev2
diff --git a/tests/preadv2-pwritev2.test b/tests/preadv2-pwritev2.test
deleted file mode 100755
index 5641ef4..0000000
--- a/tests/preadv2-pwritev2.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding and dumping of preadv2 and pwritev2 syscalls.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a22 -eread=0 -ewrite=1 -e trace=preadv2,pwritev2
diff --git a/tests/print_time.c b/tests/print_time.c
new file mode 100644
index 0000000..4292329
--- /dev/null
+++ b/tests/print_time.c
@@ -0,0 +1,75 @@
+/*
+ * Print time_t and nanoseconds in symbolic format.
+ *
+ * Copyright (c) 2015-2017 Dmitry V. Levin <[email protected]>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "tests.h"
+#include <stdio.h>
+#include <time.h>
+
+static void
+print_time_t_ex(const time_t t, const unsigned long long part_sec,
+		const unsigned int max_part_sec, const int width,
+		const int comment)
+{
+
+	if ((!t && !part_sec) || part_sec > max_part_sec)
+		return;
+
+	const struct tm *const p = localtime(&t);
+	char buf[256];
+	if (!p || !strftime(buf, sizeof(buf), "%FT%T", p))
+		return;
+
+	if (comment)
+		fputs(" /* ", stdout);
+
+	fputs(buf, stdout);
+
+	if (part_sec)
+		printf(".%0*llu", width, part_sec);
+
+	if (strftime(buf, sizeof(buf), "%z", p))
+		fputs(buf, stdout);
+
+	if (comment)
+		fputs(" */", stdout);
+
+	return;
+}
+
+void
+print_time_t_nsec(const time_t t, const unsigned long long nsec, int comment)
+{
+	print_time_t_ex(t, nsec, 999999999, 9, comment);
+}
+
+void
+print_time_t_usec(const time_t t, const unsigned long long usec, int comment)
+{
+	print_time_t_ex(t, usec, 999999, 6, comment);
+}
diff --git a/tests/printstr.gen.test b/tests/printstr.gen.test
new file mode 100755
index 0000000..c3bd93a
--- /dev/null
+++ b/tests/printstr.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (printstr -e trace=writev); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -e trace=writev
diff --git a/tests/printstr.test b/tests/printstr.test
deleted file mode 100755
index 5f164eb..0000000
--- a/tests/printstr.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of non-NUL-terminated strings when len == -1.
-. "${srcdir=.}/init.sh"
-
-run_strace_match_diff -e trace=writev
diff --git a/tests/prlimit64.gen.test b/tests/prlimit64.gen.test
new file mode 100755
index 0000000..11964a5
--- /dev/null
+++ b/tests/prlimit64.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (prlimit64 ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/prlimit64.test b/tests/prlimit64.test
deleted file mode 100755
index 2d2240d..0000000
--- a/tests/prlimit64.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of prlimit64 syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff
diff --git a/tests/process_vm_readv.gen.test b/tests/process_vm_readv.gen.test
new file mode 100755
index 0000000..3142588
--- /dev/null
+++ b/tests/process_vm_readv.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (process_vm_readv -s5 -a37); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -s5 -a37
diff --git a/tests/process_vm_readv.test b/tests/process_vm_readv.test
deleted file mode 100755
index c092f5a..0000000
--- a/tests/process_vm_readv.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of process_vm_readv syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -s5 -a37
diff --git a/tests/process_vm_writev.gen.test b/tests/process_vm_writev.gen.test
new file mode 100755
index 0000000..0b912c0
--- /dev/null
+++ b/tests/process_vm_writev.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (process_vm_writev -s5 -a38); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -s5 -a38
diff --git a/tests/process_vm_writev.test b/tests/process_vm_writev.test
deleted file mode 100755
index f690e6a..0000000
--- a/tests/process_vm_writev.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of process_vm_writev syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -s5 -a38
diff --git a/tests/pselect6.c b/tests/pselect6.c
index f264485..f5939f3 100644
--- a/tests/pselect6.c
+++ b/tests/pselect6.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -95,13 +96,13 @@
 	FD_SET(fds[0], set[1]);
 	FD_SET(fds[1], set[1]);
 	assert(syscall(__NR_pselect6, fds[1] + 1, NULL, set[1], NULL, &tm.ts, NULL) == 3);
-	printf("pselect6(%d, NULL, [1 2 %d %d], NULL, "
-	       "{tv_sec=%lld, tv_nsec=%lld}, NULL) = 3 (out [1 2 %d], left "
-	       "{tv_sec=%lld, tv_nsec=%lld})\n",
-	       fds[1] + 1, fds[0], fds[1],
-	       (long long) tm_in.ts.tv_sec, (long long) tm_in.ts.tv_nsec,
-	       fds[1],
-	       (long long) tm.ts.tv_sec, (long long) tm.ts.tv_nsec);
+	printf("pselect6(%d, NULL, [1 2 %d %d], NULL"
+	       ", {tv_sec=%lld, tv_nsec=%llu}, NULL) = 3 (out [1 2 %d]"
+	       ", left {tv_sec=%lld, tv_nsec=%llu})\n",
+	       fds[1] + 1, fds[0], fds[1], (long long) tm_in.ts.tv_sec,
+	       zero_extend_signed_to_ull(tm_in.ts.tv_nsec),
+	       fds[1], (long long) tm.ts.tv_sec,
+	       zero_extend_signed_to_ull(tm.ts.tv_nsec));
 
 	/*
 	 * Now the crash case that trinity found, negative nfds
@@ -122,21 +123,40 @@
 	tm.ts.tv_sec = 0;
 	tm.ts.tv_nsec = 123;
 	assert(pselect(FD_SETSIZE + 1, set[0], set[1], NULL, &tm.ts, &mask) == 0);
-	printf("pselect6(%d, [%d], [], NULL, {tv_sec=0, tv_nsec=123}, "
-	       "{[HUP CHLD], %u}) = 0 (Timeout)\n",
+	printf("pselect6(%d, [%d], [], NULL, {tv_sec=0, tv_nsec=123}"
+	       ", {[HUP CHLD], %u}) = 0 (Timeout)\n",
 	       FD_SETSIZE + 1, fds[0], NSIG_BYTES);
 
 	/*
 	 * See how timeouts are decoded.
 	 */
+	tm.ts.tv_sec = 0xdeadbeefU;
+	tm.ts.tv_nsec = 0xfacefeedU;
+	assert(pselect(0, NULL, NULL, NULL, &tm.ts, NULL) == -1);
+	printf("pselect6(0, NULL, NULL, NULL"
+	       ", {tv_sec=%lld, tv_nsec=%llu}, {NULL, %u}) = %s\n",
+	       (long long) tm.ts.tv_sec,
+	       zero_extend_signed_to_ull(tm.ts.tv_nsec),
+	       NSIG_BYTES, sprintrc(-1));
+
+	tm.ts.tv_sec = (time_t) 0xcafef00ddeadbeefLL;
+	tm.ts.tv_nsec = (long) 0xbadc0dedfacefeedLL;
+	assert(pselect(0, NULL, NULL, NULL, &tm.ts, NULL) == -1);
+	printf("pselect6(0, NULL, NULL, NULL"
+	       ", {tv_sec=%lld, tv_nsec=%llu}, {NULL, %u}) = %s\n",
+	       (long long) tm.ts.tv_sec,
+	       zero_extend_signed_to_ull(tm.ts.tv_nsec),
+	       NSIG_BYTES, sprintrc(-1));
+
 	assert(sigaction(SIGALRM, &act, NULL) == 0);
 	assert(setitimer(ITIMER_REAL, &itv, NULL) == 0);
 
+	tm.ts.tv_sec = 0;
 	tm.ts.tv_nsec = 222222222;
 	assert(pselect(0, NULL, NULL, NULL, &tm.ts, &mask) == -1);
-	printf("pselect6(0, NULL, NULL, NULL, {tv_sec=0, tv_nsec=222222222}, "
-	       "{[HUP CHLD], %u}) = "
-	       "? ERESTARTNOHAND (To be restarted if no handler)\n",
+	printf("pselect6(0, NULL, NULL, NULL, {tv_sec=0, tv_nsec=222222222}"
+	       ", {[HUP CHLD], %u})"
+	       " = ? ERESTARTNOHAND (To be restarted if no handler)\n",
 	       NSIG_BYTES);
 	puts("--- SIGALRM {si_signo=SIGALRM, si_code=SI_KERNEL} ---");
 
diff --git a/tests/pselect6.gen.test b/tests/pselect6.gen.test
new file mode 100755
index 0000000..c89e705
--- /dev/null
+++ b/tests/pselect6.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (pselect6 ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/pselect6.test b/tests/pselect6.test
deleted file mode 100755
index 203f8e2..0000000
--- a/tests/pselect6.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check pselect6 syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff
diff --git a/tests/ptrace.c b/tests/ptrace.c
index 80ce8cb..9e0ffdc 100644
--- a/tests/ptrace.c
+++ b/tests/ptrace.c
@@ -2,6 +2,7 @@
  * Check decoding of ptrace syscall.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -30,16 +31,14 @@
 #include "tests.h"
 #include <asm/unistd.h>
 
-#ifdef __NR_rt_sigprocmask
-
-# include <errno.h>
-# include <signal.h>
-# include <stdio.h>
-# include <string.h>
-# include <sys/wait.h>
-# include <unistd.h>
-# include "ptrace.h"
-# include <linux/audit.h>
+#include <errno.h>
+#include <signal.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#include "ptrace.h"
+#include <linux/audit.h>
 
 static const char *errstr;
 
@@ -178,46 +177,38 @@
 	const unsigned long pid =
 		(unsigned long) 0xdefaced00000000ULL | (unsigned) getpid();
 
-	unsigned int sigset_size;
-
-	for (sigset_size = 1024 / 8; sigset_size; sigset_size >>= 1) {
-		if (!syscall(__NR_rt_sigprocmask,
-			     SIG_SETMASK, NULL, NULL, sigset_size))
-			break;
-	}
-	if (!sigset_size)
-		perror_msg_and_fail("rt_sigprocmask");
+	const unsigned int sigset_size = get_sigset_size();
 
 	void *const k_set = tail_alloc(sigset_size);
-	siginfo_t *const sip = tail_alloc(sizeof(*sip));
+	TAIL_ALLOC_OBJECT_CONST_PTR(siginfo_t, sip);
 
 	do_ptrace(bad_request, pid, 0, 0);
 	printf("ptrace(%#lx /* PTRACE_??? */, %u, NULL, NULL) = %s\n",
 	       bad_request, (unsigned) pid, errstr);
 
 	do_ptrace(PTRACE_PEEKDATA, pid, bad_request, bad_data);
-# ifdef IA64
+#ifdef IA64
 	printf("ptrace(PTRACE_PEEKDATA, %u, %#lx) = %s\n",
 	       (unsigned) pid, bad_request, errstr);
-# else
+#else
 	printf("ptrace(PTRACE_PEEKDATA, %u, %#lx, %#lx) = %s\n",
 	       (unsigned) pid, bad_request, bad_data, errstr);
 #endif
 
 	do_ptrace(PTRACE_PEEKTEXT, pid, bad_request, bad_data);
-# ifdef IA64
+#ifdef IA64
 	printf("ptrace(PTRACE_PEEKTEXT, %u, %#lx) = %s\n",
 	       (unsigned) pid, bad_request, errstr);
-# else
+#else
 	printf("ptrace(PTRACE_PEEKTEXT, %u, %#lx, %#lx) = %s\n",
 	       (unsigned) pid, bad_request, bad_data, errstr);
 #endif
 
 	do_ptrace(PTRACE_PEEKUSER, pid, bad_request, bad_data);
-# ifdef IA64
+#ifdef IA64
 	printf("ptrace(PTRACE_PEEKUSER, %u, %#lx) = %s\n",
 	       (unsigned) pid, bad_request, errstr);
-# else
+#else
 	printf("ptrace(PTRACE_PEEKUSER, %u, %#lx, %#lx) = %s\n",
 	       (unsigned) pid, bad_request, bad_data, errstr);
 #endif
@@ -446,10 +437,3 @@
 	puts("+++ exited with 0 +++");
 	return 0;
 }
-
-
-#else
-
-SKIP_MAIN_UNDEFINED("__NR_rt_sigprocmask")
-
-#endif
diff --git a/tests/ptrace.gen.test b/tests/ptrace.gen.test
new file mode 100755
index 0000000..4b93250
--- /dev/null
+++ b/tests/ptrace.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (ptrace -a23 -e signal=none); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a23 -e signal=none
diff --git a/tests/ptrace.test b/tests/ptrace.test
deleted file mode 100755
index 5add9be..0000000
--- a/tests/ptrace.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of ptrace syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a23 -e signal=none
diff --git a/tests/pure_executables.list b/tests/pure_executables.list
new file mode 100755
index 0000000..cc65614
--- /dev/null
+++ b/tests/pure_executables.list
@@ -0,0 +1,330 @@
+# executables without side effects
+_newselect
+accept
+accept4
+access
+acct
+add_key
+adjtimex
+aio
+alarm
+bpf
+brk
+btrfs
+caps
+chmod
+chown
+chown32
+chroot
+clock_adjtime
+clock_nanosleep
+clock_xettime
+copy_file_range
+creat
+delete_module
+dup
+dup2
+dup3
+epoll_create
+epoll_create1
+epoll_ctl
+epoll_pwait
+epoll_wait
+erestartsys
+eventfd
+execve
+execveat
+faccessat
+fadvise64
+fadvise64_64
+fallocate
+fanotify_init
+fanotify_mark
+fchdir
+fchmod
+fchmodat
+fchown
+fchown32
+fchownat
+fcntl
+fcntl64
+fdatasync
+file_handle
+file_ioctl
+finit_module
+flock
+fstat
+fstat64
+fstatat64
+fstatfs
+fstatfs64
+fsync
+ftruncate
+ftruncate64
+futex
+futimesat
+get_mempolicy
+getcpu
+getcwd
+getdents
+getdents64
+getegid
+getegid32
+geteuid
+geteuid32
+getgid
+getgid32
+getgroups
+getgroups32
+getpeername
+getpgrp
+getpid
+getppid
+getrandom
+getresgid
+getresgid32
+getresuid
+getresuid32
+getrlimit
+getrusage
+getsid
+getsockname
+getuid
+getuid32
+getxxid
+inet-cmsg
+init_module
+inotify
+inotify_init1
+ioctl
+ioctl_block
+ioctl_dm
+ioctl_evdev
+ioctl_loop
+ioctl_mtd
+ioctl_rtc
+ioctl_scsi
+ioctl_sg_io_v3
+ioctl_sg_io_v4
+ioctl_sock_gifconf
+ioctl_uffdio
+ioctl_v4l2
+ioperm
+iopl
+ioprio
+ip_mreq
+ipc
+ipc_msg
+ipc_msgbuf
+ipc_sem
+ipc_shm
+kcmp
+kexec_file_load
+kexec_load
+keyctl
+kill
+lchown
+lchown32
+link
+linkat
+llseek
+lookup_dcookie
+lseek
+lstat
+lstat64
+madvise
+mbind
+membarrier
+memfd_create
+migrate_pages
+mincore
+mkdir
+mkdirat
+mknod
+mknodat
+mlock
+mlock2
+mlockall
+mmap
+mmap64
+mmsg
+mmsg_name
+mount
+move_pages
+mq
+mq_sendrecv
+mq_sendrecv-read
+mq_sendrecv-write
+msg_control
+msg_name
+munlockall
+nanosleep
+net-icmp_filter
+net-sockaddr
+net-y-unix
+net-yy-inet
+net-yy-netlink
+net-yy-unix
+netlink_protocol
+newfstatat
+old_mmap
+oldfstat
+oldlstat
+oldselect
+oldstat
+open
+openat
+osf_utimes
+pause
+perf_event_open
+personality
+pipe
+pipe2
+pkey_alloc
+pkey_free
+pkey_mprotect
+poll
+ppoll
+prctl-arg2-intptr
+prctl-dumpable
+prctl-name
+prctl-no-args
+prctl-pdeathsig
+prctl-securebits
+prctl-tid_address
+prctl-tsc
+pread64-pwrite64
+preadv
+preadv-pwritev
+preadv2-pwritev2
+printstr
+prlimit64
+process_vm_readv
+process_vm_writev
+pselect6
+ptrace
+pwritev
+quotactl
+quotactl-xfs
+read-write
+readahead
+readdir
+readlink
+readlinkat
+readv
+reboot
+recvfrom
+recvmmsg-timeout
+recvmsg
+remap_file_pages
+rename
+renameat
+renameat2
+request_key
+rmdir
+rt_sigpending
+rt_sigprocmask
+rt_sigqueueinfo
+rt_sigreturn
+rt_sigsuspend
+rt_sigtimedwait
+rt_tgsigqueueinfo
+sched_get_priority_mxx
+sched_rr_get_interval
+sched_xetaffinity
+sched_xetattr
+sched_xetparam
+sched_xetscheduler
+sched_yield
+seccomp-filter
+select
+semop
+sendfile
+sendfile64
+set_mempolicy
+setdomainname
+setfsgid
+setfsgid32
+setfsuid
+setfsuid32
+setgid
+setgid32
+setgroups
+setgroups32
+sethostname
+setns
+setregid
+setregid32
+setresgid
+setresgid32
+setresuid
+setresuid32
+setreuid
+setreuid32
+setrlimit
+setuid
+setuid32
+shmxt
+shutdown
+sigaction
+sigaltstack
+siginfo
+signalfd4
+sigreturn
+sigsuspend
+socketcall
+splice
+stat
+stat64
+statfs
+statfs64
+statx
+swap
+sxetmask
+symlink
+symlinkat
+sync
+sync_file_range
+sync_file_range2
+sysinfo
+syslog
+tee
+time
+timer_create
+timer_xettime
+timerfd_xettime
+times
+times-fail
+truncate
+truncate64
+ugetrlimit
+uio
+umask
+umount
+umount2
+umoven-illptr
+umovestr
+umovestr-illptr
+umovestr2
+umovestr3
+uname
+unlink
+unlinkat
+unshare
+userfaultfd
+ustat
+utime
+utimensat
+utimes
+vhangup
+vmsplice
+wait4
+waitid
+waitpid
+xattr
+xattr-strings
+xet_robust_list
+xetitimer
+xetpgid
+xetpriority
+xettimeofday
diff --git a/tests/pwritev.gen.test b/tests/pwritev.gen.test
new file mode 100755
index 0000000..e54fd15
--- /dev/null
+++ b/tests/pwritev.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (pwritev -a22 -s7); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a22 -s7
diff --git a/tests/pwritev.test b/tests/pwritev.test
deleted file mode 100755
index 0aed683..0000000
--- a/tests/pwritev.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check pwritev syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a22 -s7
diff --git a/tests/qual_fault-exit_group.test b/tests/qual_fault-exit_group.test
index c98ffc6..34a2da5 100755
--- a/tests/qual_fault-exit_group.test
+++ b/tests/qual_fault-exit_group.test
@@ -3,6 +3,7 @@
 # Check decoding of fault injected exit_group syscall.
 #
 # Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+# Copyright (c) 2016-2017 The strace developers.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -41,13 +42,13 @@
 	match_diff
 }
 
-test_with -eexit,exit_group -efault=exit_group:error=ENOSYS ./answer
+test_with -eexit,exit_group -efault=exit_group:error=ENOSYS ../answer
 
 test_with -eexit,exit_group -efault=exit_group:error=ENOSYS \
-	  -efault=\!process:error=1 ./answer
+	  -efault=\!process:error=1 ../answer
 
 test_with -eexit,exit_group -efault=all:error=ENOSYS \
-	  -efault=exit:error=1:when=2+ ./answer
+	  -efault=exit:error=1:when=2+ ../answer
 
 test_with -eexit,exit_group -efault=exit_group:error=ENOSYS \
-	  -efault=\!desc,file,memory,process,signal,network,ipc:error=1 ./answer
+	  -efault=\!%desc,%file,%memory,%process,%signal,%network,%ipc:error=1 ../answer
diff --git a/tests/qual_fault-syntax.test b/tests/qual_fault-syntax.test
index 85093fc..0cce539 100755
--- a/tests/qual_fault-syntax.test
+++ b/tests/qual_fault-syntax.test
@@ -2,7 +2,7 @@
 #
 # Check -e fault= syntax.
 #
-# Copyright (c) 2016=2017 Dmitry V. Levin <[email protected]>
+# Copyright (c) 2016-2017 Dmitry V. Levin <[email protected]>
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
diff --git a/tests/qual_fault.c b/tests/qual_fault.c
index d26dc7c..ab692cb 100644
--- a/tests/qual_fault.c
+++ b/tests/qual_fault.c
@@ -2,6 +2,7 @@
  * Check that fault injection works properly.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff --git a/tests/qual_fault.test b/tests/qual_fault.test
index e194a78..f8e57d2 100755
--- a/tests/qual_fault.test
+++ b/tests/qual_fault.test
@@ -3,6 +3,7 @@
 # Check that fault injection works properly.
 #
 # Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+# Copyright (c) 2016-2017 The strace developers.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -76,12 +77,11 @@
 
 	run_strace -a11 -e trace=$trace \
 		"$@" -e fault=$fault$when$error $extra \
-		./$NAME $raw "$err" "$first" "$step" $N \
+		../$NAME $raw "$err" "$first" "$step" $N \
 		> "$EXP" 4> "$outexp" 5> "$outgot"
 
 	match_diff "$EXP" "$LOG"
 	match_diff "$outexp" "$outgot"
-	rm -f "$EXP" "$outexp" "$outgot"
 }
 
 for err in '' ENOSYS 22 einval; do
diff --git a/tests/qual_inject-error-signal.test b/tests/qual_inject-error-signal.test
index fcbcc39..1fe4612 100755
--- a/tests/qual_inject-error-signal.test
+++ b/tests/qual_inject-error-signal.test
@@ -4,5 +4,5 @@
 . "${srcdir=.}/scno_tampering.sh"
 
 run_strace -a12 -echdir,exit_group -einject=chdir:error=ENOENT:signal=USR1 \
-	"./$NAME"
+	"../$NAME"
 match_diff
diff --git a/tests/qual_inject-retval.test b/tests/qual_inject-retval.test
index 419030a..5a4efd1 100755
--- a/tests/qual_inject-retval.test
+++ b/tests/qual_inject-retval.test
@@ -12,9 +12,8 @@
 	rval="$1"; shift
 
 	run_strace -a12 -e$syscall -einject="$syscall:retval=$rval" "$@" \
-		./qual_inject-retval "$rval" > "$EXP"
+		../qual_inject-retval "$rval" > "$EXP"
 	match_diff "$LOG" "$EXP"
-	rm -f "$EXP"
 }
 
 check_injection 0
diff --git a/tests/qual_inject-signal.test b/tests/qual_inject-signal.test
index 88002ce..f17e5a0 100755
--- a/tests/qual_inject-signal.test
+++ b/tests/qual_inject-signal.test
@@ -4,5 +4,5 @@
 . "${srcdir=.}/init.sh"
 
 run_strace -a12 -echdir,exit_group -einject=chdir:signal=USR1 \
-	./$NAME
+	../$NAME
 match_diff
diff --git a/tests/qual_signal.test b/tests/qual_signal.test
index 54a37a3..52812b7 100755
--- a/tests/qual_signal.test
+++ b/tests/qual_signal.test
@@ -3,6 +3,7 @@
 # Check how strace -e signal=set works.
 #
 # Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+# Copyright (c) 2016-2017 The strace developers.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -34,10 +35,9 @@
 	local sigs
 	sigs="$1"; shift
 
-	run_prog "./$NAME" "$@" > /dev/null
-	run_strace -e trace=none -e signal="$sigs" "./$NAME" "$@" > "$EXP"
+	run_prog "../$NAME" "$@" > /dev/null
+	run_strace -e trace=none -e signal="$sigs" "../$NAME" "$@" > "$EXP"
 	match_diff "$LOG" "$EXP"
-	rm -f "$EXP"
 }
 
 test_sigs()
diff --git a/tests/qual_syscall.test b/tests/qual_syscall.test
index f7eb06d..1524405 100755
--- a/tests/qual_syscall.test
+++ b/tests/qual_syscall.test
@@ -5,17 +5,17 @@
 
 . "${srcdir=.}/init.sh"
 
-run_prog ./umovestr
-pattern_abbrev_verbose='execve("\./umovestr", \["\./umovestr"\], \[/\* [[:digit:]]* vars \*/\]) = 0'
-pattern_nonabbrev_verbose='execve("\./umovestr", \["\./umovestr"\], \[".*\"\(\.\.\.\)\?\]) = 0'
-pattern_nonverbose='execve("\./umovestr", 0x[[:xdigit:]]*, 0x[[:xdigit:]]*) = 0'
+run_prog ../umovestr
+pattern_abbrev_verbose='execve("\.\./umovestr", \["\.\./umovestr"\], 0x[[:xdigit:]]* /\* [[:digit:]]* vars \*/) = 0'
+pattern_nonabbrev_verbose='execve("\.\./umovestr", \["\.\./umovestr"\], \[".*\"\(\.\.\.\)\?\]) = 0'
+pattern_nonverbose='execve("\.\./umovestr", 0x[[:xdigit:]]*, 0x[[:xdigit:]]*) = 0'
 pattern_raw='execve(0x[[:xdigit:]]*, 0x[[:xdigit:]]*, 0x[[:xdigit:]]*) = 0'
 
 check_output_mismatch()
 {
 	local pattern
 	pattern="$1"; shift
-	run_strace "$@" ./umovestr
+	run_strace "$@" ../umovestr
 	LC_ALL=C grep -x "$pattern" "$LOG" > /dev/null || {
 		printf '%s\n%s\n' \
 			'Failed patterns of expected output:' "$pattern"
@@ -28,15 +28,19 @@
 LC_ALL=C grep '^[[:alnum:]_]*(' > /dev/null &&
 	dump_log_and_fail_with "$STRACE $args unexpected output"
 
-check_output_mismatch "$pattern_abbrev_verbose" -e trace=process
+check_output_mismatch "$pattern_abbrev_verbose" -e trace=%process
 LC_ALL=C grep '^chdir' "$LOG" > /dev/null &&
 	dump_log_and_fail_with "$STRACE $args unexpected output"
 
-run_strace -e 42 ./umovestr
+run_strace -e 42 ../umovestr
 LC_ALL=C grep '^[[:alnum:]_]*(' "$LOG" > /dev/null &&
 	dump_log_and_fail_with "$STRACE $args unexpected output"
 
-for a in execve \!chdir all \!none \
+run_strace -e/ -e42 ../umovestr
+LC_ALL=C grep '^[[:alnum:]_]*(' "$LOG" > /dev/null &&
+	dump_log_and_fail_with "$STRACE $args unexpected output"
+
+for a in execve \!chdir /. all \!none \
 	 file process \!desc \!ipc \!memory \!network \!signal; do
 	check_output_mismatch \
 		"$pattern_abbrev_verbose" -e abbrev="$a" -e execve
diff --git a/tests/quotactl-v.gen.test b/tests/quotactl-v.gen.test
new file mode 100755
index 0000000..8659ed2
--- /dev/null
+++ b/tests/quotactl-v.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (quotactl-v -v -e trace=quotactl); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -v -e trace=quotactl
diff --git a/tests/quotactl-v.test b/tests/quotactl-v.test
deleted file mode 100755
index 6adaf82..0000000
--- a/tests/quotactl-v.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check non-abbreviated decoding of quotactl syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -v -e trace=quotactl
diff --git a/tests/quotactl-xfs-v.gen.test b/tests/quotactl-xfs-v.gen.test
new file mode 100755
index 0000000..f1f7e0a
--- /dev/null
+++ b/tests/quotactl-xfs-v.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (quotactl-xfs-v -v -e trace=quotactl); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -v -e trace=quotactl
diff --git a/tests/quotactl-xfs-v.test b/tests/quotactl-xfs-v.test
deleted file mode 100755
index d5ffc7d..0000000
--- a/tests/quotactl-xfs-v.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check non-abbreviated decoding of quotactl xfs subcommands.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -v -e trace=quotactl
diff --git a/tests/quotactl-xfs.c b/tests/quotactl-xfs.c
index e420d1c..b2a884b 100644
--- a/tests/quotactl-xfs.c
+++ b/tests/quotactl-xfs.c
@@ -3,6 +3,7 @@
  *
  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -207,10 +208,10 @@
 	char unterminated_str[sizeof(void *) * 2 + sizeof("0x")];
 
 	long rc;
-	struct fs_disk_quota *xdq = tail_alloc(sizeof(*xdq));
-	struct fs_quota_stat *xqstat = tail_alloc(sizeof(*xqstat));
-	struct fs_quota_statv *xqstatv = tail_alloc(sizeof(*xqstatv));
-	uint32_t *flags = tail_alloc(sizeof(*flags));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct fs_disk_quota, xdq);
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct fs_quota_stat, xqstat);
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct fs_quota_statv, xqstatv);
+	TAIL_ALLOC_OBJECT_CONST_PTR(uint32_t, flags);
 	char *unterminated = tail_memdup(unterminated_data,
 		sizeof(unterminated_data));
 
diff --git a/tests/quotactl-xfs.gen.test b/tests/quotactl-xfs.gen.test
new file mode 100755
index 0000000..cd7d11c
--- /dev/null
+++ b/tests/quotactl-xfs.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (quotactl-xfs -e trace=quotactl); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -e trace=quotactl
diff --git a/tests/quotactl-xfs.test b/tests/quotactl-xfs.test
deleted file mode 100755
index 404a737..0000000
--- a/tests/quotactl-xfs.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of quotactl xfs subcommands.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -e trace=quotactl
diff --git a/tests/quotactl.c b/tests/quotactl.c
index 3a7c113..88c3fda 100644
--- a/tests/quotactl.c
+++ b/tests/quotactl.c
@@ -3,6 +3,7 @@
  *
  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -173,10 +174,10 @@
 	long rc;
 	char *unterminated = tail_memdup(unterminated_data,
 					 sizeof(unterminated_data));
-	struct if_dqblk *dqblk = tail_alloc(sizeof(*dqblk));
-	struct if_dqinfo *dqinfo = tail_alloc(sizeof(*dqinfo));
-	uint32_t *fmt = tail_alloc(sizeof(*fmt));
-	struct if_nextdqblk *nextdqblk = tail_alloc(sizeof(*nextdqblk));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct if_dqblk, dqblk);
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct if_dqinfo, dqinfo);
+	TAIL_ALLOC_OBJECT_CONST_PTR(uint32_t, fmt);
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct if_nextdqblk, nextdqblk);
 
 
 	snprintf(bogus_special_str, sizeof(bogus_special_str), "%p",
diff --git a/tests/quotactl.gen.test b/tests/quotactl.gen.test
new file mode 100755
index 0000000..c6ad6e1
--- /dev/null
+++ b/tests/quotactl.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (quotactl ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/quotactl.test b/tests/quotactl.test
deleted file mode 100755
index d0101f4..0000000
--- a/tests/quotactl.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of quotactl syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff
diff --git a/tests/read-write.c b/tests/read-write.c
index 262e07b..ed4c64d 100644
--- a/tests/read-write.c
+++ b/tests/read-write.c
@@ -2,6 +2,7 @@
  * Check decoding and dumping of read and write syscalls.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -137,7 +138,9 @@
 {
 	tprintf("%s", "");
 
-	static char tmp[] = "read-write-tmpfile";
+	skip_if_unavailable("/proc/self/fd/");
+
+	static const char tmp[] = "read-write-tmpfile";
 	if (open(tmp, O_CREAT|O_RDONLY|O_TRUNC, 0600) != 0)
 		perror_msg_and_fail("creat: %s", tmp);
 	if (open(tmp, O_WRONLY) != 1)
diff --git a/tests/read-write.gen.test b/tests/read-write.gen.test
new file mode 100755
index 0000000..df1b3fb
--- /dev/null
+++ b/tests/read-write.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (read-write -a15 -eread=0 -ewrite=1 -e trace=read,write -P read-write-tmpfile -P /dev/zero -P /dev/null); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a15 -eread=0 -ewrite=1 -e trace=read,write -P read-write-tmpfile -P /dev/zero -P /dev/null
diff --git a/tests/read-write.test b/tests/read-write.test
deleted file mode 100755
index 3700541..0000000
--- a/tests/read-write.test
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/sh
-
-# Check decoding and dumping of read and write syscalls.
-
-. "${srcdir=.}/init.sh"
-
-# strace -P is implemented using /proc/self/fd
-[ -d /proc/self/fd/ ] ||
-	framework_skip_ '/proc/self/fd/ is not available'
-
-tmpfile=read-write-tmpfile
-> $tmpfile
-
-run_strace_match_diff \
-	-a15 -eread=0 -ewrite=1 -e trace=read,write \
-	-P $tmpfile -P /dev/zero -P /dev/null
-
-rm -f $tmpfile
diff --git a/tests/readahead.c b/tests/readahead.c
index c11b577..c243ae4 100644
--- a/tests/readahead.c
+++ b/tests/readahead.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff --git a/tests/readahead.gen.test b/tests/readahead.gen.test
new file mode 100755
index 0000000..4e88efa
--- /dev/null
+++ b/tests/readahead.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (readahead -a1); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a1
diff --git a/tests/readahead.test b/tests/readahead.test
deleted file mode 100755
index 397c690..0000000
--- a/tests/readahead.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check readahead syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a1
diff --git a/tests/readdir.c b/tests/readdir.c
index 8c48362..a47856f 100644
--- a/tests/readdir.c
+++ b/tests/readdir.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -58,9 +59,9 @@
 	"A\\nA\\nA\\nA\\nA\\nA\\nA\\nA\\nA\\nA\\nA\\nA\\nA\\nA\\nA\\nZ";
 
 int
-main(int ac, const char **av)
+main(void)
 {
-	char *dname;
+	static const char dname[] = "readdir.test.tmp.dir";
 	struct {
 		unsigned long   d_ino;
 		unsigned long   d_off;
@@ -69,8 +70,6 @@
 	} e;
 	int rc;
 
-	assert(ac == 1);
-	assert(asprintf(&dname, "%s.test.tmp.dir", av[0]) > 0);
 	assert(!mkdir(dname, 0700));
 	assert(!chdir(dname));
 	(void) close(0);
diff --git a/tests/readdir.gen.test b/tests/readdir.gen.test
new file mode 100755
index 0000000..10da83b
--- /dev/null
+++ b/tests/readdir.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (readdir -a16); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a16
diff --git a/tests/readdir.test b/tests/readdir.test
deleted file mode 100755
index e313273..0000000
--- a/tests/readdir.test
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/sh
-
-# Check readdir syscall decoding.
-
-. "${srcdir=.}/init.sh"
-
-rm -rf -- "$LOG".dir
-run_strace_match_diff -a16
diff --git a/tests/readlink.gen.test b/tests/readlink.gen.test
new file mode 100755
index 0000000..755fc8b
--- /dev/null
+++ b/tests/readlink.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (readlink -xx); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -xx
diff --git a/tests/readlink.test b/tests/readlink.test
deleted file mode 100755
index c026ecb..0000000
--- a/tests/readlink.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check readlink syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -xx
diff --git a/tests/readlinkat.gen.test b/tests/readlinkat.gen.test
new file mode 100755
index 0000000..2a50299
--- /dev/null
+++ b/tests/readlinkat.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (readlinkat -xx); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -xx
diff --git a/tests/readlinkat.test b/tests/readlinkat.test
deleted file mode 100755
index 229c8e1..0000000
--- a/tests/readlinkat.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check readlinkat syscall decoding.
-
-. "${srcdir=.}/readlink.test"
diff --git a/tests/readv.test b/tests/readv.test
index dc18799..d75e370 100755
--- a/tests/readv.test
+++ b/tests/readv.test
@@ -3,6 +3,7 @@
 # Check decoding and dumping of readv and writev syscalls.
 #
 # Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+# Copyright (c) 2016-2017 The strace developers.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -38,7 +39,7 @@
 run_strace_match_diff -a16 -e trace=readv,writev \
 	-eread='!all' -ewrite=none -eread='!0,1,2' -ewrite='!0,1,2'
 
-wfd="$(./print_maxfd)"
+wfd="$(../print_maxfd)"
 rfd="$(($wfd - 1))"
 run_strace_match_diff -a16 -e trace=readv,writev \
 	-eread="$rfd" -ewrite="$wfd"
diff --git a/tests/reboot.gen.test b/tests/reboot.gen.test
new file mode 100755
index 0000000..0a48dea
--- /dev/null
+++ b/tests/reboot.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (reboot ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/reboot.test b/tests/reboot.test
deleted file mode 100755
index a97dd21..0000000
--- a/tests/reboot.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check reboot syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff
diff --git a/tests/recvfrom.gen.test b/tests/recvfrom.gen.test
new file mode 100755
index 0000000..c23780c
--- /dev/null
+++ b/tests/recvfrom.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (recvfrom -a35); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a35
diff --git a/tests/recvfrom.test b/tests/recvfrom.test
deleted file mode 100755
index 9dfbc89..0000000
--- a/tests/recvfrom.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of sockaddr related arguments of recvfrom syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a35
diff --git a/tests/recvmmsg-timeout.c b/tests/recvmmsg-timeout.c
index 7cf064d..64ce16a 100644
--- a/tests/recvmmsg-timeout.c
+++ b/tests/recvmmsg-timeout.c
@@ -2,6 +2,7 @@
  * Check decoding of timeout argument of recvmmsg syscall.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -50,13 +51,15 @@
 			.msg_iovlen = 1
 		}
 	};
-	struct timespec t = { .tv_sec = 0, .tv_nsec = 12345678 };
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct timespec, ts);
+	ts->tv_sec = 0;
+	ts->tv_nsec = 12345678;
 
-	int rc = recv_mmsg(-1, &mh, 1, 0, &t);
+	int rc = recv_mmsg(-1, &mh, 1, 0, ts);
 	printf("recvmmsg(-1, %p, 1, 0, {tv_sec=0, tv_nsec=12345678})"
-	       " = %d %s (%m)\n", &mh, rc, errno2name());
+	       " = %s\n", &mh, sprintrc(rc));
 
-	rc = recv_mmsg(fds[0], &mh, 1, 0, &t);
+	rc = recv_mmsg(fds[0], &mh, 1, 0, ts);
 	if (rc < 0)
 		perror_msg_and_skip("recvmmsg");
 	printf("recvmmsg(%d, [{msg_hdr={msg_name=NULL, msg_namelen=0"
@@ -64,7 +67,23 @@
 	       ", msg_controllen=0, msg_flags=0}, msg_len=1}], 1, 0"
 	       ", {tv_sec=0, tv_nsec=12345678}) = "
 	       "%d (left {tv_sec=0, tv_nsec=%d})\n",
-	       fds[0], rc, (int) t.tv_nsec);
+	       fds[0], rc, (int) ts->tv_nsec);
+
+	ts->tv_sec = 0xdeadbeefU;
+	ts->tv_nsec = 0xfacefeedU;
+
+	rc = recv_mmsg(fds[0], &mh, 1, 0, ts);
+	printf("recvmmsg(%d, %p, 1, 0, {tv_sec=%lld, tv_nsec=%llu}) = %s\n",
+	       fds[0], &mh, (long long) ts->tv_sec,
+	       zero_extend_signed_to_ull(ts->tv_nsec), sprintrc(rc));
+
+	ts->tv_sec = (time_t) 0xcafef00ddeadbeefLL;
+	ts->tv_nsec = (long) 0xbadc0dedfacefeedLL;
+
+	rc = recv_mmsg(fds[0], &mh, 1, 0, ts);
+	printf("recvmmsg(%d, %p, 1, 0, {tv_sec=%lld, tv_nsec=%llu}) = %s\n",
+	       fds[0], &mh, (long long) ts->tv_sec,
+	       zero_extend_signed_to_ull(ts->tv_nsec), sprintrc(rc));
 
 	puts("+++ exited with 0 +++");
 	return 0;
diff --git a/tests/recvmmsg-timeout.gen.test b/tests/recvmmsg-timeout.gen.test
new file mode 100755
index 0000000..6306de7
--- /dev/null
+++ b/tests/recvmmsg-timeout.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (recvmmsg-timeout -a25 -e trace=recvmmsg); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a25 -e trace=recvmmsg
diff --git a/tests/recvmmsg-timeout.test b/tests/recvmmsg-timeout.test
deleted file mode 100755
index 36a1222..0000000
--- a/tests/recvmmsg-timeout.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of timeout argument of recvmmsg syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a25 -e trace=recvmmsg
diff --git a/tests/recvmsg.gen.test b/tests/recvmsg.gen.test
new file mode 100755
index 0000000..fc8ef06
--- /dev/null
+++ b/tests/recvmsg.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (recvmsg -eread=0 -ewrite=1 -e trace=recvmsg,sendmsg); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -eread=0 -ewrite=1 -e trace=recvmsg,sendmsg
diff --git a/tests/recvmsg.test b/tests/recvmsg.test
deleted file mode 100755
index e373a20..0000000
--- a/tests/recvmsg.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of recvmsg and sendmsg syscalls.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -eread=0 -ewrite=1 -e trace=recvmsg,sendmsg
diff --git a/tests/redirect-fds.test b/tests/redirect-fds.test
index ddef8fa..3da6942 100755
--- a/tests/redirect-fds.test
+++ b/tests/redirect-fds.test
@@ -3,6 +3,7 @@
 # Check that strace does not leak placeholder descriptors.
 #
 # Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+# Copyright (c) 2016-2017 The strace developers.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -47,18 +48,17 @@
 	a2="$2"
 	a3="$3"
 
+	rm -f "$LOG" "$fd0" "$fd1" "$fd2"
 	touch "$LOG" "$fd0" ||
 		framework_skip_ 'failed to create files'
 
-	set -- "\"./$NAME\"" "\"$1\"" "\"$2\"" "\"$3\""
+	set -- "\"../$NAME\"" "\"$1\"" "\"$2\"" "\"$3\""
 	eval "$@" "<${a1:-&-}" ">${a2:-&-}" "2>${a3:-&-}" ||
 			fail_ "$* failed with code $rc"
 
 	set -- "$STRACE" -o"$LOG" -echdir "$@"
 	eval "$@" "<${a1:-&-}" ">${a2:-&-}" "2>${a3:-&-}" ||
 		dump_log_and_fail_with "$* failed with code $?"
-
-	rm -f "$LOG" "$fd0" "$fd1" "$fd2"
 }
 
 check_fd "$fd0" "$fd1" "$fd2"
diff --git a/tests/redirect.test b/tests/redirect.test
index fa0c536..d70754e 100755
--- a/tests/redirect.test
+++ b/tests/redirect.test
@@ -3,6 +3,7 @@
 # Ensure that strace does not retain stdin and stdout descriptors.
 #
 # Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+# Copyright (c) 2016-2017 The strace developers.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -74,5 +75,3 @@
 if [ -s "$OUT" ]; then
 	fail_ "$STRACE failed to redirect standard output"
 fi
-
-rm -f -- "$OUT"
diff --git a/tests/regex.gen.test b/tests/regex.gen.test
new file mode 100755
index 0000000..71a02d6
--- /dev/null
+++ b/tests/regex.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (regex test_trace_expr '' -etrace='/^(.*_)?statv?fs'); do not edit.
+. "${srcdir=.}/init.sh"
+test_trace_expr '' -etrace='/^(.*_)?statv?fs'
diff --git a/tests/regex.in b/tests/regex.in
new file mode 100755
index 0000000..7c4adfe
--- /dev/null
+++ b/tests/regex.in
@@ -0,0 +1,2 @@
+statfs	-a17
+statfs64	-a23
diff --git a/tests/remap_file_pages.gen.test b/tests/remap_file_pages.gen.test
new file mode 100755
index 0000000..e489473
--- /dev/null
+++ b/tests/remap_file_pages.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (remap_file_pages ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/remap_file_pages.test b/tests/remap_file_pages.test
deleted file mode 100755
index 9d51a9a..0000000
--- a/tests/remap_file_pages.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check remap_file_pages syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff
diff --git a/tests/rename.gen.test b/tests/rename.gen.test
new file mode 100755
index 0000000..07f0180
--- /dev/null
+++ b/tests/rename.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (rename -a35); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a35
diff --git a/tests/rename.test b/tests/rename.test
deleted file mode 100755
index 9067e4c..0000000
--- a/tests/rename.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check rename syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a35
diff --git a/tests/renameat.gen.test b/tests/renameat.gen.test
new file mode 100755
index 0000000..f2879cd
--- /dev/null
+++ b/tests/renameat.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (renameat ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/renameat.test b/tests/renameat.test
deleted file mode 100755
index 9b0a61d..0000000
--- a/tests/renameat.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check renameat syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff
diff --git a/tests/renameat2.gen.test b/tests/renameat2.gen.test
new file mode 100755
index 0000000..cd7c34c
--- /dev/null
+++ b/tests/renameat2.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (renameat2 ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/renameat2.test b/tests/renameat2.test
deleted file mode 100755
index 4c176bb..0000000
--- a/tests/renameat2.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check renameat2 syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff
diff --git a/tests/request_key.gen.test b/tests/request_key.gen.test
new file mode 100755
index 0000000..aeac708
--- /dev/null
+++ b/tests/request_key.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (request_key -a33 -s12); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a33 -s12
diff --git a/tests/request_key.test b/tests/request_key.test
deleted file mode 100755
index 9812a18..0000000
--- a/tests/request_key.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of request_key syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a33 -s12
diff --git a/tests/restart_syscall.c b/tests/restart_syscall.c
index e492e62..d06f9c2 100644
--- a/tests/restart_syscall.c
+++ b/tests/restart_syscall.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -55,11 +56,11 @@
 	if (nanosleep(&req, &rem))
 		perror_msg_and_fail("nanosleep");
 
-	printf("nanosleep\\(\\{tv_sec=%jd, tv_nsec=%jd\\}, "
-	       "\\{tv_sec=%jd, tv_nsec=%jd\\}\\)"
+	printf("nanosleep\\(\\{tv_sec=%lld, tv_nsec=%llu\\}"
+	       ", \\{tv_sec=%lld, tv_nsec=%llu\\}\\)"
 	       " = \\? ERESTART_RESTARTBLOCK \\(Interrupted by signal\\)\n",
-	       (intmax_t) req.tv_sec, (intmax_t) req.tv_nsec,
-	       (intmax_t) rem.tv_sec, (intmax_t) rem.tv_nsec);
+	       (long long) req.tv_sec, zero_extend_signed_to_ull(req.tv_nsec),
+	       (long long) rem.tv_sec, zero_extend_signed_to_ull(rem.tv_nsec));
 	puts("--- SIGALRM \\{si_signo=SIGALRM, si_code=SI_KERNEL\\} ---");
 #ifdef __arm__
 /* old kernels used to overwrite ARM_r0 with -EINTR */
@@ -67,11 +68,12 @@
 #else
 # define ALTERNATIVE_NANOSLEEP_REQ ""
 #endif
-	printf("(nanosleep\\((%s\\{tv_sec=%jd, tv_nsec=%jd\\}), "
-	       "%p|restart_syscall\\(<\\.\\.\\."
+	printf("(nanosleep\\((%s\\{tv_sec=%lld, tv_nsec=%llu\\})"
+	       ", %p|restart_syscall\\(<\\.\\.\\."
 	       " resuming interrupted nanosleep \\.\\.\\.>)\\) = 0\n",
 	       ALTERNATIVE_NANOSLEEP_REQ,
-	       (intmax_t) req.tv_sec, (intmax_t) req.tv_nsec, &rem);
+	       (long long) req.tv_sec, zero_extend_signed_to_ull(req.tv_nsec),
+	       &rem);
 
 	puts("\\+\\+\\+ exited with 0 \\+\\+\\+");
 	return 0;
diff --git a/tests/restart_syscall.test b/tests/restart_syscall.test
index 6dfda16..f7dfa04 100755
--- a/tests/restart_syscall.test
+++ b/tests/restart_syscall.test
@@ -6,8 +6,5 @@
 
 run_prog > /dev/null
 syscalls=nanosleep,restart_syscall
-run_strace -a20 -e trace=$syscalls $args > "$OUT"
-match_grep "$LOG" "$OUT"
-rm -f "$OUT"
-
-exit 0
+run_strace -a20 -e trace=$syscalls $args > "$EXP"
+match_grep "$LOG" "$EXP"
diff --git a/tests/rmdir.gen.test b/tests/rmdir.gen.test
new file mode 100755
index 0000000..b511039
--- /dev/null
+++ b/tests/rmdir.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (rmdir -a22); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a22
diff --git a/tests/rmdir.test b/tests/rmdir.test
deleted file mode 100755
index 81ee66b..0000000
--- a/tests/rmdir.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check rmdir syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a22
diff --git a/tests/rt_sigpending.c b/tests/rt_sigpending.c
index accf691..b57921f 100644
--- a/tests/rt_sigpending.c
+++ b/tests/rt_sigpending.c
@@ -2,6 +2,7 @@
  * This file is part of rt_sigpending strace test.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -78,7 +79,7 @@
 
 	const unsigned int big_size = 1024 / 8;
 	void *k_set = tail_alloc(big_size);
-	sigset_t *const libc_set = tail_alloc(sizeof(sigset_t));
+	TAIL_ALLOC_OBJECT_CONST_PTR(sigset_t, libc_set);
 
 	sigemptyset(libc_set);
 	if (sigprocmask(SIG_SETMASK, libc_set, NULL))
diff --git a/tests/rt_sigpending.gen.test b/tests/rt_sigpending.gen.test
new file mode 100755
index 0000000..0458876
--- /dev/null
+++ b/tests/rt_sigpending.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (rt_sigpending -a20); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a20
diff --git a/tests/rt_sigpending.test b/tests/rt_sigpending.test
deleted file mode 100755
index 40c83a8..0000000
--- a/tests/rt_sigpending.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check rt_sigpending syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a20
diff --git a/tests/rt_sigprocmask.c b/tests/rt_sigprocmask.c
index 27e357f..c38ac94 100644
--- a/tests/rt_sigprocmask.c
+++ b/tests/rt_sigprocmask.c
@@ -2,6 +2,7 @@
  * This file is part of rt_sigprocmask strace test.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -91,7 +92,7 @@
 
 	void *const k_set = tail_alloc(set_size);
 	void *const old_set = tail_alloc(set_size);
-	sigset_t *const libc_set = tail_alloc(sizeof(sigset_t));
+	TAIL_ALLOC_OBJECT_CONST_PTR(sigset_t, libc_set);
 
 	memset(k_set, 0, set_size);
 	if (k_sigprocmask(SIG_SETMASK, k_set, NULL, set_size))
diff --git a/tests/rt_sigprocmask.gen.test b/tests/rt_sigprocmask.gen.test
new file mode 100755
index 0000000..a21c6db
--- /dev/null
+++ b/tests/rt_sigprocmask.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (rt_sigprocmask ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/rt_sigprocmask.test b/tests/rt_sigprocmask.test
deleted file mode 100755
index 1e60ebd..0000000
--- a/tests/rt_sigprocmask.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check rt_sigprocmask syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff
diff --git a/tests/rt_sigqueueinfo.c b/tests/rt_sigqueueinfo.c
index aba6776..f803d91 100644
--- a/tests/rt_sigqueueinfo.c
+++ b/tests/rt_sigqueueinfo.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015 Elvira Khabirova <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff --git a/tests/rt_sigqueueinfo.gen.test b/tests/rt_sigqueueinfo.gen.test
new file mode 100755
index 0000000..7baf0e4
--- /dev/null
+++ b/tests/rt_sigqueueinfo.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (rt_sigqueueinfo -esignal=none); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -esignal=none
diff --git a/tests/rt_sigqueueinfo.test b/tests/rt_sigqueueinfo.test
deleted file mode 100755
index c03c76f..0000000
--- a/tests/rt_sigqueueinfo.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of rt_sigqueueinfo syscall
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -esignal=none
diff --git a/tests/rt_sigreturn.c b/tests/rt_sigreturn.c
new file mode 100644
index 0000000..40d1589
--- /dev/null
+++ b/tests/rt_sigreturn.c
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2015-2017 Dmitry V. Levin <[email protected]>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "tests.h"
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifdef ASM_SIGRTMIN
+# define RT_0 ASM_SIGRTMIN
+#else
+/* Linux kernel >= 3.18 defines SIGRTMIN to 32 on all architectures. */
+# define RT_0 32
+#endif
+
+static void
+handler(int no, siginfo_t *si, void *uc)
+{
+}
+
+int
+main(void)
+{
+	static sigset_t set;
+	sigemptyset(&set);
+	sigaddset(&set, SIGINT);
+	sigaddset(&set, SIGUSR2);
+	sigaddset(&set, SIGCHLD);
+	sigaddset(&set, RT_0 +  3);
+	sigaddset(&set, RT_0 +  4);
+	sigaddset(&set, RT_0 +  5);
+	sigaddset(&set, RT_0 + 26);
+	sigaddset(&set, RT_0 + 27);
+	if (sigprocmask(SIG_SETMASK, &set, NULL))
+		perror_msg_and_fail("sigprocmask");
+	sigemptyset(&set);
+
+	static const struct sigaction sa = {
+		.sa_sigaction = handler,
+		.sa_flags = SA_SIGINFO
+	};
+	if (sigaction(SIGUSR1, &sa, NULL))
+		perror_msg_and_fail("sigaction");
+
+	if (raise(SIGUSR1))
+		perror_msg_and_fail("raise");
+
+	static const char *const sigs =
+		(SIGUSR2 < SIGCHLD) ? "INT USR2 CHLD" : "INT CHLD USR2";
+	static const char *const rt_sigs = "RT_3 RT_4 RT_5 RT_26 RT_27";
+	printf("rt_sigreturn({mask=[%s %s]}) = 0\n", sigs, rt_sigs);
+
+	puts("+++ exited with 0 +++");
+	return 0;
+}
diff --git a/tests/rt_sigreturn.gen.test b/tests/rt_sigreturn.gen.test
new file mode 100755
index 0000000..0672f11
--- /dev/null
+++ b/tests/rt_sigreturn.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (rt_sigreturn -esignal='!USR1'); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -esignal='!USR1'
diff --git a/tests/rt_sigsuspend.c b/tests/rt_sigsuspend.c
index 73e1336..422ec19 100644
--- a/tests/rt_sigsuspend.c
+++ b/tests/rt_sigsuspend.c
@@ -2,6 +2,7 @@
  * This file is part of rt_sigsuspend strace test.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -88,7 +89,7 @@
 	void *k_set = tail_alloc(big_size);
 	memset(k_set, 0, big_size);
 
-	sigset_t *const libc_set = tail_alloc(sizeof(sigset_t));
+	TAIL_ALLOC_OBJECT_CONST_PTR(sigset_t, libc_set);
 	sigemptyset(libc_set);
 	sigaddset(libc_set, SIGUSR1);
 	if (sigprocmask(SIG_SETMASK, libc_set, NULL))
diff --git a/tests/rt_sigsuspend.gen.test b/tests/rt_sigsuspend.gen.test
new file mode 100755
index 0000000..d5d1d5f
--- /dev/null
+++ b/tests/rt_sigsuspend.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (rt_sigsuspend -a20 -esignal=none); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a20 -esignal=none
diff --git a/tests/rt_sigsuspend.test b/tests/rt_sigsuspend.test
deleted file mode 100755
index 2e30fd4..0000000
--- a/tests/rt_sigsuspend.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check rt_sigsuspend syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a20 -esignal=none
diff --git a/tests/rt_sigtimedwait.c b/tests/rt_sigtimedwait.c
index 10311e6..40544c7 100644
--- a/tests/rt_sigtimedwait.c
+++ b/tests/rt_sigtimedwait.c
@@ -2,6 +2,7 @@
  * This file is part of rt_sigtimedwait strace test.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -54,25 +55,27 @@
 	for (;;) {
 		assert(k_sigtimedwait(set, NULL, timeout, size) == -1);
 		if (EINTR == errno) {
-			tprintf("rt_sigtimedwait(%s, NULL, "
-				"{tv_sec=%jd, tv_nsec=%jd}, %u)"
+			tprintf("rt_sigtimedwait(%s, NULL"
+				", {tv_sec=%lld, tv_nsec=%llu}, %u)"
 				" = -1 EAGAIN (%m)\n", text,
-				(intmax_t) timeout->tv_sec,
-				(intmax_t) timeout->tv_nsec,
+				(long long) timeout->tv_sec,
+				zero_extend_signed_to_ull(timeout->tv_nsec),
 				size);
 		} else {
 			if (size < sizeof(long))
-				tprintf("rt_sigtimedwait(%p, NULL, "
-					"{tv_sec=%jd, tv_nsec=%jd}"
+				tprintf("rt_sigtimedwait(%p, NULL"
+					", {tv_sec=%lld, tv_nsec=%llu}"
 					", %u) = -1 EINVAL (%m)\n",
-					set, (intmax_t) timeout->tv_sec,
-					(intmax_t) timeout->tv_nsec, size);
+					set, (long long) timeout->tv_sec,
+					zero_extend_signed_to_ull(timeout->tv_nsec),
+					size);
 			else
-				tprintf("rt_sigtimedwait(%s, NULL, "
-					"{tv_sec=%jd, tv_nsec=%jd}"
+				tprintf("rt_sigtimedwait(%s, NULL"
+					", {tv_sec=%lld, tv_nsec=%llu}"
 					", %u) = -1 EINVAL (%m)\n",
-					text, (intmax_t) timeout->tv_sec,
-					(intmax_t) timeout->tv_nsec, size);
+					text, (long long) timeout->tv_sec,
+					zero_extend_signed_to_ull(timeout->tv_nsec),
+					size);
 		}
 		if (!size)
 			break;
@@ -86,8 +89,8 @@
 {
 	tprintf("%s", "");
 
-	siginfo_t *const info = tail_alloc(sizeof(*info));
-	struct timespec *const timeout = tail_alloc(sizeof(*timeout));
+	TAIL_ALLOC_OBJECT_CONST_PTR(siginfo_t, info);
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct timespec, timeout);
 	timeout->tv_sec = 0;
 	timeout->tv_nsec = 42;
 
@@ -100,37 +103,58 @@
 		assert(k_sigtimedwait(k_set, NULL, timeout, set_size) == -1);
 		if (EAGAIN == errno)
 			break;
-		tprintf("rt_sigtimedwait(%p, NULL, {tv_sec=%jd, tv_nsec=%jd}, %u)"
-			" = -1 EINVAL (%m)\n",
-			k_set, (intmax_t) timeout->tv_sec,
-			(intmax_t) timeout->tv_nsec, set_size);
+		tprintf("rt_sigtimedwait(%p, NULL, {tv_sec=%lld, tv_nsec=%llu}"
+			", %u) = -1 EINVAL (%m)\n",
+			k_set, (long long) timeout->tv_sec,
+			zero_extend_signed_to_ull(timeout->tv_nsec), set_size);
 	}
 	if (!set_size)
 		perror_msg_and_fail("rt_sigtimedwait");
-	tprintf("rt_sigtimedwait([], NULL, {tv_sec=%jd, tv_nsec=%jd}, %u) = -1 EAGAIN (%m)\n",
-		(intmax_t) timeout->tv_sec, (intmax_t) timeout->tv_nsec,
-		set_size);
+	tprintf("rt_sigtimedwait([], NULL, {tv_sec=%lld, tv_nsec=%llu}, %u)"
+		" = -1 EAGAIN (%m)\n",
+		(long long) timeout->tv_sec,
+		zero_extend_signed_to_ull(timeout->tv_nsec), set_size);
 
-	sigset_t *const libc_set = tail_alloc(sizeof(sigset_t));
+	timeout->tv_sec = 0xdeadbeefU;
+	timeout->tv_nsec = 0xfacefeedU;
+	assert(k_sigtimedwait(k_set, NULL, timeout, set_size) == -1);
+	tprintf("rt_sigtimedwait([], NULL, {tv_sec=%lld, tv_nsec=%llu}"
+		", %u) = -1 EINVAL (%m)\n",
+		(long long) timeout->tv_sec,
+		zero_extend_signed_to_ull(timeout->tv_nsec), set_size);
+
+	timeout->tv_sec = (time_t) 0xcafef00ddeadbeefLL;
+	timeout->tv_nsec = (long) 0xbadc0dedfacefeedLL;
+	assert(k_sigtimedwait(k_set, NULL, timeout, set_size) == -1);
+	tprintf("rt_sigtimedwait([], NULL, {tv_sec=%lld, tv_nsec=%llu}"
+		", %u) = -1 EINVAL (%m)\n",
+		(long long) timeout->tv_sec,
+		zero_extend_signed_to_ull(timeout->tv_nsec), set_size);
+
+	timeout->tv_sec = 0;
+	timeout->tv_nsec = 42;
+
+	TAIL_ALLOC_OBJECT_CONST_PTR(sigset_t, libc_set);
 	sigemptyset(libc_set);
 	sigaddset(libc_set, SIGHUP);
 	memcpy(k_set, libc_set, set_size);
 
 	assert(k_sigtimedwait(k_set, info, timeout, set_size) == -1);
 	assert(EAGAIN == errno);
-	tprintf("rt_sigtimedwait([HUP], %p, {tv_sec=%jd, tv_nsec=%jd}, %u) = -1 EAGAIN (%m)\n",
-		info, (intmax_t) timeout->tv_sec,
-		(intmax_t) timeout->tv_nsec, set_size);
+	tprintf("rt_sigtimedwait([HUP], %p, {tv_sec=%lld, tv_nsec=%llu}, %u)"
+		" = -1 EAGAIN (%m)\n",
+		info, (long long) timeout->tv_sec,
+		zero_extend_signed_to_ull(timeout->tv_nsec), set_size);
 
 	sigaddset(libc_set, SIGINT);
 	memcpy(k_set, libc_set, set_size);
 
 	assert(k_sigtimedwait(k_set, info, timeout, set_size) == -1);
 	assert(EAGAIN == errno);
-	tprintf("rt_sigtimedwait([HUP INT], %p, {tv_sec=%jd, tv_nsec=%jd}, %u)"
+	tprintf("rt_sigtimedwait([HUP INT], %p, {tv_sec=%lld, tv_nsec=%llu}, %u)"
 		" = -1 EAGAIN (%m)\n",
-		info, (intmax_t) timeout->tv_sec,
-		(intmax_t) timeout->tv_nsec, set_size);
+		info, (long long) timeout->tv_sec,
+		zero_extend_signed_to_ull(timeout->tv_nsec), set_size);
 
 	sigaddset(libc_set, SIGQUIT);
 	sigaddset(libc_set, SIGALRM);
@@ -139,17 +163,19 @@
 
 	assert(k_sigtimedwait(k_set, info, timeout, set_size) == -1);
 	assert(EAGAIN == errno);
-	tprintf("rt_sigtimedwait(%s, %p, {tv_sec=%jd, tv_nsec=%jd}, %u) = -1 EAGAIN (%m)\n",
+	tprintf("rt_sigtimedwait(%s, %p, {tv_sec=%lld, tv_nsec=%llu}, %u)"
+		" = -1 EAGAIN (%m)\n",
 		"[HUP INT QUIT ALRM TERM]",
-		info, (intmax_t) timeout->tv_sec,
-		(intmax_t) timeout->tv_nsec, set_size);
+		info, (long long) timeout->tv_sec,
+		zero_extend_signed_to_ull(timeout->tv_nsec), set_size);
 
 	memset(k_set - set_size, -1, set_size);
 	assert(k_sigtimedwait(k_set - set_size, info, timeout, set_size) == -1);
 	assert(EAGAIN == errno);
-	tprintf("rt_sigtimedwait(~[], %p, {tv_sec=%jd, tv_nsec=%jd}, %u) = -1 EAGAIN (%m)\n",
-		info, (intmax_t) timeout->tv_sec,
-		(intmax_t) timeout->tv_nsec, set_size);
+	tprintf("rt_sigtimedwait(~[], %p, {tv_sec=%lld, tv_nsec=%llu}, %u)"
+		" = -1 EAGAIN (%m)\n",
+		info, (long long) timeout->tv_sec,
+		zero_extend_signed_to_ull(timeout->tv_nsec), set_size);
 
 	if (sigprocmask(SIG_SETMASK, libc_set, NULL))
 		perror_msg_and_fail("sigprocmask");
@@ -164,9 +190,11 @@
 	raise(SIGALRM);
 	assert(k_sigtimedwait(k_set, info, timeout, set_size) == SIGALRM);
 	tprintf("rt_sigtimedwait(%s, {si_signo=%s, si_code=SI_TKILL"
-		", si_pid=%d, si_uid=%d}, {tv_sec=%jd, tv_nsec=%jd}, %u) = %d (%s)\n",
+		", si_pid=%d, si_uid=%d}, {tv_sec=%lld, tv_nsec=%llu}, %u)"
+		" = %d (%s)\n",
 		"[HUP INT QUIT ALRM TERM]", "SIGALRM", getpid(), getuid(),
-		(intmax_t) timeout->tv_sec, (intmax_t) timeout->tv_nsec,
+		(long long) timeout->tv_sec,
+		zero_extend_signed_to_ull(timeout->tv_nsec),
 		set_size, SIGALRM, "SIGALRM");
 
 	raise(SIGALRM);
diff --git a/tests/rt_sigtimedwait.gen.test b/tests/rt_sigtimedwait.gen.test
new file mode 100755
index 0000000..2b18e7a
--- /dev/null
+++ b/tests/rt_sigtimedwait.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (rt_sigtimedwait -a38); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a38
diff --git a/tests/rt_sigtimedwait.test b/tests/rt_sigtimedwait.test
deleted file mode 100755
index e15fb77..0000000
--- a/tests/rt_sigtimedwait.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check rt_sigtimedwait syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a38
diff --git a/tests/rt_tgsigqueueinfo.c b/tests/rt_tgsigqueueinfo.c
index ec09348..3b2da2a 100644
--- a/tests/rt_tgsigqueueinfo.c
+++ b/tests/rt_tgsigqueueinfo.c
@@ -2,6 +2,7 @@
  * This file is part of rt_tgsigqueueinfo strace test.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -42,9 +43,9 @@
 k_tgsigqueueinfo(const pid_t pid, const int sig, const void *const info)
 {
 	return syscall(__NR_rt_tgsigqueueinfo,
-		       (unsigned long) 0xffffffff00000000ULL | pid,
-		       (unsigned long) 0xffffffff00000000ULL | pid,
-		       (unsigned long) 0xffffffff00000000ULL | sig,
+		       F8ILL_KULONG_MASK | pid,
+		       F8ILL_KULONG_MASK | pid,
+		       F8ILL_KULONG_MASK | sig,
 		       info);
 }
 
@@ -57,7 +58,7 @@
 	if (sigaction(SIGUSR1, &sa, NULL))
 		perror_msg_and_fail("sigaction");
 
-	siginfo_t *const info = tail_alloc(sizeof(*info));
+	TAIL_ALLOC_OBJECT_CONST_PTR(siginfo_t, info);
 	memset(info, 0, sizeof(*info));
 	info->si_signo = SIGUSR1;
 	info->si_errno = ENOENT;
diff --git a/tests/rt_tgsigqueueinfo.gen.test b/tests/rt_tgsigqueueinfo.gen.test
new file mode 100755
index 0000000..407bbff
--- /dev/null
+++ b/tests/rt_tgsigqueueinfo.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (rt_tgsigqueueinfo -esignal=none); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -esignal=none
diff --git a/tests/rt_tgsigqueueinfo.test b/tests/rt_tgsigqueueinfo.test
deleted file mode 100755
index ab24e2d..0000000
--- a/tests/rt_tgsigqueueinfo.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of rt_tgsigqueueinfo syscall
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -esignal=none
diff --git a/tests/sched.gen.test b/tests/sched.gen.test
new file mode 100755
index 0000000..6747117
--- /dev/null
+++ b/tests/sched.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (sched test_trace_expr times -e/sched); do not edit.
+. "${srcdir=.}/init.sh"
+test_trace_expr times -e/sched
diff --git a/tests/sched.in b/tests/sched.in
new file mode 100755
index 0000000..46031d6
--- /dev/null
+++ b/tests/sched.in
@@ -0,0 +1,7 @@
+sched_xetaffinity	-a28
+sched_xetparam	-a23
+sched_rr_get_interval	-a31
+sched_get_priority_mxx	-a33
+sched_xetattr	-a29
+sched_xetscheduler	-a22
+sched_yield	-a14
diff --git a/tests/sched_get_priority_mxx.gen.test b/tests/sched_get_priority_mxx.gen.test
new file mode 100755
index 0000000..a235997
--- /dev/null
+++ b/tests/sched_get_priority_mxx.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (sched_get_priority_mxx -a33 -e trace=sched_get_priority_min,sched_get_priority_max); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a33 -e trace=sched_get_priority_min,sched_get_priority_max
diff --git a/tests/sched_get_priority_mxx.test b/tests/sched_get_priority_mxx.test
deleted file mode 100755
index 0d1a1a7..0000000
--- a/tests/sched_get_priority_mxx.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check sched_get_priority_min and sched_get_priority_max syscalls decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a33 -e trace=sched_get_priority_min,sched_get_priority_max
diff --git a/tests/sched_rr_get_interval.c b/tests/sched_rr_get_interval.c
index 0aacd2b..000a0be 100644
--- a/tests/sched_rr_get_interval.c
+++ b/tests/sched_rr_get_interval.c
@@ -11,7 +11,7 @@
 int
 main(void)
 {
-	struct timespec *const tp = tail_alloc(sizeof(struct timespec));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct timespec, tp);
 	long rc;
 
 	rc = syscall(__NR_sched_rr_get_interval, 0, NULL);
@@ -25,8 +25,10 @@
 
 	rc = syscall(__NR_sched_rr_get_interval, 0, tp);
 	if (rc == 0)
-		printf("sched_rr_get_interval(0, {tv_sec=%jd, tv_nsec=%jd}) = "
-		       "0\n", (intmax_t)tp->tv_sec, (intmax_t)tp->tv_nsec);
+		printf("sched_rr_get_interval(0, {tv_sec=%lld, tv_nsec=%llu})"
+		       " = 0\n",
+		       (long long) tp->tv_sec,
+		       zero_extend_signed_to_ull(tp->tv_nsec));
 	else
 		printf("sched_rr_get_interval(-1, %p) = %s\n", tp,
 			sprintrc(rc));
diff --git a/tests/sched_rr_get_interval.gen.test b/tests/sched_rr_get_interval.gen.test
new file mode 100755
index 0000000..493de64
--- /dev/null
+++ b/tests/sched_rr_get_interval.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (sched_rr_get_interval -a31); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a31
diff --git a/tests/sched_rr_get_interval.test b/tests/sched_rr_get_interval.test
deleted file mode 100755
index 828ba5d..0000000
--- a/tests/sched_rr_get_interval.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check sched_rr_get_interval syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a31
diff --git a/tests/sched_xetaffinity.gen.test b/tests/sched_xetaffinity.gen.test
new file mode 100755
index 0000000..7a1c75b
--- /dev/null
+++ b/tests/sched_xetaffinity.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (sched_xetaffinity -a28 -e trace=sched_getaffinity,sched_setaffinity); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a28 -e trace=sched_getaffinity,sched_setaffinity
diff --git a/tests/sched_xetaffinity.test b/tests/sched_xetaffinity.test
deleted file mode 100755
index 246ea21..0000000
--- a/tests/sched_xetaffinity.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check sched_getaffinity and sched_setaffinity syscalls decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a28 -e trace=sched_getaffinity,sched_setaffinity
diff --git a/tests/sched_xetattr.c b/tests/sched_xetattr.c
index 1b48491..a9bd2ba 100644
--- a/tests/sched_xetattr.c
+++ b/tests/sched_xetattr.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 Dmitry V. Levin <[email protected]>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -32,95 +32,214 @@
 
 # include <inttypes.h>
 # include <stdio.h>
+# include <sched.h>
 # include <unistd.h>
+# include "sched_attr.h"
+# include "xlat.h"
+# include "xlat/schedulers.h"
+
+static const char *errstr;
+
+static long
+sys_sched_getattr(kernel_ulong_t pid, kernel_ulong_t attr,
+		  kernel_ulong_t size, kernel_ulong_t flags)
+{
+	long rc = syscall(__NR_sched_getattr, pid, attr, size, flags);
+	errstr = sprintrc(rc);
+	return rc;
+}
+
+static long
+sys_sched_setattr(kernel_ulong_t pid, kernel_ulong_t attr, kernel_ulong_t flags)
+{
+	long rc = syscall(__NR_sched_setattr, pid, attr, flags);
+	errstr = sprintrc(rc);
+	return rc;
+}
 
 int
 main(void)
 {
-	struct {
-		uint32_t size;
-		uint32_t sched_policy;
-		uint64_t sched_flags;
-		int32_t  sched_nice;
-		uint32_t sched_priority;
-		uint64_t sched_runtime;
-		uint64_t sched_deadline;
-		uint64_t sched_period;
-	} *sched_attr = tail_alloc(sizeof(*sched_attr));
+	static const kernel_ulong_t bogus_pid =
+		(kernel_ulong_t) 0xdefacedfacefeedULL;
+	static const kernel_ulong_t bogus_size =
+		(kernel_ulong_t) 0xdefacedcafef00dULL;
+	static const kernel_ulong_t bogus_flags =
+		(kernel_ulong_t) 0xdefaceddeadc0deULL;
 
-	long rc = syscall(__NR_sched_getattr, 0xdeadface, NULL, 0, 0);
-	printf("sched_getattr\\(%d, NULL, 0, 0\\) += %s\n",
-		0xdeadface, sprintrc_grep(rc));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct sched_attr, attr);
+	TAIL_ALLOC_OBJECT_CONST_PTR(unsigned int, psize);
+	void *const efault = attr + 1;
 
-	rc = syscall(__NR_sched_getattr, -1,
-		     sched_attr, 0xbadfaced, 0xc0defeed);
-	printf("sched_getattr\\(-1, %p, %u, %u\\) += %s\n",
-		sched_attr, 0xbadfaced, 0xc0defeed, sprintrc_grep(rc));
+	sys_sched_getattr(0, 0, 0, 0);
+	printf("sched_getattr(0, NULL, 0, 0) = %s\n", errstr);
 
-	rc = syscall(__NR_sched_getattr, 0,
-		     sched_attr + 1, sizeof(*sched_attr), 0);
-	printf("sched_getattr\\(0, %p, %u, 0\\) += %s\n",
-		sched_attr + 1, (unsigned)sizeof(*sched_attr),
-		sprintrc_grep(rc));
+	sys_sched_getattr(0, (unsigned long) attr, 0, 0);
+	printf("sched_getattr(0, %p, 0, 0) = %s\n", attr, errstr);
 
-	if (syscall(__NR_sched_getattr, 0, sched_attr, sizeof(*sched_attr), 0))
+	sys_sched_getattr(bogus_pid, 0, 0, 0);
+	printf("sched_getattr(%d, NULL, 0, 0) = %s\n", (int) bogus_pid, errstr);
+
+	sys_sched_getattr(-1U, (unsigned long) attr, bogus_size, bogus_flags);
+	printf("sched_getattr(-1, %p, %s%u, %u) = %s\n",
+	       attr,
+# if defined __arm64__ || defined __aarch64__
+	       "0xdefaced<<32|",
+# else
+	       "",
+# endif
+	       (unsigned) bogus_size, (unsigned) bogus_flags, errstr);
+
+	sys_sched_getattr(0, (unsigned long) efault, sizeof(*attr), 0);
+	printf("sched_getattr(0, %p, %u, 0) = %s\n",
+	       efault, (unsigned) sizeof(*attr), errstr);
+
+	if (sys_sched_getattr(0, (unsigned long) attr, sizeof(*attr), 0))
 		perror_msg_and_skip("sched_getattr");
-
-	printf("sched_getattr\\(0, \\{size=%u, sched_policy=SCHED_[A-Z]+"
-	       ", sched_flags=%s, sched_nice=%d, sched_priority=%u"
+	printf("sched_getattr(0, {size=%u, sched_policy=", attr->size);
+	printxval(schedulers, attr->sched_policy, NULL);
+	printf(", sched_flags=%s, sched_nice=%d, sched_priority=%u"
 	       ", sched_runtime=%" PRIu64 ", sched_deadline=%" PRIu64
-	       ", sched_period=%" PRIu64 "\\}, %u, 0\\) += 0\n",
-	       sched_attr->size,
-	       sched_attr->sched_flags ? "SCHED_FLAG_RESET_ON_FORK" : "0",
-	       sched_attr->sched_nice,
-	       sched_attr->sched_priority,
-	       sched_attr->sched_runtime,
-	       sched_attr->sched_deadline,
-	       sched_attr->sched_period,
-	       (unsigned) sizeof(*sched_attr));
+	       ", sched_period=%" PRIu64 "}, %u, 0) = 0\n",
+	       attr->sched_flags ? "SCHED_FLAG_RESET_ON_FORK" : "0",
+	       attr->sched_nice,
+	       attr->sched_priority,
+	       attr->sched_runtime,
+	       attr->sched_deadline,
+	       attr->sched_period,
+	       (unsigned) sizeof(*attr));
 
-	sched_attr->sched_flags |= 1;
-	if (syscall(__NR_sched_setattr, 0, sched_attr, 0))
+# if defined __arm64__ || defined __aarch64__
+	long rc =
+# endif
+	sys_sched_getattr(F8ILL_KULONG_MASK, (unsigned long) attr,
+			  F8ILL_KULONG_MASK | sizeof(*attr), F8ILL_KULONG_MASK);
+# if defined __arm64__ || defined __aarch64__
+	if (rc) {
+		printf("sched_getattr(0, %p, 0xffffffff<<32|%u, 0) = %s\n",
+		       attr, (unsigned) sizeof(*attr), errstr);
+	} else
+# endif
+	{
+		printf("sched_getattr(0, {size=%u, sched_policy=", attr->size);
+		printxval(schedulers, attr->sched_policy, NULL);
+		printf(", sched_flags=%s, sched_nice=%d, sched_priority=%u"
+		       ", sched_runtime=%" PRIu64 ", sched_deadline=%" PRIu64
+		       ", sched_period=%" PRIu64 "}, %u, 0) = 0\n",
+		       attr->sched_flags ? "SCHED_FLAG_RESET_ON_FORK" : "0",
+		       attr->sched_nice,
+		       attr->sched_priority,
+		       attr->sched_runtime,
+		       attr->sched_deadline,
+		       attr->sched_period,
+		       (unsigned) sizeof(*attr));
+	}
+
+	sys_sched_setattr(bogus_pid, 0, 0);
+	printf("sched_setattr(%d, NULL, 0) = %s\n", (int) bogus_pid, errstr);
+
+	attr->sched_flags |= 1;
+
+	if (sys_sched_setattr(0, (unsigned long) attr, 0))
 		perror_msg_and_skip("sched_setattr");
-
-	printf("sched_setattr\\(0, \\{size=%u, sched_policy=SCHED_[A-Z]+"
-	       ", sched_flags=%s, sched_nice=%d, sched_priority=%u"
+	printf("sched_setattr(0, {size=%u, sched_policy=", attr->size);
+	printxval(schedulers, attr->sched_policy, NULL);
+	printf(", sched_flags=%s, sched_nice=%d, sched_priority=%u"
 	       ", sched_runtime=%" PRIu64 ", sched_deadline=%" PRIu64
-	       ", sched_period=%" PRIu64 "\\}, 0\\) += 0\n",
-	       sched_attr->size,
+	       ", sched_period=%" PRIu64 "}, 0) = 0\n",
 	       "SCHED_FLAG_RESET_ON_FORK",
-	       sched_attr->sched_nice,
-	       sched_attr->sched_priority,
-	       sched_attr->sched_runtime,
-	       sched_attr->sched_deadline,
-	       sched_attr->sched_period);
+	       attr->sched_nice,
+	       attr->sched_priority,
+	       attr->sched_runtime,
+	       attr->sched_deadline,
+	       attr->sched_period);
 
-	sched_attr->size = 0x90807060;
-	sched_attr->sched_policy = 0xca7faced;
-	sched_attr->sched_flags = 0xbadc0ded1057da7aULL;
-	sched_attr->sched_nice = 0xafbfcfdf;
-	sched_attr->sched_priority = 0xb8c8d8e8;
-	sched_attr->sched_runtime = 0xbadcaffedeadf157ULL;
-	sched_attr->sched_deadline = 0xc0de70a57badac75ULL;
-	sched_attr->sched_period = 0xded1ca7edda7aca7ULL;
+	sys_sched_setattr(F8ILL_KULONG_MASK, (unsigned long) attr,
+			  F8ILL_KULONG_MASK);
+	printf("sched_setattr(0, {size=%u, sched_policy=", attr->size);
+	printxval(schedulers, attr->sched_policy, NULL);
+	printf(", sched_flags=%s, sched_nice=%d, sched_priority=%u"
+	       ", sched_runtime=%" PRIu64 ", sched_deadline=%" PRIu64
+	       ", sched_period=%" PRIu64 "}, 0) = 0\n",
+	       "SCHED_FLAG_RESET_ON_FORK",
+	       attr->sched_nice,
+	       attr->sched_priority,
+	       attr->sched_runtime,
+	       attr->sched_deadline,
+	       attr->sched_period);
 
-	rc = syscall(__NR_sched_setattr, 0xfacec0de, sched_attr, 0xbeeff00d);
+	*psize = attr->size;
 
-	printf("sched_setattr\\(%d, \\{size=%u, "
-		"sched_policy=%#x /\\* SCHED_\\?\\?\\? \\*/, "
-		"sched_flags=%#" PRIx64 " /\\* SCHED_FLAG_\\?\\?\\? \\*/, "
-		"sched_nice=%d, sched_priority=%u, sched_runtime=%" PRIu64 ", "
-		"sched_deadline=%" PRIu64 ", sched_period=%" PRIu64 "\\}, "
-		"%u\\) += %s\n",
-		0xfacec0de, sched_attr->size,
-		sched_attr->sched_policy,
-		sched_attr->sched_flags,
-		sched_attr->sched_nice,
-		sched_attr->sched_priority,
-		sched_attr->sched_runtime,
-		sched_attr->sched_deadline,
-		sched_attr->sched_period, 0xbeeff00d, sprintrc_grep(rc));
+	sys_sched_setattr(0, (unsigned long) psize, 0);
+	printf("sched_setattr(0, %p, 0) = %s\n", psize, errstr);
 
+	attr->size = 0;
+
+	sys_sched_setattr(0, (unsigned long) attr, 0);
+	printf("sched_setattr(0, {size=%u, sched_policy=", attr->size);
+	printxval(schedulers, attr->sched_policy, NULL);
+	printf(", sched_flags=%s, sched_nice=%d, sched_priority=%u"
+	       ", sched_runtime=%" PRIu64 ", sched_deadline=%" PRIu64
+	       ", sched_period=%" PRIu64 "}, 0) = 0\n",
+	       "SCHED_FLAG_RESET_ON_FORK",
+	       attr->sched_nice,
+	       attr->sched_priority,
+	       attr->sched_runtime,
+	       attr->sched_deadline,
+	       attr->sched_period);
+
+	attr->size = 1;
+
+	sys_sched_setattr(0, (unsigned long) attr, 0);
+	printf("sched_setattr(0, {size=%u} => {size=%u}, 0) = %s\n",
+	       1, attr->size, errstr);
+
+	attr->size = SCHED_ATTR_MIN_SIZE - 1;
+
+	sys_sched_setattr(0, (unsigned long) attr, 0);
+	printf("sched_setattr(0, {size=%u} => {size=%u}, 0) = %s\n",
+	       SCHED_ATTR_MIN_SIZE - 1, attr->size, errstr);
+
+	attr->size = 0x90807060;
+	attr->sched_policy = 0xca7faced;
+	attr->sched_flags = 0xbadc0ded1057da7aULL;
+	attr->sched_nice = 0xafbfcfdf;
+	attr->sched_priority = 0xb8c8d8e8;
+	attr->sched_runtime = 0xbadcaffedeadf157ULL;
+	attr->sched_deadline = 0xc0de70a57badac75ULL;
+	attr->sched_period = 0xded1ca7edda7aca7ULL;
+
+	sys_sched_setattr(bogus_pid, (unsigned long) attr, bogus_flags);
+	printf("sched_setattr(%d, {size=%u, sched_policy=%#x /* SCHED_??? */, "
+	       "sched_flags=%#" PRIx64 " /* SCHED_FLAG_??? */, "
+	       "sched_nice=%d, sched_priority=%u, sched_runtime=%" PRIu64 ", "
+	       "sched_deadline=%" PRIu64 ", sched_period=%" PRIu64 ", ...}, %u)"
+	       " = %s\n",
+	       (int) bogus_pid,
+	       attr->size,
+	       attr->sched_policy,
+	       attr->sched_flags,
+	       attr->sched_nice,
+	       attr->sched_priority,
+	       attr->sched_runtime,
+	       attr->sched_deadline,
+	       attr->sched_period,
+	       (unsigned) bogus_flags, errstr);
+
+	if (F8ILL_KULONG_SUPPORTED) {
+		const kernel_ulong_t ill = f8ill_ptr_to_kulong(attr);
+
+		sys_sched_getattr(0, ill, sizeof(*attr), 0);
+		printf("sched_getattr(0, %#llx, %u, 0) = %s\n",
+		       (unsigned long long) ill, (unsigned) sizeof(*attr),
+		       errstr);
+
+		sys_sched_setattr(0, ill, 0);
+		printf("sched_setattr(0, %#llx, 0) = %s\n",
+		       (unsigned long long) ill, errstr);
+	}
+
+	puts("+++ exited with 0 +++");
 	return 0;
 }
 
diff --git a/tests/sched_xetattr.gen.test b/tests/sched_xetattr.gen.test
new file mode 100755
index 0000000..e4f31c5
--- /dev/null
+++ b/tests/sched_xetattr.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (sched_xetattr -a29 -e trace=sched_getattr,sched_setattr); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a29 -e trace=sched_getattr,sched_setattr
diff --git a/tests/sched_xetattr.test b/tests/sched_xetattr.test
deleted file mode 100755
index c2c7914..0000000
--- a/tests/sched_xetattr.test
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-
-# Check sched_getattr and sched_setattr syscalls decoding.
-
-. "${srcdir=.}/init.sh"
-
-run_prog > /dev/null
-run_strace -e sched_getattr,sched_setattr $args > "$OUT"
-match_grep "$LOG" "$OUT"
-rm -f "$OUT"
-
-exit 0
diff --git a/tests/sched_xetparam.gen.test b/tests/sched_xetparam.gen.test
new file mode 100755
index 0000000..220ffb2
--- /dev/null
+++ b/tests/sched_xetparam.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (sched_xetparam -a23 -e trace=sched_getparam,sched_setparam); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a23 -e trace=sched_getparam,sched_setparam
diff --git a/tests/sched_xetparam.test b/tests/sched_xetparam.test
deleted file mode 100755
index c9fede1..0000000
--- a/tests/sched_xetparam.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check sched_getparam and sched_setparam syscalls decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a23 -e trace=sched_getparam,sched_setparam
diff --git a/tests/sched_xetscheduler.c b/tests/sched_xetscheduler.c
index 7faee8c..8248a0c 100644
--- a/tests/sched_xetscheduler.c
+++ b/tests/sched_xetscheduler.c
@@ -10,7 +10,7 @@
 int
 main(void)
 {
-	struct sched_param *const param = tail_alloc(sizeof(struct sched_param));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct sched_param, param);
 	long rc = syscall(__NR_sched_getscheduler, 0);
 	const char *scheduler;
 	switch (rc) {
diff --git a/tests/sched_xetscheduler.gen.test b/tests/sched_xetscheduler.gen.test
new file mode 100755
index 0000000..0a80072
--- /dev/null
+++ b/tests/sched_xetscheduler.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (sched_xetscheduler -a22 -e trace=sched_getscheduler,sched_setscheduler); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a22 -e trace=sched_getscheduler,sched_setscheduler
diff --git a/tests/sched_xetscheduler.test b/tests/sched_xetscheduler.test
deleted file mode 100755
index 07c93f3..0000000
--- a/tests/sched_xetscheduler.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check sched_getscheduler and sched_setscheduler syscalls decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a22 -e trace=sched_getscheduler,sched_setscheduler
diff --git a/tests/sched_yield.gen.test b/tests/sched_yield.gen.test
new file mode 100755
index 0000000..3f4542f
--- /dev/null
+++ b/tests/sched_yield.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (sched_yield -a14); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a14
diff --git a/tests/sched_yield.test b/tests/sched_yield.test
deleted file mode 100755
index f0c2c30..0000000
--- a/tests/sched_yield.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check sched_yield syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a14
diff --git a/tests/scm_rights-fd.test b/tests/scm_rights-fd.test
index 8447375..279666e 100755
--- a/tests/scm_rights-fd.test
+++ b/tests/scm_rights-fd.test
@@ -3,6 +3,7 @@
 # Check how SCM_RIGHTS and SCM_CREDENTIALS control messages are decoded in -y mode.
 #
 # Copyright (c) 2014-2015 Dmitry V. Levin <[email protected]>
+# Copyright (c) 2014-2017 The strace developers.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -34,22 +35,19 @@
 	framework_skip_ '/proc/self/fd/ is not available'
 
 check_prog mkdir
-check_prog rm
 check_prog seq
 check_prog touch
 
-dir="$LOG.dir"
-rm -rf -- "$dir"
-mkdir -- "$dir" ||
+mkdir dir ||
 	framework_skip_ 'failed to create a directory'
 
-file="$dir/$(for i in $(seq 1 127); do echo A; done; echo Z)"
+file="dir/$(for i in $(seq 1 127); do echo A; done; echo Z)"
 
 touch -- "$file" ||
 	framework_skip_ 'failed to create a file'
 
-run_prog ./scm_rights /dev/zero
-run_strace -y -x -enetwork $args "$file"
+run_prog ../scm_rights /dev/zero
+run_strace -y -x -e%network $args "$file"
 
 hex='[[:xdigit:]]'
 n='[1-9][0-9]*'
@@ -66,15 +64,9 @@
 rights='\{cmsg_len='"$n"', cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, cmsg_data='"$rights_data"'\}'
 creds='\{cmsg_len='"$n"', cmsg_level=SOL_SOCKET, cmsg_type=SCM_CREDENTIALS, cmsg_data='"$ids"'\}'
 
-EXPECTED="$LOG.expected"
-
-cat > "$EXPECTED" << __EOF__
+cat > "$EXP" << __EOF__
 sendmsg\\(3$socket, $msg_head\\[$rights\\]$msg_tail\\}, 0\\) = 15
 recvmsg\\(0$socket, $msg_head\\[$creds, $rights\\]$msg_tail\\}, 0\\) = 15
 __EOF__
 
-match_grep "$LOG" "$EXPECTED"
-rm -f "$EXPECTED"
-rm -rf -- "$dir"
-
-exit 0
+match_grep "$LOG" "$EXP"
diff --git a/tests/scm_rights.c b/tests/scm_rights.c
index 42caed7..632cf91 100644
--- a/tests/scm_rights.c
+++ b/tests/scm_rights.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2014-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2014-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -44,11 +45,11 @@
 	void *data = tail_alloc(data_size);
 	memcpy(data, sample, data_size);
 
-	struct iovec *iov = tail_alloc(sizeof(struct iovec));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct iovec, iov);
 	iov->iov_base = data;
 	iov->iov_len = data_size;
 
-	struct msghdr *mh = tail_alloc(sizeof(struct msghdr));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct msghdr, mh);
 	memset(mh, 0, sizeof(*mh));
 	mh->msg_iov = iov;
 	mh->msg_iovlen = 1;
diff --git a/tests/scno_tampering.sh b/tests/scno_tampering.sh
index 6aa7843..094175e 100755
--- a/tests/scno_tampering.sh
+++ b/tests/scno_tampering.sh
@@ -3,6 +3,7 @@
 # Skip the test if arch+kernel combination is not supported.
 #
 # Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+# Copyright (c) 2016-2017 The strace developers.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
diff --git a/tests/seccomp-filter-v.c b/tests/seccomp-filter-v.c
index dbf686d..fe88ac7 100644
--- a/tests/seccomp-filter-v.c
+++ b/tests/seccomp-filter-v.c
@@ -2,6 +2,7 @@
  * Check verbose decoding of seccomp SECCOMP_SET_MODE_FILTER.
  *
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -105,7 +106,7 @@
 		tail_memdup(filter_c, sizeof(filter_c));
 	struct sock_filter *const big_filter =
 		tail_alloc(sizeof(*big_filter) * (BPF_MAXINSNS + 1));
-	struct sock_fprog *const prog = tail_alloc(sizeof(*prog));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct sock_fprog, prog);
 
 	int fds[2];
 	if (pipe(fds))
diff --git a/tests/seccomp-filter-v.gen.test b/tests/seccomp-filter-v.gen.test
new file mode 100755
index 0000000..efce637
--- /dev/null
+++ b/tests/seccomp-filter-v.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (seccomp-filter-v -v -e trace=seccomp); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -v -e trace=seccomp
diff --git a/tests/seccomp-filter-v.test b/tests/seccomp-filter-v.test
deleted file mode 100755
index f873eb6..0000000
--- a/tests/seccomp-filter-v.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check verbose decoding of seccomp SECCOMP_SET_MODE_FILTER.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -v -e trace=seccomp
diff --git a/tests/seccomp-filter.c b/tests/seccomp-filter.c
index d4d76dd..e2bea06 100644
--- a/tests/seccomp-filter.c
+++ b/tests/seccomp-filter.c
@@ -2,6 +2,7 @@
  * Check decoding of seccomp SECCOMP_SET_MODE_FILTER.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -49,7 +50,7 @@
 {
 	struct sock_filter *const filter = tail_alloc(sizeof(*filter) * N);
 	const void *const efault = tail_alloc(1);
-	struct sock_fprog *const prog = tail_alloc(sizeof(*prog));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct sock_fprog, prog);
 	long rc;
 
 	prog->filter = filter;
diff --git a/tests/seccomp-filter.gen.test b/tests/seccomp-filter.gen.test
new file mode 100755
index 0000000..52af0d5
--- /dev/null
+++ b/tests/seccomp-filter.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (seccomp-filter -e trace=seccomp); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -e trace=seccomp
diff --git a/tests/seccomp-filter.test b/tests/seccomp-filter.test
deleted file mode 100755
index 65c6d49..0000000
--- a/tests/seccomp-filter.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of seccomp SECCOMP_SET_MODE_FILTER.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -e trace=seccomp
diff --git a/tests/seccomp-strict.test b/tests/seccomp-strict.test
index b354c6a..b039871 100755
--- a/tests/seccomp-strict.test
+++ b/tests/seccomp-strict.test
@@ -4,7 +4,7 @@
 
 . "${srcdir=.}/init.sh"
 
-set -- "./$NAME"
+set -- "../$NAME"
 "$@" > /dev/null || {
 	case $? in
 		77) skip_ "$* exited with code 77" ;;
@@ -14,4 +14,3 @@
 }
 run_strace -eseccomp "$@" > "$EXP"
 match_diff "$LOG" "$EXP"
-rm -f "$EXP"
diff --git a/tests/select.gen.test b/tests/select.gen.test
new file mode 100755
index 0000000..cb3b8f1
--- /dev/null
+++ b/tests/select.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (select -a36); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a36
diff --git a/tests/select.test b/tests/select.test
deleted file mode 100755
index 60b88ca..0000000
--- a/tests/select.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check select syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a36
diff --git a/tests/semop.c b/tests/semop.c
index a2ff263..3d1f384 100644
--- a/tests/semop.c
+++ b/tests/semop.c
@@ -33,9 +33,7 @@
 	static void * const bogus_sops = (void *) -1L;
 	static const size_t bogus_nsops = (size_t) 0xdefaceddeadbeefULL;
 
-	static const struct timespec ts_data = { 1, 123456789 };
-
-	struct timespec *ts = tail_memdup(&ts_data, sizeof(*ts));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct timespec, ts);
 	int rc;
 
 	id = semget(IPC_PRIVATE, 1, 0600);
@@ -47,8 +45,8 @@
 	if (semctl(id, 0, SETVAL, sem_union) == -1)
 		perror_msg_and_skip("semctl");
 
-	struct sembuf *const sem_b = tail_alloc(sizeof(*sem_b));
-	struct sembuf *const sem_b2 = tail_alloc(sizeof(*sem_b2));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct sembuf, sem_b);
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct sembuf, sem_b2);
 
 	rc = semop(bogus_semid, NULL, bogus_nsops);
 	printf("semop(%d, NULL, %u) = %s\n",
@@ -91,15 +89,17 @@
 	printf("semtimedop(%d, %p, 1, %p) = %s\n",
 		id, sem_b + 1, ts + 1, sprintrc(rc));
 
+	ts->tv_sec = 1;
+	ts->tv_nsec = 123456789;
 	rc = semtimedop(bogus_semid, sem_b2, 2, ts);
-	printf("semtimedop(%d, [{%hu, %hd, %s%s%#hx}, %p], %u, "
-		"{tv_sec=%jd, tv_nsec=%jd}) = %s\n",
+	printf("semtimedop(%d, [{%hu, %hd, %s%s%#hx}, %p], %u"
+		", {tv_sec=%lld, tv_nsec=%llu}) = %s\n",
 		bogus_semid, sem_b2->sem_num, sem_b2->sem_op,
 		sem_b2->sem_flg & SEM_UNDO ? "SEM_UNDO|" : "",
 		sem_b2->sem_flg & IPC_NOWAIT ? "IPC_NOWAIT|" : "",
 		sem_b2->sem_flg & ~(SEM_UNDO | IPC_NOWAIT),
 		sem_b2 + 1, 2,
-		(intmax_t) ts->tv_sec, (intmax_t) ts->tv_nsec,
+		(long long) ts->tv_sec, zero_extend_signed_to_ull(ts->tv_nsec),
 		sprintrc(rc));
 
 	sem_b->sem_op = 1;
@@ -110,9 +110,27 @@
 	sem_b->sem_op = -1;
 	if (semtimedop(id, sem_b, 1, ts))
 		perror_msg_and_skip("semtimedop, -1");
-	printf("semtimedop(%d, [{0, -1, SEM_UNDO}], 1, "
-		"{tv_sec=%jd, tv_nsec=%jd}) = 0\n", id,
-		(intmax_t) ts->tv_sec, (intmax_t) ts->tv_nsec);
+	printf("semtimedop(%d, [{0, -1, SEM_UNDO}], 1"
+	       ", {tv_sec=%lld, tv_nsec=%llu}) = 0\n", id,
+	       (long long) ts->tv_sec, zero_extend_signed_to_ull(ts->tv_nsec));
+
+	sem_b->sem_op = 1;
+	ts->tv_sec = 0xdeadbeefU;
+	ts->tv_nsec = 0xfacefeedU;
+	rc = semtimedop(id, sem_b, 1, ts);
+	printf("semtimedop(%d, [{0, 1, SEM_UNDO}], 1"
+	       ", {tv_sec=%lld, tv_nsec=%llu}) = %s\n",
+	       id, (long long) ts->tv_sec,
+	       zero_extend_signed_to_ull(ts->tv_nsec), sprintrc(rc));
+
+	sem_b->sem_op = -1;
+	ts->tv_sec = (time_t) 0xcafef00ddeadbeefLL;
+	ts->tv_nsec = (long) 0xbadc0dedfacefeedLL;
+	rc = semtimedop(id, sem_b, 1, ts);
+	printf("semtimedop(%d, [{0, -1, SEM_UNDO}], 1"
+	       ", {tv_sec=%lld, tv_nsec=%llu}) = %s\n",
+	       id, (long long) ts->tv_sec,
+	       zero_extend_signed_to_ull(ts->tv_nsec), sprintrc(rc));
 
 	puts("+++ exited with 0 +++");
 	return 0;
diff --git a/tests/semop.gen.test b/tests/semop.gen.test
new file mode 100755
index 0000000..21b67ea
--- /dev/null
+++ b/tests/semop.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (semop -a32 -e trace=semop,semtimedop); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a32 -e trace=semop,semtimedop
diff --git a/tests/semop.test b/tests/semop.test
deleted file mode 100755
index 3e77d2f..0000000
--- a/tests/semop.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check semop syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a32 -e trace=semop,semtimedop
diff --git a/tests/sendfile.c b/tests/sendfile.c
index 23f096b..9253c10 100644
--- a/tests/sendfile.c
+++ b/tests/sendfile.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -69,7 +70,7 @@
 	printf("sendfile(0, 1, NULL, %lu) = -1 EBADF (%m)\n",
 	       (unsigned long) page_len);
 
-	uint32_t *p_off = tail_alloc(sizeof(uint32_t));
+	TAIL_ALLOC_OBJECT_VAR_PTR(uint32_t, p_off);
 	void *p = p_off + 1;
 	*p_off = 0;
 
diff --git a/tests/sendfile.gen.test b/tests/sendfile.gen.test
new file mode 100755
index 0000000..433878f
--- /dev/null
+++ b/tests/sendfile.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (sendfile -a27); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a27
diff --git a/tests/sendfile.test b/tests/sendfile.test
deleted file mode 100755
index 48dba58..0000000
--- a/tests/sendfile.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check sendfile syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a27
diff --git a/tests/sendfile64.c b/tests/sendfile64.c
index 7208c30..de02400 100644
--- a/tests/sendfile64.c
+++ b/tests/sendfile64.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -69,7 +70,7 @@
 	printf("sendfile64(0, 1, NULL, %lu) = -1 EBADF (%m)\n",
 	       (unsigned long) page_len);
 
-	uint64_t *p_off = tail_alloc(sizeof(uint64_t));
+	TAIL_ALLOC_OBJECT_CONST_PTR(uint64_t, p_off);
 	void *p = p_off + 1;
 	*p_off = 0;
 
diff --git a/tests/sendfile64.gen.test b/tests/sendfile64.gen.test
new file mode 100755
index 0000000..1655dd3
--- /dev/null
+++ b/tests/sendfile64.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (sendfile64 -a29); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a29
diff --git a/tests/sendfile64.test b/tests/sendfile64.test
deleted file mode 100755
index faa0525..0000000
--- a/tests/sendfile64.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check sendfile64 syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a29
diff --git a/tests/set_mempolicy.gen.test b/tests/set_mempolicy.gen.test
new file mode 100755
index 0000000..f8c81c7
--- /dev/null
+++ b/tests/set_mempolicy.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (set_mempolicy -s3 -a35); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -s3 -a35
diff --git a/tests/set_mempolicy.test b/tests/set_mempolicy.test
deleted file mode 100755
index 0ed6666..0000000
--- a/tests/set_mempolicy.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check set_mempolicy syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -s3 -a35
diff --git a/tests/set_ptracer_any.c b/tests/set_ptracer_any.c
index bc2f90c..3b4ea2c 100644
--- a/tests/set_ptracer_any.c
+++ b/tests/set_ptracer_any.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2013-2015 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2013-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff --git a/tests/setdomainname.gen.test b/tests/setdomainname.gen.test
new file mode 100755
index 0000000..2b12e08
--- /dev/null
+++ b/tests/setdomainname.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (setdomainname -a24); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a24
diff --git a/tests/setdomainname.test b/tests/setdomainname.test
deleted file mode 100755
index 2159e7c..0000000
--- a/tests/setdomainname.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check setdomainname syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a24
diff --git a/tests/setfsgid.gen.test b/tests/setfsgid.gen.test
new file mode 100755
index 0000000..caff401
--- /dev/null
+++ b/tests/setfsgid.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (setfsgid -a12); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a12
diff --git a/tests/setfsgid.test b/tests/setfsgid.test
deleted file mode 100755
index 0ae2b0a..0000000
--- a/tests/setfsgid.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check setfsgid syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a12
diff --git a/tests/setfsgid32.gen.test b/tests/setfsgid32.gen.test
new file mode 100755
index 0000000..fae29e0
--- /dev/null
+++ b/tests/setfsgid32.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (setfsgid32 -a14); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a14
diff --git a/tests/setfsgid32.test b/tests/setfsgid32.test
deleted file mode 100755
index 9b7a2bf..0000000
--- a/tests/setfsgid32.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check setfsgid32 syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a14
diff --git a/tests/setfsugid.c b/tests/setfsugid.c
index 79ba34d..7484db5 100644
--- a/tests/setfsugid.c
+++ b/tests/setfsugid.c
@@ -2,6 +2,7 @@
  * Check decoding of setfsuid/setfsgid/setfsuid32/setfsgid32 syscalls.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -47,7 +48,7 @@
 	const kernel_ulong_t tests[] = {
 		ugid,
 		0xffff0000U | ugid,
-		(kernel_ulong_t) 0xffffffff00000000ULL | ugid,
+		F8ILL_KULONG_MASK | ugid,
 		0xffffU,
 		-1U,
 		-1L,
diff --git a/tests/setfsuid.gen.test b/tests/setfsuid.gen.test
new file mode 100755
index 0000000..e4c4d20
--- /dev/null
+++ b/tests/setfsuid.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (setfsuid -a12); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a12
diff --git a/tests/setfsuid.test b/tests/setfsuid.test
deleted file mode 100755
index 18a1021..0000000
--- a/tests/setfsuid.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check setfsuid syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a12
diff --git a/tests/setfsuid32.gen.test b/tests/setfsuid32.gen.test
new file mode 100755
index 0000000..b6cd67d
--- /dev/null
+++ b/tests/setfsuid32.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (setfsuid32 -a14); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a14
diff --git a/tests/setfsuid32.test b/tests/setfsuid32.test
deleted file mode 100755
index 2dce3cc..0000000
--- a/tests/setfsuid32.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check setfsuid32 syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a14
diff --git a/tests/setgid.gen.test b/tests/setgid.gen.test
new file mode 100755
index 0000000..f10add6
--- /dev/null
+++ b/tests/setgid.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (setgid -a10); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a10
diff --git a/tests/setgid.test b/tests/setgid.test
deleted file mode 100755
index a3a9004..0000000
--- a/tests/setgid.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check setgid syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a10
diff --git a/tests/setgid32.gen.test b/tests/setgid32.gen.test
new file mode 100755
index 0000000..26f194e
--- /dev/null
+++ b/tests/setgid32.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (setgid32 -a12); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a12
diff --git a/tests/setgid32.test b/tests/setgid32.test
deleted file mode 100755
index 11a87e1..0000000
--- a/tests/setgid32.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check setgid32 syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a12
diff --git a/tests/setgroups.c b/tests/setgroups.c
index 1ec8333..5645c22 100644
--- a/tests/setgroups.c
+++ b/tests/setgroups.c
@@ -2,6 +2,7 @@
  * Check decoding of setgroups/setgroups32 syscalls.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -75,7 +76,7 @@
 	long rc = syscall(SYSCALL_NR, 0, 0);
 	printf("%s(0, NULL) = %s\n", SYSCALL_NAME, sprintrc(rc));
 
-	rc = syscall(SYSCALL_NR, (long) 0xffffffff00000000ULL, 0);
+	rc = syscall(SYSCALL_NR, F8ILL_KULONG_MASK, 0);
 	printf("%s(0, NULL) = %s\n", SYSCALL_NAME, sprintrc(rc));
 
 	rc = syscall(SYSCALL_NR, 1, 0);
@@ -91,7 +92,7 @@
 	printf("%s(%d, NULL) = %s\n", SYSCALL_NAME, -1, sprintrc(rc));
 
 	/* check how the second argument is decoded */
-	const GID_TYPE *const g1 = tail_alloc(sizeof(*g1));
+	TAIL_ALLOC_OBJECT_CONST_PTR(const GID_TYPE, g1);
 	GID_TYPE *const g2 = tail_alloc(sizeof(*g2) * 2);
 	GID_TYPE *const g3 = tail_alloc(sizeof(*g3) * 3);
 
@@ -164,9 +165,7 @@
 		printuid(g3[1]);
 		printf(", ...]) = %s\n", errstr);
 
-		const unsigned long size =
-			(unsigned long) 0xffffffff00000000ULL | ngroups_max;
-		rc = syscall(SYSCALL_NR, size, g3);
+		rc = syscall(SYSCALL_NR, F8ILL_KULONG_MASK | ngroups_max, g3);
 		errstr = sprintrc(rc);
 		printf("%s(%d, [", SYSCALL_NAME, ngroups_max);
 		printuid(g3[0]);
diff --git a/tests/setgroups.gen.test b/tests/setgroups.gen.test
new file mode 100755
index 0000000..01ec2e7
--- /dev/null
+++ b/tests/setgroups.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (setgroups -s2 -a17); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -s2 -a17
diff --git a/tests/setgroups.test b/tests/setgroups.test
deleted file mode 100755
index 0dcc8f7..0000000
--- a/tests/setgroups.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check setgroups syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -s2 -a17
diff --git a/tests/setgroups32.gen.test b/tests/setgroups32.gen.test
new file mode 100755
index 0000000..e9e70ad
--- /dev/null
+++ b/tests/setgroups32.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (setgroups32 -s2 -a19); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -s2 -a19
diff --git a/tests/setgroups32.test b/tests/setgroups32.test
deleted file mode 100755
index ee4750d..0000000
--- a/tests/setgroups32.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check setgroups32 syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -s2 -a19
diff --git a/tests/sethostname.gen.test b/tests/sethostname.gen.test
new file mode 100755
index 0000000..2827b1d
--- /dev/null
+++ b/tests/sethostname.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (sethostname -a22); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a22
diff --git a/tests/sethostname.test b/tests/sethostname.test
deleted file mode 100755
index 78f8c58..0000000
--- a/tests/sethostname.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check sethostname syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a22
diff --git a/tests/setns.gen.test b/tests/setns.gen.test
new file mode 100755
index 0000000..45fcc60
--- /dev/null
+++ b/tests/setns.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (setns -a21); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a21
diff --git a/tests/setns.test b/tests/setns.test
deleted file mode 100755
index e9a905a..0000000
--- a/tests/setns.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of setns syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a21
diff --git a/tests/setregid.gen.test b/tests/setregid.gen.test
new file mode 100755
index 0000000..0125d7a
--- /dev/null
+++ b/tests/setregid.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (setregid -a15); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a15
diff --git a/tests/setregid.test b/tests/setregid.test
deleted file mode 100755
index 101c7bd..0000000
--- a/tests/setregid.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check setregid syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a15
diff --git a/tests/setregid32.gen.test b/tests/setregid32.gen.test
new file mode 100755
index 0000000..24f1505
--- /dev/null
+++ b/tests/setregid32.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (setregid32 -a17); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a17
diff --git a/tests/setregid32.test b/tests/setregid32.test
deleted file mode 100755
index e57e66c..0000000
--- a/tests/setregid32.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check setregid32 syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a17
diff --git a/tests/setresgid.gen.test b/tests/setresgid.gen.test
new file mode 100755
index 0000000..ca5bc6b
--- /dev/null
+++ b/tests/setresgid.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (setresgid -a19); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a19
diff --git a/tests/setresgid.test b/tests/setresgid.test
deleted file mode 100755
index 5a69574..0000000
--- a/tests/setresgid.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check setresgid syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a19
diff --git a/tests/setresgid32.gen.test b/tests/setresgid32.gen.test
new file mode 100755
index 0000000..a5edb90
--- /dev/null
+++ b/tests/setresgid32.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (setresgid32 -a21); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a21
diff --git a/tests/setresgid32.test b/tests/setresgid32.test
deleted file mode 100755
index 528b2c9..0000000
--- a/tests/setresgid32.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check setresgid32 syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a21
diff --git a/tests/setresuid.gen.test b/tests/setresuid.gen.test
new file mode 100755
index 0000000..a6e0664
--- /dev/null
+++ b/tests/setresuid.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (setresuid -a19); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a19
diff --git a/tests/setresuid.test b/tests/setresuid.test
deleted file mode 100755
index f1219e0..0000000
--- a/tests/setresuid.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check setresuid syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a19
diff --git a/tests/setresuid32.gen.test b/tests/setresuid32.gen.test
new file mode 100755
index 0000000..3fbf36b
--- /dev/null
+++ b/tests/setresuid32.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (setresuid32 -a21); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a21
diff --git a/tests/setresuid32.test b/tests/setresuid32.test
deleted file mode 100755
index 942a3a6..0000000
--- a/tests/setresuid32.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check setresuid32 syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a21
diff --git a/tests/setreuid.gen.test b/tests/setreuid.gen.test
new file mode 100755
index 0000000..4c3dc93
--- /dev/null
+++ b/tests/setreuid.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (setreuid -a15); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a15
diff --git a/tests/setreuid.test b/tests/setreuid.test
deleted file mode 100755
index b6db3c1..0000000
--- a/tests/setreuid.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check setreuid syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a15
diff --git a/tests/setreuid32.gen.test b/tests/setreuid32.gen.test
new file mode 100755
index 0000000..d179053
--- /dev/null
+++ b/tests/setreuid32.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (setreuid32 -a17); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a17
diff --git a/tests/setreuid32.test b/tests/setreuid32.test
deleted file mode 100755
index 23323d4..0000000
--- a/tests/setreuid32.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check setreuid32 syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a17
diff --git a/tests/setrlimit.gen.test b/tests/setrlimit.gen.test
new file mode 100755
index 0000000..dfe2da3
--- /dev/null
+++ b/tests/setrlimit.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (setrlimit -a27); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a27
diff --git a/tests/setrlimit.test b/tests/setrlimit.test
deleted file mode 100755
index 7920608..0000000
--- a/tests/setrlimit.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of getrlimit/ugetrlimit/setrlimit syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a27
diff --git a/tests/setuid.gen.test b/tests/setuid.gen.test
new file mode 100755
index 0000000..98d470f
--- /dev/null
+++ b/tests/setuid.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (setuid -a10); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a10
diff --git a/tests/setuid.test b/tests/setuid.test
deleted file mode 100755
index 9279233..0000000
--- a/tests/setuid.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check setuid syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a10
diff --git a/tests/setuid32.gen.test b/tests/setuid32.gen.test
new file mode 100755
index 0000000..7d15495
--- /dev/null
+++ b/tests/setuid32.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (setuid32 -a12); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a12
diff --git a/tests/setuid32.test b/tests/setuid32.test
deleted file mode 100755
index 7998392..0000000
--- a/tests/setuid32.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check setuid32 syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a12
diff --git a/tests/shmxt.gen.test b/tests/shmxt.gen.test
new file mode 100755
index 0000000..dd9d35f
--- /dev/null
+++ b/tests/shmxt.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (shmxt -a11 -e trace='/(osf_)?shmat,shmdt'); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a11 -e trace='/(osf_)?shmat,shmdt'
diff --git a/tests/shmxt.test b/tests/shmxt.test
deleted file mode 100755
index 3757cfa..0000000
--- a/tests/shmxt.test
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-
-# Check shmat and shmdt syscalls decoding.
-
-. "${srcdir=.}/init.sh"
-
-case "$STRACE_ARCH" in
-	alpha) shmat=osf_shmat ;;
-	*) shmat=shmat ;;
-esac
-
-run_strace_match_diff -e trace=$shmat,shmdt -a11
diff --git a/tests/shutdown.gen.test b/tests/shutdown.gen.test
new file mode 100755
index 0000000..3412513
--- /dev/null
+++ b/tests/shutdown.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (shutdown -a24); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a24
diff --git a/tests/shutdown.test b/tests/shutdown.test
deleted file mode 100755
index 22f0d5a..0000000
--- a/tests/shutdown.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of shutdown syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a24
diff --git a/tests/siginfo.gen.test b/tests/siginfo.gen.test
new file mode 100755
index 0000000..33792b9
--- /dev/null
+++ b/tests/siginfo.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (siginfo -e trace=none); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -e trace=none
diff --git a/tests/siginfo.test b/tests/siginfo.test
deleted file mode 100755
index 725f714..0000000
--- a/tests/siginfo.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check SIGCHLD siginfo_t decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -e trace=none
diff --git a/tests/signal_receive.gen.test b/tests/signal_receive.gen.test
new file mode 100755
index 0000000..79e8fb8
--- /dev/null
+++ b/tests/signal_receive.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (signal_receive -a16 -e trace=kill); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a16 -e trace=kill
diff --git a/tests/signal_receive.test b/tests/signal_receive.test
deleted file mode 100755
index 9685b66..0000000
--- a/tests/signal_receive.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check whether strace traces signals properly.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a16 -e trace=kill
diff --git a/tests/signalfd4.c b/tests/signalfd4.c
index 47e49b5..4391b92 100644
--- a/tests/signalfd4.c
+++ b/tests/signalfd4.c
@@ -2,6 +2,7 @@
  * Check decoding of signalfd4 syscall.
  *
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -31,8 +32,7 @@
 #include <fcntl.h>
 #include <asm/unistd.h>
 
-#if defined __NR_rt_sigprocmask \
- && defined HAVE_SYS_SIGNALFD_H \
+#if defined HAVE_SYS_SIGNALFD_H \
  && defined HAVE_SIGNALFD \
  && defined O_CLOEXEC
 
@@ -41,24 +41,6 @@
 # include <unistd.h>
 # include <sys/signalfd.h>
 
-static unsigned int
-get_sigset_size(void)
-{
-	const unsigned int big_size = 1024 / 8;
-	unsigned int set_size;
-
-	for (set_size = big_size; set_size; set_size >>= 1) {
-		if (!syscall(__NR_rt_sigprocmask, SIG_SETMASK,
-			     NULL, NULL, set_size))
-			break;
-	}
-
-	if (!set_size)
-		perror_msg_and_fail("rt_sigprocmask");
-
-	return set_size;
-}
-
 int
 main(void)
 {
@@ -80,7 +62,6 @@
 
 #else
 
-SKIP_MAIN_UNDEFINED("__NR_rt_sigprocmask && HAVE_SYS_SIGNALFD_H"
-		    " && HAVE_SIGNALFD && O_CLOEXEC")
+SKIP_MAIN_UNDEFINED("HAVE_SYS_SIGNALFD_H && HAVE_SIGNALFD && O_CLOEXEC")
 
 #endif
diff --git a/tests/signalfd4.gen.test b/tests/signalfd4.gen.test
new file mode 100755
index 0000000..e91a9fe
--- /dev/null
+++ b/tests/signalfd4.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (signalfd4 ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/signalfd4.test b/tests/signalfd4.test
deleted file mode 100755
index a615a5b..0000000
--- a/tests/signalfd4.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of signalfd4 syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff
diff --git a/tests/sigreturn.c b/tests/sigreturn.c
index dace040..ff9a59f 100644
--- a/tests/sigreturn.c
+++ b/tests/sigreturn.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 Dmitry V. Levin <[email protected]>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -26,23 +26,38 @@
  */
 
 #include "tests.h"
-#include <stdlib.h>
-#include <signal.h>
+#include <asm/unistd.h>
 
-#ifdef ASM_SIGRTMIN
-# define RT_0 ASM_SIGRTMIN
-#else
-/* Linux kernel >= 3.18 defines SIGRTMIN to 32 on all architectures. */
-# define RT_0 32
+#if defined __powerpc64__ \
+ || (defined __sparc__ && defined __arch64__)
+/* Old sigreturn is defined but not implemented in the kernel. */
+# undef __NR_sigreturn
 #endif
 
-static void handler(int sig)
+#ifdef __NR_sigreturn
+
+# include <signal.h>
+# include <stdio.h>
+# include <stdlib.h>
+
+# ifdef ASM_SIGRTMIN
+#  define RT_0 ASM_SIGRTMIN
+# else
+/* Linux kernel >= 3.18 defines SIGRTMIN to 32 on all architectures. */
+#  define RT_0 32
+# endif
+
+static void
+handler(int sig)
 {
 }
 
-int main(void) {
-	sigset_t set;
+int
+main(void)
+{
+	static sigset_t set;
 	sigemptyset(&set);
+	sigaddset(&set, SIGINT);
 	sigaddset(&set, SIGUSR2);
 	sigaddset(&set, SIGCHLD);
 	sigaddset(&set, RT_0 +  3);
@@ -50,8 +65,28 @@
 	sigaddset(&set, RT_0 +  5);
 	sigaddset(&set, RT_0 + 26);
 	sigaddset(&set, RT_0 + 27);
-	sigprocmask(SIG_SETMASK, &set, NULL);
-	signal(SIGUSR1, handler);
-	raise(SIGUSR1);
+	if (sigprocmask(SIG_SETMASK, &set, NULL))
+		perror_msg_and_fail("sigprocmask");
+	sigemptyset(&set);
+
+	/* This should result to old sigreturn. */
+	if (signal(SIGUSR1, handler) == SIG_ERR)
+		perror_msg_and_fail("sigaction");
+
+	if (raise(SIGUSR1))
+		perror_msg_and_fail("raise");
+
+	static const char *const sigs =
+		(SIGUSR2 < SIGCHLD) ? "INT USR2 CHLD" : "INT CHLD USR2";
+	static const char *const rt_sigs = "RT_3 RT_4 RT_5 RT_26 RT_27";
+	printf("sigreturn({mask=[%s %s]}) = 0\n", sigs, rt_sigs);
+
+	puts("+++ exited with 0 +++");
 	return 0;
 }
+
+#else
+
+SKIP_MAIN_UNDEFINED("__NR_sigreturn")
+
+#endif
diff --git a/tests/sigreturn.gen.test b/tests/sigreturn.gen.test
new file mode 100755
index 0000000..f317e89
--- /dev/null
+++ b/tests/sigreturn.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (sigreturn -esignal='!USR1'); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -esignal='!USR1'
diff --git a/tests/sigsuspend.c b/tests/sigsuspend.c
new file mode 100644
index 0000000..dac6890
--- /dev/null
+++ b/tests/sigsuspend.c
@@ -0,0 +1,117 @@
+/*
+ * Check decoding of sigsuspend syscall.
+ *
+ * Copyright (c) 2017 Dmitry V. Levin <[email protected]>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "tests.h"
+#include <asm/unistd.h>
+
+#ifdef __NR_sigsuspend
+
+# include <assert.h>
+# include <errno.h>
+# include <signal.h>
+# include <stdio.h>
+# include <stdint.h>
+# include <string.h>
+# include <unistd.h>
+
+# ifdef MIPS
+#  define SIGNAL_MASK_BY_REF 1
+# else
+#  define SIGNAL_MASK_BY_REF 0
+# endif
+
+static long
+k_sigsuspend(const kernel_ulong_t arg1,
+	     const kernel_ulong_t arg2,
+	     const kernel_ulong_t arg3)
+{
+	return syscall(__NR_sigsuspend, arg1, arg2, arg3);
+}
+
+static int signo;
+static const char *sigtxt[] = {
+	[SIGUSR1] = "USR1",
+	[SIGUSR2] = "USR2"
+};
+
+static void
+handler(int i)
+{
+	signo = i;
+}
+
+int
+main(void)
+{
+	union {
+		sigset_t libc_mask;
+		unsigned long old_mask;
+	} u;
+
+	sigemptyset(&u.libc_mask);
+	sigaddset(&u.libc_mask, SIGUSR1);
+	sigaddset(&u.libc_mask, SIGUSR2);
+	if (sigprocmask(SIG_SETMASK, &u.libc_mask, NULL))
+		perror_msg_and_fail("sigprocmask");
+
+	const struct sigaction sa = { .sa_handler = handler };
+	if (sigaction(SIGUSR1, &sa, NULL) || sigaction(SIGUSR2, &sa, NULL))
+		perror_msg_and_fail("sigaction");
+
+	raise(SIGUSR1);
+	raise(SIGUSR2);
+
+	u.old_mask = -1UL;
+	sigdelset(&u.libc_mask, SIGUSR1);
+	const unsigned long mask1 = u.old_mask;
+
+	u.old_mask = -1UL;
+	sigdelset(&u.libc_mask, SIGUSR2);
+	const unsigned long mask2 = u.old_mask;
+
+#if SIGNAL_MASK_BY_REF
+	k_sigsuspend((uintptr_t) &mask1, 0xdeadbeef, (uintptr_t) &mask2);
+#else
+	k_sigsuspend(mask1, 0xdeadbeef, mask2);
+#endif
+	if (EINTR != errno)
+		perror_msg_and_skip("sigsuspend");
+
+	printf("sigsuspend(~[%s]) = ? ERESTARTNOHAND"
+	       " (To be restarted if no handler)\n", sigtxt[signo]);
+
+	puts("+++ exited with 0 +++");
+	return 0;
+}
+
+#else
+
+SKIP_MAIN_UNDEFINED("__NR_sigsuspend")
+
+#endif
diff --git a/tests/sigsuspend.gen.test b/tests/sigsuspend.gen.test
new file mode 100755
index 0000000..afd0207
--- /dev/null
+++ b/tests/sigsuspend.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (sigsuspend -a19 -esignal=none); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a19 -esignal=none
diff --git a/tests/skip_unavailable.c b/tests/skip_unavailable.c
new file mode 100644
index 0000000..074fc3a
--- /dev/null
+++ b/tests/skip_unavailable.c
@@ -0,0 +1,13 @@
+#include "tests.h"
+
+#include <sys/stat.h>
+#include <unistd.h>
+
+void
+skip_if_unavailable(const char *const path)
+{
+	struct stat st;
+
+	if (stat(path, &st))
+		perror_msg_and_skip("stat: %s", path);
+}
diff --git a/tests/socketcall.gen.test b/tests/socketcall.gen.test
new file mode 100755
index 0000000..95c45fd
--- /dev/null
+++ b/tests/socketcall.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (socketcall -a20); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a20
diff --git a/tests/socketcall.test b/tests/socketcall.test
deleted file mode 100755
index 959bc83..0000000
--- a/tests/socketcall.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of socketcall syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a20
diff --git a/tests/sockname.c b/tests/sockname.c
index c5072ca..9bab8ed 100644
--- a/tests/sockname.c
+++ b/tests/sockname.c
@@ -2,6 +2,7 @@
  * Check decoding of sockname family syscalls.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -74,7 +75,7 @@
 static void
 test_sockname_syscall(const int fd)
 {
-	socklen_t *const plen = tail_alloc(sizeof(*plen));
+	TAIL_ALLOC_OBJECT_CONST_PTR(socklen_t, plen);
 	*plen = sizeof(struct sockaddr_un);
 	struct sockaddr_un *addr = tail_alloc(*plen);
 
diff --git a/tests/splice.c b/tests/splice.c
index b6f2525..cf07c80 100644
--- a/tests/splice.c
+++ b/tests/splice.c
@@ -2,6 +2,7 @@
  * This file is part of splice strace test.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -40,8 +41,8 @@
 {
 	const long int fd_in = (long int) 0xdeadbeefffffffffULL;
 	const long int fd_out = (long int) 0xdeadbeeffffffffeULL;
-	long long int *const off_in = tail_alloc(sizeof(*off_in));
-	long long int *const off_out = tail_alloc(sizeof(*off_out));
+	TAIL_ALLOC_OBJECT_CONST_PTR(long long int, off_in);
+	TAIL_ALLOC_OBJECT_CONST_PTR(long long int, off_out);
 	*off_in = 0xdeadbef1facefed1ULL;
 	*off_out = 0xdeadbef2facefed2ULL;
 	const size_t len = (size_t) 0xdeadbef3facefed3ULL;
diff --git a/tests/splice.gen.test b/tests/splice.gen.test
new file mode 100755
index 0000000..83c8406
--- /dev/null
+++ b/tests/splice.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (splice ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/splice.test b/tests/splice.test
deleted file mode 100755
index cc5c327..0000000
--- a/tests/splice.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check splice syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff
diff --git a/tests/stat.c b/tests/stat.c
index d4ca7b0..79e9175 100644
--- a/tests/stat.c
+++ b/tests/stat.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff --git a/tests/stat.gen.test b/tests/stat.gen.test
new file mode 100755
index 0000000..13ccd0b
--- /dev/null
+++ b/tests/stat.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (stat -a32 -v -P stat.sample -P /dev/full); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a32 -v -P stat.sample -P /dev/full
diff --git a/tests/stat.test b/tests/stat.test
deleted file mode 100755
index ba8938c..0000000
--- a/tests/stat.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check stat syscall decoding.
-
-. "${srcdir=.}/statx.sh"
diff --git a/tests/stat64.c b/tests/stat64.c
index 782de33..74927de 100644
--- a/tests/stat64.c
+++ b/tests/stat64.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff --git a/tests/stat64.gen.test b/tests/stat64.gen.test
new file mode 100755
index 0000000..f49df37
--- /dev/null
+++ b/tests/stat64.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (stat64 -a32 -v -P stat.sample -P /dev/full); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a32 -v -P stat.sample -P /dev/full
diff --git a/tests/stat64.test b/tests/stat64.test
deleted file mode 100755
index abcfb9e..0000000
--- a/tests/stat64.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check stat64 syscall decoding.
-
-. "${srcdir=.}/statx.sh"
diff --git a/tests/statfs.expected b/tests/statfs.expected
deleted file mode 100644
index 11e9f0b..0000000
--- a/tests/statfs.expected
+++ /dev/null
@@ -1 +0,0 @@
-statfs(64)?\("/proc/self/status"(, [1-9][0-9]*)?, \{f_type=PROC_SUPER_MAGIC, f_bsize=[1-9][0-9]*, f_blocks=[0-9]+, f_bfree=[0-9]+, f_bavail=[0-9]+, f_files=[0-9]+, f_ffree=[0-9]+, f_fsid=\{val=\[[0-9]+, [0-9]+\]\}, f_namelen=[1-9][0-9]*(, f_frsize=[0-9]+)?(, f_flags=ST_VALID(\|ST_[A-Z]+)*)?\}\) += 0
diff --git a/tests/statfs.gen.test b/tests/statfs.gen.test
new file mode 100755
index 0000000..19b26dd
--- /dev/null
+++ b/tests/statfs.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (statfs -a17); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a17
diff --git a/tests/statfs.test b/tests/statfs.test
deleted file mode 100755
index 6075576..0000000
--- a/tests/statfs.test
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-
-# Check statfs syscall decoding.
-
-. "${srcdir=.}/init.sh"
-
-# this test probes /proc/self/status
-[ -f /proc/self/status ] ||
-	framework_skip_ '/proc/self/status is not available'
-
-run_strace_match_diff -a17
diff --git a/tests/statfs64.gen.test b/tests/statfs64.gen.test
new file mode 100755
index 0000000..66409f9
--- /dev/null
+++ b/tests/statfs64.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (statfs64 -a23); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a23
diff --git a/tests/statfs64.test b/tests/statfs64.test
deleted file mode 100755
index 9c0aa27..0000000
--- a/tests/statfs64.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check statfs64 syscall decoding.
-
-. "${srcdir=.}/statfs.test"
diff --git a/tests/statx.c b/tests/statx.c
new file mode 100644
index 0000000..f36fb0e
--- /dev/null
+++ b/tests/statx.c
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2017 The strace developers.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "tests.h"
+#include <asm/unistd.h>
+
+#ifdef __NR_statx
+
+# include <linux/stat.h>
+# include "xlat.h"
+# include "xlat/statx_masks.h"
+# include "xlat/statx_attrs.h"
+# include "xlat/at_statx_sync_types.h"
+
+# define IS_STATX 1
+# define TEST_SYSCALL_STR "statx"
+# define STRUCT_STAT struct statx
+# define STRUCT_STAT_STR "struct statx"
+# define STRUCT_STAT_IS_STAT64 0
+
+static unsigned    TEST_SYSCALL_STATX_FLAGS     = AT_STATX_SYNC_AS_STAT;
+static const char *TEST_SYSCALL_STATX_FLAGS_STR = "AT_STATX_SYNC_AS_STAT";
+static unsigned    TEST_SYSCALL_STATX_MASK      = STATX_ALL;
+static const char *TEST_SYSCALL_STATX_MASK_STR  = "STATX_ALL";
+
+# define TEST_SYSCALL_INVOKE(sample, pst) \
+	syscall(__NR_statx, AT_FDCWD, sample, TEST_SYSCALL_STATX_FLAGS, \
+	        TEST_SYSCALL_STATX_MASK, pst)
+# define PRINT_SYSCALL_HEADER(sample) \
+	do { \
+		int saved_errno = errno; \
+		printf("%s(AT_FDCWD, \"%s\", %s, %s, ", \
+		       TEST_SYSCALL_STR, sample, TEST_SYSCALL_STATX_FLAGS_STR, \
+		       TEST_SYSCALL_STATX_MASK_STR)
+# define PRINT_SYSCALL_FOOTER(rc) \
+		errno = saved_errno; \
+		printf(") = %s\n", sprintrc(rc)); \
+	} while (0)
+
+# include "xstatx.c"
+
+#else
+
+SKIP_MAIN_UNDEFINED("__NR_statx")
+
+#endif
diff --git a/tests/statx.gen.test b/tests/statx.gen.test
new file mode 100755
index 0000000..bff3e3f
--- /dev/null
+++ b/tests/statx.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (statx -a32 -v -P stat.sample -P /dev/full); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a32 -v -P stat.sample -P /dev/full
diff --git a/tests/statx.sh b/tests/statx.sh
deleted file mode 100755
index a630193..0000000
--- a/tests/statx.sh
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of stat family syscalls.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -v -P $NAME.sample -P /dev/full -a32
diff --git a/tests/strace-C.test b/tests/strace-C.test
index ccca9a0..359ddbd 100755
--- a/tests/strace-C.test
+++ b/tests/strace-C.test
@@ -4,6 +4,6 @@
 
 . "${srcdir=.}/init.sh"
 
-run_prog ./sleep 0
-run_strace -a24 -C -enanosleep ./sleep 1
+run_prog ../sleep 0
+run_strace -a24 -C -enanosleep ../sleep 1
 match_grep
diff --git a/tests/strace-E.expected b/tests/strace-E.expected
index d7823b7..3ae2c28 100644
--- a/tests/strace-E.expected
+++ b/tests/strace-E.expected
@@ -1 +1 @@
-execve\("\./sleep", \["\./sleep", "0"\], \[.*"option_E_var=OPTION_E_VAL".*\]\) = 0
+execve\("\.\./sleep", \["\.\./sleep", "0"\], \[.*"option_E_var=OPTION_E_VAL".*\]\) = 0
diff --git a/tests/strace-E.test b/tests/strace-E.test
index d76ec3f..843f27a 100755
--- a/tests/strace-E.test
+++ b/tests/strace-E.test
@@ -4,6 +4,6 @@
 
 . "${srcdir=.}/init.sh"
 
-run_prog ./sleep 0 > /dev/null
+run_prog ../sleep 0 > /dev/null
 run_strace -E option_E_var=OPTION_E_VAL -v $args
 match_grep
diff --git a/tests/strace-S.test b/tests/strace-S.test
index 3ea315c..64e4a41 100755
--- a/tests/strace-S.test
+++ b/tests/strace-S.test
@@ -4,7 +4,7 @@
 
 . "${srcdir=.}/init.sh"
 
-run_prog ./readv > /dev/null
+run_prog ../readv > /dev/null
 
 test_c()
 {
@@ -13,7 +13,7 @@
 	sortopts="$1"; shift
 	sedexpr="$1"; shift
 
-	run_strace -c -w -S "$sortby" ./readv > /dev/null
+	run_strace -c -w -S "$sortby" ../readv > /dev/null
 	sed -r -n -e "$sedexpr" < "$LOG" > "$OUT"
 
 	[ -s "$OUT" ] ||
@@ -28,5 +28,3 @@
 c='[[:space:]]+([^[:space:]]+)'
 test_c calls '-n -r' '/^[[:space:]]+[0-9]/ s/^'"$c$c$c$c"'[[:space:]].*/\4/p'
 test_c name '' '/^[[:space:]]+[0-9]/ s/^'"$c$c$c$c"'([[:space:]]+[0-9]+)?'"$c"'$/\6/p'
-
-rm -f "$OUT"
diff --git a/tests/strace-T.test b/tests/strace-T.test
index 7ab84a7..a6dac4e 100755
--- a/tests/strace-T.test
+++ b/tests/strace-T.test
@@ -4,6 +4,6 @@
 
 . "${srcdir=.}/init.sh"
 
-run_prog ./sleep 0
-run_strace -a24 -T -enanosleep ./sleep 1
+run_prog ../sleep 0
+run_strace -a24 -T -enanosleep ../sleep 1
 match_grep
diff --git a/tests/strace-V.test b/tests/strace-V.test
index 9a051e0..d5c3ac0 100755
--- a/tests/strace-V.test
+++ b/tests/strace-V.test
@@ -10,15 +10,22 @@
 
 getval()
 {
-	sed -r -n 's/#define[[:space:]]*'"$1"'[[:space:]]*"([^"]*)".*/\1/p' ../config.h
+	sed -r -n 's/#define[[:space:]]*'"$1"'[[:space:]]*"([^"]*)".*/\1/p' \
+		../../config.h
+}
+
+config_year=$(getval COPYRIGHT_YEAR)
+
+[ "$year" -ge "$config_year" ] && [ "$config_year" -ge 2017 ] || {
+	echo >&2 "The year derived from config.h (${config_year}) does not pass sanity checks."
+	exit 1
 }
 
 cat > "$EXP" << __EOF__
 $(getval PACKAGE_NAME) -- version $(getval PACKAGE_VERSION)
-Copyright (C) 1991-$year The strace developers <$(getval PACKAGE_URL)>.
+Copyright (C) 1991-${config_year} The strace developers <$(getval PACKAGE_URL)>.
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 __EOF__
 
-match_diff "$EXP" "$LOG"
-rm -f "$EXP"
+match_diff "$LOG" "$EXP"
diff --git a/tests/strace-ff.test b/tests/strace-ff.test
index 2ce06f1..7107527 100755
--- a/tests/strace-ff.test
+++ b/tests/strace-ff.test
@@ -7,7 +7,7 @@
 run_prog_skip_if_failed \
 	kill -0 $$
 
-./set_ptracer_any ./sleep 1 > "$OUT" &
+../set_ptracer_any ../sleep 1 > "$OUT" &
 tracee_pid=$!
 
 while ! [ -s "$OUT" ]; do
@@ -15,7 +15,6 @@
 		fail_ 'set_ptracer_any sleep failed'
 done
 
-rm -f "$LOG".*
 run_strace -a14 -eexit_group -ff -p $tracee_pid
 
 # check that output matches
@@ -25,5 +24,3 @@
 set -- "$LOG".*
 [ "$LOG.$tracee_pid" = "$*" ] ||
 	fail_ "too many output files: $*"
-
-rm -f "$OUT" "$LOG.$tracee_pid"
diff --git a/tests/strace-k.test b/tests/strace-k.test
index d5e8ed2..e68951e 100755
--- a/tests/strace-k.test
+++ b/tests/strace-k.test
@@ -4,6 +4,7 @@
 #
 # Copyright (c) 2014 Masatake YAMATO <[email protected]>
 # Copyright (c) 2014-2016 Dmitry V. Levin <[email protected]>
+# Copyright (c) 2014-2017 The strace developers.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -37,7 +38,7 @@
 check_prog sed
 check_prog tr
 
-run_prog ./stack-fcall
+run_prog ../stack-fcall
 run_strace -e getpid -k $args
 
 expected='getpid f3 f2 f1 f0 main '
diff --git a/tests/strace-r.expected b/tests/strace-r.expected
index 8009c35..2a5b977 100644
--- a/tests/strace-r.expected
+++ b/tests/strace-r.expected
@@ -1,2 +1,2 @@
-[ ]{5}0\.0{6} execve\("\./sleep", \["\./sleep", "1"\], \[/\* [[:digit:]]+ vars \*/\]\) = 0
+[ ]{5}0\.0{6} execve\("\.\./sleep", \["\.\./sleep", "1"\], 0x[[:xdigit:]]* /\* [[:digit:]]* vars \*/\) = 0
 [ ]{5}(1\.[01]|0\.9)[[:digit:]]{5} \+\+\+ exited with 0 \+\+\+
diff --git a/tests/strace-r.test b/tests/strace-r.test
index 4ba01f1..00649b5 100755
--- a/tests/strace-r.test
+++ b/tests/strace-r.test
@@ -4,6 +4,6 @@
 
 . "${srcdir=.}/init.sh"
 
-run_prog ./sleep 0
-run_strace -r -eexecve ./sleep 1
+run_prog ../sleep 0
+run_strace -r -eexecve ../sleep 1
 match_grep
diff --git a/tests/strace-t.test b/tests/strace-t.test
index 1d213e6..38070f3 100755
--- a/tests/strace-t.test
+++ b/tests/strace-t.test
@@ -5,16 +5,14 @@
 . "${srcdir=.}/init.sh"
 
 run_prog_skip_if_failed date +%T > /dev/null
-run_prog ./sleep 0
+run_prog ../sleep 0
 
 t0="$(date +%T)"
 run_strace -t -eexecve $args
 t1="$(date +%T)"
 
-EXPECTED="$LOG.expected"
-cat > "$EXPECTED" << __EOF__
-($t0|$t1) execve\\("\\./sleep", \\["\\./sleep", "0"\\], \\[/\\* [[:digit:]]+ vars \\*/\\]\\) = 0
+cat > "$EXP" << __EOF__
+($t0|$t1) execve\\("\\.\\./sleep", \\["\\.\\./sleep", "0"\\], 0x[[:xdigit:]]* /\\* [[:digit:]]* vars \\*/\\) = 0
 __EOF__
 
-match_grep "$LOG" "$EXPECTED"
-rm -f "$EXPECTED"
+match_grep "$LOG" "$EXP"
diff --git a/tests/strace-tt.test b/tests/strace-tt.test
index 3f80001..3285655 100755
--- a/tests/strace-tt.test
+++ b/tests/strace-tt.test
@@ -6,7 +6,7 @@
 
 run_prog_skip_if_failed date +%s > "$LOG"
 run_prog_skip_if_failed date +%T --date "@$(cat "$LOG")" > /dev/null
-run_prog ./sleep 0
+run_prog ../sleep 0
 
 s0="$(date +%s)"
 run_strace -tt -eexecve $args
@@ -21,8 +21,7 @@
 done
 
 cat > "$EXP" << __EOF__
-($t_reg)\\.[[:digit:]]{6} execve\\("\\./sleep", \\["\\./sleep", "0"\\], \\[/\\* [[:digit:]]+ vars \\*/\\]\\) = 0
+($t_reg)\\.[[:digit:]]{6} execve\\("\\.\\./sleep", \\["\\.\\./sleep", "0"\\], 0x[[:xdigit:]]* /\\* [[:digit:]]* vars \\*/\\) = 0
 __EOF__
 
 match_grep "$LOG" "$EXP"
-rm -f "$EXP"
diff --git a/tests/strace-ttt.test b/tests/strace-ttt.test
index 4439715..7d4435b 100755
--- a/tests/strace-ttt.test
+++ b/tests/strace-ttt.test
@@ -5,7 +5,7 @@
 . "${srcdir=.}/init.sh"
 
 run_prog_skip_if_failed date +%s > /dev/null
-run_prog ./sleep 0
+run_prog ../sleep 0
 
 s0="$(date +%s)"
 run_strace -ttt -eexecve $args
@@ -19,8 +19,7 @@
 done
 
 cat > "$EXP" << __EOF__
-($t_reg)\\.[[:digit:]]{6} execve\\("\\./sleep", \\["\\./sleep", "0"\\], \\[/\\* [[:digit:]]+ vars \\*/\\]\\) = 0
+($t_reg)\\.[[:digit:]]{6} execve\\("\\.\\./sleep", \\["\\.\\./sleep", "0"\\], 0x[[:xdigit:]]* /\\* [[:digit:]]+ vars \\*/\\) = 0
 __EOF__
 
 match_grep "$LOG" "$EXP"
-rm -f "$EXP"
diff --git a/tests/struct_flock.c b/tests/struct_flock.c
index 34cf58e..428c038 100644
--- a/tests/struct_flock.c
+++ b/tests/struct_flock.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -32,7 +33,6 @@
 #include "flock.h"
 
 #define FILE_LEN 4096
-#define EINVAL_STR "-1 EINVAL (Invalid argument)"
 
 #define TEST_FLOCK_EINVAL(cmd) test_flock_einval(cmd, #cmd)
 
@@ -45,9 +45,10 @@
 static long
 invoke_test_syscall(const unsigned int cmd, void *const p)
 {
-	const unsigned long op = (unsigned long) 0xffffffff00000000ULL | cmd;
+	const kernel_ulong_t fd = F8ILL_KULONG_MASK;
+	const kernel_ulong_t op = F8ILL_KULONG_MASK | cmd;
 
-	return syscall(TEST_SYSCALL_NR, 0, op, (unsigned long) p);
+	return syscall(TEST_SYSCALL_NR, fd, op, (unsigned long) p);
 }
 
 static void
@@ -58,10 +59,10 @@
 		.l_start = (TYPEOF_FLOCK_OFF_T) 0xdefaced1facefeedULL,
 		.l_len = (TYPEOF_FLOCK_OFF_T) 0xdefaced2cafef00dULL
 	};
-	invoke_test_syscall(cmd, &fl);
+	long rc = invoke_test_syscall(cmd, &fl);
 	printf("%s(0, %s, {l_type=F_RDLCK, l_whence=SEEK_SET"
 	       ", l_start=%jd, l_len=%jd}) = %s\n", TEST_SYSCALL_STR, name,
-	       (intmax_t) fl.l_start, (intmax_t) fl.l_len, EINVAL_STR);
+	       (intmax_t) fl.l_start, (intmax_t) fl.l_len, sprintrc(rc));
 }
 
 static void
@@ -77,7 +78,7 @@
 	long rc = invoke_test_syscall(F_SETLK, &fl);
 	printf("%s(0, F_SETLK, {l_type=F_RDLCK, l_whence=SEEK_SET"
 	       ", l_start=0, l_len=%d}) = %s\n",
-	       TEST_SYSCALL_STR, FILE_LEN, rc ? EINVAL_STR : "0");
+	       TEST_SYSCALL_STR, FILE_LEN, sprintrc(rc));
 	if (rc)
 		return;
 
diff --git a/tests/sun_path.test b/tests/sun_path.test
index 728328a..f0b7a02 100755
--- a/tests/sun_path.test
+++ b/tests/sun_path.test
@@ -4,7 +4,7 @@
 
 . "${srcdir=.}/init.sh"
 
-run_prog ./net-accept-connect 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678
+run_prog ../net-accept-connect 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678
 run_strace_merge -ebind,connect,getsockname $args
 match_grep
 
diff --git a/tests/swap.gen.test b/tests/swap.gen.test
new file mode 100755
index 0000000..4ca7891
--- /dev/null
+++ b/tests/swap.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (swap -a23 -e trace=swapon,swapoff); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a23 -e trace=swapon,swapoff
diff --git a/tests/swap.test b/tests/swap.test
deleted file mode 100755
index a30e1fd..0000000
--- a/tests/swap.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check swapon and swapoff syscalls decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a23 -e trace=swapon,swapoff
diff --git a/tests/sxetmask.c b/tests/sxetmask.c
new file mode 100644
index 0000000..0ede9ad
--- /dev/null
+++ b/tests/sxetmask.c
@@ -0,0 +1,124 @@
+/*
+ * Check decoding of sgetmask and ssetmask syscalls.
+ *
+ * Copyright (c) 2017 Dmitry V. Levin <[email protected]>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "tests.h"
+#include <asm/unistd.h>
+
+#if defined __NR_sgetmask && defined __NR_ssetmask
+
+# include <errno.h>
+# include <signal.h>
+# include <stdio.h>
+# include <stdint.h>
+# include <string.h>
+# include <unistd.h>
+
+static long
+k_sgetmask(void)
+{
+	return syscall(__NR_sgetmask);
+}
+
+static long
+k_ssetmask(const kernel_ulong_t arg)
+{
+	return syscall(__NR_ssetmask, arg);
+}
+
+int
+main(void)
+{
+	union {
+		sigset_t libc_mask;
+		unsigned long old_mask;
+	} uset, uget;
+	long rc;
+
+	/*
+	 * Block, reset, and raise SIGUSR1.
+	 * If a subsequent ssetmask call fails to set the proper mask,
+	 * the process will be terminated by SIGUSR1.
+	 */
+	sigemptyset(&uset.libc_mask);
+	sigaddset(&uset.libc_mask, SIGUSR1);
+	if (sigprocmask(SIG_SETMASK, &uset.libc_mask, NULL))
+		perror_msg_and_fail("sigprocmask");
+	if (signal(SIGUSR1, SIG_DFL) == SIG_ERR)
+		perror_msg_and_fail("signal");
+	raise(SIGUSR1);
+
+	sigaddset(&uset.libc_mask, SIGUSR2);
+	rc = k_ssetmask((kernel_ulong_t) 0xfacefeed00000000ULL | uset.old_mask);
+	if (rc == -1L) {
+		printf("ssetmask([USR1 USR2]) = %s\n", sprintrc(rc));
+	} else {
+		printf("ssetmask([USR1 USR2]) = %#lx (old mask [USR1])\n", rc);
+		/*
+		 * Use a regular sigprocmask call to check the value
+		 * returned by the ssetmask call being tested.
+		 */
+		if (sigprocmask(SIG_SETMASK, NULL, &uget.libc_mask))
+			perror_msg_and_fail("sigprocmask");
+		if (uset.old_mask != uget.old_mask)
+			error_msg_and_fail("sigprocmask returned %#lx"
+					   " instead of %#lx",
+					   uget.old_mask, uset.old_mask);
+	}
+
+	rc = k_sgetmask();
+	if (rc == -1L) {
+		printf("sgetmask() = %s\n", sprintrc(rc));
+	} else {
+		printf("sgetmask() = %#lx (mask [USR1 USR2])\n", rc);
+		if (uget.old_mask != (unsigned long) rc)
+			error_msg_and_fail("sigprocmask returned %#lx",
+					   uget.old_mask);
+
+		if (sizeof(long) > 4) {
+			sigaddset(&uset.libc_mask, 32 + 27);
+			if (sigprocmask(SIG_SETMASK, &uset.libc_mask, NULL))
+				perror_msg_and_fail("sigprocmask");
+			rc = k_sgetmask();
+			printf("sgetmask() = %#lx"
+			       " (mask [USR1 USR2 RT_27])\n", rc);
+			if (uset.old_mask != (unsigned long) rc)
+				error_msg_and_fail("sigprocmask set %#lx",
+						   uset.old_mask);
+		}
+	}
+
+	puts("+++ exited with 0 +++");
+	return 0;
+}
+
+#else
+
+SKIP_MAIN_UNDEFINED("__NR_sgetmask && __NR_ssetmask")
+
+#endif
diff --git a/tests/sxetmask.gen.test b/tests/sxetmask.gen.test
new file mode 100755
index 0000000..fea9e4a
--- /dev/null
+++ b/tests/sxetmask.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (sxetmask -a11 -e trace=sgetmask,ssetmask); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a11 -e trace=sgetmask,ssetmask
diff --git a/tests/symlink.c b/tests/symlink.c
index 72cb490..3e01cf2 100644
--- a/tests/symlink.c
+++ b/tests/symlink.c
@@ -7,14 +7,12 @@
 # include <unistd.h>
 
 int
-main(void)
+main(int ac, char **av)
 {
-	static const char sample_1[] = "symlink_new";
-	static const char sample_2[] = "symlink";
+	static const char sample[] = "symlink.sample";
 
-	long rc = syscall(__NR_symlink, sample_1, sample_2);
-	printf("symlink(\"%s\", \"%s\") = %ld %s (%m)\n",
-	       sample_1, sample_2, rc, errno2name());
+	long rc = syscall(__NR_symlink, sample, av[0]);
+	printf("symlink(\"%s\", \"%s\") = %s\n", sample, av[0], sprintrc(rc));
 
 	puts("+++ exited with 0 +++");
 	return 0;
diff --git a/tests/symlink.gen.test b/tests/symlink.gen.test
new file mode 100755
index 0000000..f41668c
--- /dev/null
+++ b/tests/symlink.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (symlink -a34); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a34
diff --git a/tests/symlink.test b/tests/symlink.test
deleted file mode 100755
index 79b93ba..0000000
--- a/tests/symlink.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check symlink syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a34
diff --git a/tests/symlinkat.gen.test b/tests/symlinkat.gen.test
new file mode 100755
index 0000000..39e624a
--- /dev/null
+++ b/tests/symlinkat.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (symlinkat ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/symlinkat.test b/tests/symlinkat.test
deleted file mode 100755
index d8501ff..0000000
--- a/tests/symlinkat.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check symlinkat syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff
diff --git a/tests/sync.gen.test b/tests/sync.gen.test
new file mode 100755
index 0000000..4aaf8c7
--- /dev/null
+++ b/tests/sync.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (sync -a7); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a7
diff --git a/tests/sync.test b/tests/sync.test
deleted file mode 100755
index f6bf6c8..0000000
--- a/tests/sync.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check sync syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a7
diff --git a/tests/sync_file_range.gen.test b/tests/sync_file_range.gen.test
new file mode 100755
index 0000000..0693c12
--- /dev/null
+++ b/tests/sync_file_range.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (sync_file_range ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/sync_file_range.test b/tests/sync_file_range.test
deleted file mode 100755
index 6aa86d6..0000000
--- a/tests/sync_file_range.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check sync_file_range syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff
diff --git a/tests/sync_file_range2.gen.test b/tests/sync_file_range2.gen.test
new file mode 100755
index 0000000..23046b6
--- /dev/null
+++ b/tests/sync_file_range2.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (sync_file_range2 ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/sync_file_range2.test b/tests/sync_file_range2.test
deleted file mode 100755
index 0d9945e..0000000
--- a/tests/sync_file_range2.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check sync_file_range2 syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff
diff --git a/tests/sysinfo.c b/tests/sysinfo.c
index 377bdc9..b4b348c 100644
--- a/tests/sysinfo.c
+++ b/tests/sysinfo.c
@@ -3,6 +3,7 @@
  *
  * Copyright (c) 2015 Elvira Khabirova <[email protected]>
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -38,7 +39,7 @@
 	sysinfo(NULL);
 	printf("sysinfo(NULL) = -1 EFAULT (%m)\n");
 
-	struct sysinfo * const si = tail_alloc(sizeof(*si));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct sysinfo, si);
 
 	if (sysinfo(si))
 		perror_msg_and_skip("sysinfo");
diff --git a/tests/sysinfo.gen.test b/tests/sysinfo.gen.test
new file mode 100755
index 0000000..e6469d5
--- /dev/null
+++ b/tests/sysinfo.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (sysinfo -a14); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a14
diff --git a/tests/sysinfo.test b/tests/sysinfo.test
deleted file mode 100755
index 806d8b6..0000000
--- a/tests/sysinfo.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of sysinfo syscall
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a14
diff --git a/tests/syslog.gen.test b/tests/syslog.gen.test
new file mode 100755
index 0000000..5423d5b
--- /dev/null
+++ b/tests/syslog.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (syslog -a36); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a36
diff --git a/tests/syslog.test b/tests/syslog.test
deleted file mode 100755
index 1c2158e..0000000
--- a/tests/syslog.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check syslog syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a36
diff --git a/tests/tee.gen.test b/tests/tee.gen.test
new file mode 100755
index 0000000..2a87fae
--- /dev/null
+++ b/tests/tee.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (tee ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/tee.test b/tests/tee.test
deleted file mode 100755
index 76b6000..0000000
--- a/tests/tee.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check tee syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff
diff --git a/tests/tests.h b/tests/tests.h
index d4294de..dcc1057 100644
--- a/tests/tests.h
+++ b/tests/tests.h
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -44,6 +45,9 @@
 /* Cached sysconf(_SC_PAGESIZE). */
 size_t get_page_size(void);
 
+/* The size of kernel's sigset_t. */
+unsigned int get_sigset_size(void);
+
 /* Print message and strerror(errno) to stderr, then exit(1). */
 void perror_msg_and_fail(const char *, ...)
 	ATTRIBUTE_FORMAT((printf, 1, 2)) ATTRIBUTE_NORETURN;
@@ -57,6 +61,9 @@
 void perror_msg_and_skip(const char *, ...)
 	ATTRIBUTE_FORMAT((printf, 1, 2)) ATTRIBUTE_NORETURN;
 
+/* Stat the specified file and skip the test if the stat call failed. */
+void skip_if_unavailable(const char *);
+
 /*
  * Allocate memory that ends on the page boundary.
  * Pages allocated by this call are preceeded by an unmapped page
@@ -69,6 +76,22 @@
 	ATTRIBUTE_MALLOC ATTRIBUTE_ALLOC_SIZE((2));
 
 /*
+ * Allocate an object of the specified type at the end
+ * of a mapped memory region.
+ * Assign its address to the specified constant pointer.
+ */
+#define TAIL_ALLOC_OBJECT_CONST_PTR(type_name, type_ptr)	\
+	type_name *const type_ptr = tail_alloc(sizeof(*type_ptr))
+
+/*
+ * Allocate an object of the specified type at the end
+ * of a mapped memory region.
+ * Assign its address to the specified variable pointer.
+ */
+#define TAIL_ALLOC_OBJECT_VAR_PTR(type_name, type_ptr)		\
+	type_name *type_ptr = tail_alloc(sizeof(*type_ptr))
+
+/*
  * Fill memory (pointed by ptr, having size bytes) with different bytes (with
  * values starting with start and resetting every period) in order to catch
  * sign, byte order and/or alignment errors.
@@ -100,6 +123,12 @@
 /* Print memory in a quoted form. */
 void print_quoted_memory(const char *, size_t);
 
+/* Print time_t and nanoseconds in symbolic format. */
+void print_time_t_nsec(time_t, unsigned long long, int);
+
+/* Print time_t and microseconds in symbolic format. */
+void print_time_t_usec(time_t, unsigned long long, int);
+
 /* Read an int from the file. */
 int read_int_from_file(const char *, int *);
 
diff --git a/tests/threads-execve.c b/tests/threads-execve.c
index 853645f..4eb334f 100644
--- a/tests/threads-execve.c
+++ b/tests/threads-execve.c
@@ -2,6 +2,7 @@
  * Check decoding of threads when a non-leader thread invokes execve.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -136,25 +137,25 @@
 	switch (action % NUMBER_OF_ACTIONS) {
 		case ACTION_exit:
 			printf("%-5d execve(\"%s\", [\"%s\", \"%s\", \"%s\"]"
-			       ", [/* %u vars */] <pid changed to %u ...>\n",
+			       ", %p /* %u vars */ <pid changed to %u ...>\n",
 			       tid, argv[0], argv[0], argv[1], argv[2],
-			       arglen(environ), leader);
+			       environ, arglen(environ), leader);
 			break;
 		case ACTION_rt_sigsuspend:
 			printf("%-5d execve(\"%s\", [\"%s\", \"%s\", \"%s\"]"
-			       ", [/* %u vars */] <unfinished ...>\n"
+			       ", %p /* %u vars */ <unfinished ...>\n"
 			       "%-5d <... rt_sigsuspend resumed>) = ?\n",
 			       tid, argv[0], argv[0], argv[1], argv[2],
-			       arglen(environ),
+			       environ, arglen(environ),
 			       leader);
 			break;
 		case ACTION_nanosleep:
 			printf("%-5d execve(\"%s\", [\"%s\", \"%s\", \"%s\"]"
-			       ", [/* %u vars */] <unfinished ...>\n"
+			       ", %p /* %u vars */ <unfinished ...>\n"
 			       "%-5d <... nanosleep resumed> <unfinished ...>)"
 			       " = ?\n",
 			       tid, argv[0], argv[0], argv[1], argv[2],
-			       arglen(environ),
+			       environ, arglen(environ),
 			       leader);
 			break;
 	}
@@ -180,18 +181,15 @@
 		if (clock_nanosleep(CLOCK_REALTIME, 0, &ts, NULL))
 			perror_msg_and_skip("clock_nanosleep CLOCK_REALTIME");
 
-		printf("%-5d execve(\"%s\", [\"%s\"], [/* %u vars */]) = 0\n",
-		       leader, av[0], av[0], arglen(environ));
-
 		get_sigsetsize();
 		static char buf[sizeof(sigsetsize) * 3];
 		sprintf(buf, "%u", sigsetsize);
 
 		char *argv[] = { av[0], buf, (char *) "0", NULL };
 		printf("%-5d execve(\"%s\", [\"%s\", \"%s\", \"%s\"]"
-		       ", [/* %u vars */]) = 0\n",
+		       ", %p /* %u vars */) = 0\n",
 		       leader, argv[0], argv[0], argv[1], argv[2],
-		       arglen(environ));
+		       environ, arglen(environ));
 		execve(argv[0], argv, environ);
 		perror_msg_and_fail("execve");
 	}
diff --git a/tests/threads-execve.test b/tests/threads-execve.test
index 4a77146..02c8924 100755
--- a/tests/threads-execve.test
+++ b/tests/threads-execve.test
@@ -3,6 +3,7 @@
 # Check decoding of threads when a non-leader thread invokes execve.
 #
 # Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+# Copyright (c) 2016-2017 The strace developers.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -40,10 +41,11 @@
 
 # Due to probabilistic nature of the test, try it several times.
 i=0
-while [ $i -le 9 ]; do
+while [ $i -le 19 ]; do
+	i="$(($i+1))"
 	run_strace "$@" > "$EXP"
-	diff -- "$EXP" "$LOG" || continue
-	rm -f "$EXP"
+	sed 1d < "$LOG" > "$OUT"
+	diff -- "$EXP" "$OUT" || continue
 	exit 0
 done
 
diff --git a/tests/time.c b/tests/time.c
index 4a5cde9..c329a79 100644
--- a/tests/time.c
+++ b/tests/time.c
@@ -2,6 +2,7 @@
  * This file is part of time strace test.
  *
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -40,15 +41,24 @@
 int
 main(void)
 {
-	time_t *p = tail_alloc(sizeof(time_t));
+	TAIL_ALLOC_OBJECT_CONST_PTR(time_t, p);
 
 	time_t t = syscall(__NR_time, NULL);
 	if ((time_t) -1 == t)
 		perror_msg_and_skip("time");
-	printf("time(NULL) = %jd\n", (intmax_t) t);
+	printf("time(NULL) = %lld (", (long long) t);
+	print_time_t_nsec(t, 0, 0);
+	puts(")");
+
+	t = syscall(__NR_time, p + 1);
+	printf("time(%p) = %s\n", p + 1, sprintrc(t));
 
 	t = syscall(__NR_time, p);
-	printf("time([%jd]) = %jd\n", (intmax_t) *p, (intmax_t) t);
+	printf("time([%lld", (long long) *p);
+	print_time_t_nsec((time_t) *p, 0, 1),
+	printf("]) = %lld (", (long long) t);
+	print_time_t_nsec(t, 0, 0);
+	puts(")");
 
 	puts("+++ exited with 0 +++");
 	return 0;
diff --git a/tests/time.gen.test b/tests/time.gen.test
new file mode 100755
index 0000000..ed7ec69
--- /dev/null
+++ b/tests/time.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (time -a10); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a10
diff --git a/tests/time.test b/tests/time.test
deleted file mode 100755
index 6ab193a..0000000
--- a/tests/time.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check time syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a10
diff --git a/tests/timer_create.gen.test b/tests/timer_create.gen.test
new file mode 100755
index 0000000..6b4c543
--- /dev/null
+++ b/tests/timer_create.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (timer_create ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/timer_create.test b/tests/timer_create.test
deleted file mode 100755
index 870a179..0000000
--- a/tests/timer_create.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check timer_create syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff
diff --git a/tests/timer_xettime.c b/tests/timer_xettime.c
index 9eabbf0..aacd770 100644
--- a/tests/timer_xettime.c
+++ b/tests/timer_xettime.c
@@ -2,6 +2,7 @@
  * This file is part of timer_xettime strace test.
  *
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -47,6 +48,7 @@
 	printf("timer_settime(%d, TIMER_ABSTIME, NULL, NULL)"
 	       " = -1 EINVAL (%m)\n", 0xdefaced);
 
+	long rc;
 	int tid;
 	struct sigevent sev = { .sigev_notify = SIGEV_NONE };
 
@@ -55,51 +57,61 @@
 	printf("timer_create(CLOCK_MONOTONIC, {sigev_signo=0"
 	       ", sigev_notify=SIGEV_NONE}, [%d]) = 0\n", tid);
 
-	struct {
-		struct itimerspec its;
-		uint32_t pad[4];
-	} old = {
-		.its = {
-			.it_interval = { 0xdeface5, 0xdeface6 },
-			.it_value = { 0xdeface7, 0xdeface8 }
-		},
-		.pad = { 0xdeadbeef, 0xbadc0ded, 0xdeadbeef, 0xbadc0ded }
-	}, new = {
-		.its = {
-			.it_interval = { 0xdeface1, 0xdeface2 },
-			.it_value = { 0xdeface3, 0xdeface4 }
-		},
-		.pad = { 0xdeadbeef, 0xbadc0ded, 0xdeadbeef, 0xbadc0ded }
-	};
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct itimerspec, its_new);
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct itimerspec, its_old);
 
-	if (syscall(__NR_timer_settime, tid, 0, &new.its, &old.its))
+	its_new->it_interval.tv_sec = 0xdeadbeefU;
+	its_new->it_interval.tv_nsec = 0xfacefeedU;
+	its_new->it_value.tv_sec = (time_t) 0xcafef00ddeadbeefLL;
+	its_new->it_value.tv_nsec = (long) 0xbadc0dedfacefeedLL;
+
+	rc = syscall(__NR_timer_settime, tid, 0, its_new, its_old);
+	printf("timer_settime(%d, 0"
+	       ", {it_interval={tv_sec=%lld, tv_nsec=%llu}"
+	       ", it_value={tv_sec=%lld, tv_nsec=%llu}}, %p) = %s\n",
+	       tid, (long long) its_new->it_interval.tv_sec,
+	       zero_extend_signed_to_ull(its_new->it_interval.tv_nsec),
+	       (long long) its_new->it_value.tv_sec,
+	       zero_extend_signed_to_ull(its_new->it_value.tv_nsec),
+	       its_old, sprintrc(rc));
+
+	its_new->it_interval.tv_sec = 0xdeface1;
+	its_new->it_interval.tv_nsec = 0xdeface2;
+	its_new->it_value.tv_sec = 0xdeface3;
+	its_new->it_value.tv_nsec = 0xdeface4;
+	its_old->it_interval.tv_sec = 0xdeface5;
+	its_old->it_interval.tv_nsec = 0xdeface6;
+	its_old->it_value.tv_sec = 0xdeface7;
+	its_old->it_value.tv_nsec = 0xdeface8;
+
+	if (syscall(__NR_timer_settime, tid, 0, its_new, its_old))
 		perror_msg_and_skip("timer_settime");
 	printf("timer_settime(%d, 0"
-	       ", {it_interval={tv_sec=%jd, tv_nsec=%jd}"
-	       ", it_value={tv_sec=%jd, tv_nsec=%jd}}"
-	       ", {it_interval={tv_sec=%jd, tv_nsec=%jd}"
-	       ", it_value={tv_sec=%jd, tv_nsec=%jd}}"
+	       ", {it_interval={tv_sec=%lld, tv_nsec=%llu}"
+	       ", it_value={tv_sec=%lld, tv_nsec=%llu}}"
+	       ", {it_interval={tv_sec=%lld, tv_nsec=%llu}"
+	       ", it_value={tv_sec=%lld, tv_nsec=%llu}}"
 	       ") = 0\n",
 	       tid,
-	       (intmax_t) new.its.it_interval.tv_sec,
-	       (intmax_t) new.its.it_interval.tv_nsec,
-	       (intmax_t) new.its.it_value.tv_sec,
-	       (intmax_t) new.its.it_value.tv_nsec,
-	       (intmax_t) old.its.it_interval.tv_sec,
-	       (intmax_t) old.its.it_interval.tv_nsec,
-	       (intmax_t) old.its.it_value.tv_sec,
-	       (intmax_t) old.its.it_value.tv_nsec);
+	       (long long) its_new->it_interval.tv_sec,
+	       zero_extend_signed_to_ull(its_new->it_interval.tv_nsec),
+	       (long long) its_new->it_value.tv_sec,
+	       zero_extend_signed_to_ull(its_new->it_value.tv_nsec),
+	       (long long) its_old->it_interval.tv_sec,
+	       zero_extend_signed_to_ull(its_old->it_interval.tv_nsec),
+	       (long long) its_old->it_value.tv_sec,
+	       zero_extend_signed_to_ull(its_old->it_value.tv_nsec));
 
-	if (syscall(__NR_timer_gettime, tid, &old.its))
+	if (syscall(__NR_timer_gettime, tid, its_old))
 		perror_msg_and_skip("timer_gettime");
 	printf("timer_gettime(%d"
-	       ", {it_interval={tv_sec=%jd, tv_nsec=%jd}"
-	       ", it_value={tv_sec=%jd, tv_nsec=%jd}}) = 0\n",
+	       ", {it_interval={tv_sec=%lld, tv_nsec=%llu}"
+	       ", it_value={tv_sec=%lld, tv_nsec=%llu}}) = 0\n",
 	       tid,
-	       (intmax_t) old.its.it_interval.tv_sec,
-	       (intmax_t) old.its.it_interval.tv_nsec,
-	       (intmax_t) old.its.it_value.tv_sec,
-	       (intmax_t) old.its.it_value.tv_nsec);
+	       (long long) its_old->it_interval.tv_sec,
+	       zero_extend_signed_to_ull(its_old->it_interval.tv_nsec),
+	       (long long) its_old->it_value.tv_sec,
+	       zero_extend_signed_to_ull(its_old->it_value.tv_nsec));
 
 	puts("+++ exited with 0 +++");
 	return 0;
diff --git a/tests/timer_xettime.gen.test b/tests/timer_xettime.gen.test
new file mode 100755
index 0000000..6e2dffa
--- /dev/null
+++ b/tests/timer_xettime.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (timer_xettime -e trace=timer_create,timer_settime,timer_gettime); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -e trace=timer_create,timer_settime,timer_gettime
diff --git a/tests/timer_xettime.test b/tests/timer_xettime.test
deleted file mode 100755
index 08bcdd6..0000000
--- a/tests/timer_xettime.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check timer_create, timer_settime, and timer_gettime syscalls decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -e trace=timer_create,timer_settime,timer_gettime
diff --git a/tests/timerfd_xettime.c b/tests/timerfd_xettime.c
index ca7124e..1e8a23a 100644
--- a/tests/timerfd_xettime.c
+++ b/tests/timerfd_xettime.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -47,49 +48,59 @@
 		perror_msg_and_skip("timerfd_create");
 	puts("timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC|TFD_NONBLOCK) = 0");
 
-	struct {
-		struct itimerspec its;
-		uint32_t pad[4];
-	} old = {
-		.its = {
-			.it_interval = { 0xdeface5, 0xdeface6 },
-			.it_value = { 0xdeface7, 0xdeface8 }
-		},
-		.pad = { 0xdeadbeef, 0xbadc0ded, 0xdeadbeef, 0xbadc0ded }
-	}, new = {
-		.its = {
-			.it_interval = { 0xdeface1, 0xdeface2 },
-			.it_value = { 0xdeface3, 0xdeface4 }
-		},
-		.pad = { 0xdeadbeef, 0xbadc0ded, 0xdeadbeef, 0xbadc0ded }
-	};
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct itimerspec, its_new);
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct itimerspec, its_old);
 
-	if (syscall(__NR_timerfd_settime, 0, 0, &new.its, &old.its))
+	its_new->it_interval.tv_sec = 0xdeadbeefU;
+	its_new->it_interval.tv_nsec = 0xfacefeedU;
+	its_new->it_value.tv_sec = (time_t) 0xcafef00ddeadbeefLL;
+	its_new->it_value.tv_nsec = (long) 0xbadc0dedfacefeedLL;
+
+	long rc = syscall(__NR_timerfd_settime, 0, 0, its_new, its_old);
+	printf("timerfd_settime(0, 0"
+	       ", {it_interval={tv_sec=%lld, tv_nsec=%llu}"
+	       ", it_value={tv_sec=%lld, tv_nsec=%llu}}, %p) = %s\n",
+	       (long long) its_new->it_interval.tv_sec,
+	       zero_extend_signed_to_ull(its_new->it_interval.tv_nsec),
+	       (long long) its_new->it_value.tv_sec,
+	       zero_extend_signed_to_ull(its_new->it_value.tv_nsec),
+	       its_old, sprintrc(rc));
+
+	its_new->it_interval.tv_sec = 0xdeface1;
+	its_new->it_interval.tv_nsec = 0xdeface2;
+	its_new->it_value.tv_sec = 0xdeface3;
+	its_new->it_value.tv_nsec = 0xdeface4;
+	its_old->it_interval.tv_sec = 0xdeface5;
+	its_old->it_interval.tv_nsec = 0xdeface6;
+	its_old->it_value.tv_sec = 0xdeface7;
+	its_old->it_value.tv_nsec = 0xdeface8;
+
+	if (syscall(__NR_timerfd_settime, 0, 0, its_new, its_old))
 		perror_msg_and_skip("timerfd_settime");
 	printf("timerfd_settime(0, 0"
-	       ", {it_interval={tv_sec=%jd, tv_nsec=%jd}"
-	       ", it_value={tv_sec=%jd, tv_nsec=%jd}}"
-	       ", {it_interval={tv_sec=%jd, tv_nsec=%jd}"
-	       ", it_value={tv_sec=%jd, tv_nsec=%jd}}"
+	       ", {it_interval={tv_sec=%lld, tv_nsec=%llu}"
+	       ", it_value={tv_sec=%lld, tv_nsec=%llu}}"
+	       ", {it_interval={tv_sec=%lld, tv_nsec=%llu}"
+	       ", it_value={tv_sec=%lld, tv_nsec=%llu}}"
 	       ") = 0\n",
-	       (intmax_t) new.its.it_interval.tv_sec,
-	       (intmax_t) new.its.it_interval.tv_nsec,
-	       (intmax_t) new.its.it_value.tv_sec,
-	       (intmax_t) new.its.it_value.tv_nsec,
-	       (intmax_t) old.its.it_interval.tv_sec,
-	       (intmax_t) old.its.it_interval.tv_nsec,
-	       (intmax_t) old.its.it_value.tv_sec,
-	       (intmax_t) old.its.it_value.tv_nsec);
+	       (long long) its_new->it_interval.tv_sec,
+	       zero_extend_signed_to_ull(its_new->it_interval.tv_nsec),
+	       (long long) its_new->it_value.tv_sec,
+	       zero_extend_signed_to_ull(its_new->it_value.tv_nsec),
+	       (long long) its_old->it_interval.tv_sec,
+	       zero_extend_signed_to_ull(its_old->it_interval.tv_nsec),
+	       (long long) its_old->it_value.tv_sec,
+	       zero_extend_signed_to_ull(its_old->it_value.tv_nsec));
 
-	if (syscall(__NR_timerfd_gettime, 0, &old.its))
+	if (syscall(__NR_timerfd_gettime, 0, its_old))
 		perror_msg_and_skip("timerfd_gettime");
 	printf("timerfd_gettime(0"
-	       ", {it_interval={tv_sec=%jd, tv_nsec=%jd}"
-	       ", it_value={tv_sec=%jd, tv_nsec=%jd}}) = 0\n",
-	       (intmax_t) old.its.it_interval.tv_sec,
-	       (intmax_t) old.its.it_interval.tv_nsec,
-	       (intmax_t) old.its.it_value.tv_sec,
-	       (intmax_t) old.its.it_value.tv_nsec);
+	       ", {it_interval={tv_sec=%lld, tv_nsec=%llu}"
+	       ", it_value={tv_sec=%lld, tv_nsec=%llu}}) = 0\n",
+	       (long long) its_old->it_interval.tv_sec,
+	       zero_extend_signed_to_ull(its_old->it_interval.tv_nsec),
+	       (long long) its_old->it_value.tv_sec,
+	       zero_extend_signed_to_ull(its_old->it_value.tv_nsec));
 
 	puts("+++ exited with 0 +++");
 	return 0;
diff --git a/tests/timerfd_xettime.gen.test b/tests/timerfd_xettime.gen.test
new file mode 100755
index 0000000..97e560b
--- /dev/null
+++ b/tests/timerfd_xettime.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (timerfd_xettime -e trace=timerfd_create,timerfd_settime,timerfd_gettime); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -e trace=timerfd_create,timerfd_settime,timerfd_gettime
diff --git a/tests/timerfd_xettime.test b/tests/timerfd_xettime.test
deleted file mode 100755
index 75aa21c..0000000
--- a/tests/timerfd_xettime.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check timerfd_create, timerfd_settime, and timerfd_gettime syscalls decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -e trace=timerfd_create,timerfd_settime,timerfd_gettime
diff --git a/tests/times-fail.gen.test b/tests/times-fail.gen.test
new file mode 100755
index 0000000..9934d19
--- /dev/null
+++ b/tests/times-fail.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (times-fail -a12 -e trace=times); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a12 -e trace=times
diff --git a/tests/times-fail.test b/tests/times-fail.test
deleted file mode 100755
index ee28a06..0000000
--- a/tests/times-fail.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of failing times syscall
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a12 -e trace=times
diff --git a/tests/times.gen.test b/tests/times.gen.test
new file mode 100755
index 0000000..ca4ebbe
--- /dev/null
+++ b/tests/times.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (times -esignal=none); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -esignal=none
diff --git a/tests/times.test b/tests/times.test
deleted file mode 100755
index b97e0d3..0000000
--- a/tests/times.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of times syscall
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -esignal=none
diff --git a/tests/trace_fstat.gen.test b/tests/trace_fstat.gen.test
new file mode 100755
index 0000000..c3aede1
--- /dev/null
+++ b/tests/trace_fstat.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (trace_fstat test_trace_expr '' -e%fstat -v -P stat.sample -P /dev/full); do not edit.
+. "${srcdir=.}/init.sh"
+test_trace_expr '' -e%fstat -v -P stat.sample -P /dev/full
diff --git a/tests/trace_fstat.in b/tests/trace_fstat.in
new file mode 100644
index 0000000..34cfa7e
--- /dev/null
+++ b/tests/trace_fstat.in
@@ -0,0 +1,5 @@
+fstat	-a15
+fstat64	-a17
+fstatat64	-a32
+newfstatat	-a32
+oldfstat	-a21
diff --git a/tests/trace_fstatfs.gen.test b/tests/trace_fstatfs.gen.test
new file mode 100755
index 0000000..063f624
--- /dev/null
+++ b/tests/trace_fstatfs.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (trace_fstatfs test_trace_expr '' -e%fstatfs); do not edit.
+. "${srcdir=.}/init.sh"
+test_trace_expr '' -e%fstatfs
diff --git a/tests/trace_fstatfs.in b/tests/trace_fstatfs.in
new file mode 100644
index 0000000..6441a07
--- /dev/null
+++ b/tests/trace_fstatfs.in
@@ -0,0 +1,2 @@
+fstatfs	-a18
+fstatfs64	-a24
diff --git a/tests/trace_lstat.gen.test b/tests/trace_lstat.gen.test
new file mode 100755
index 0000000..a05b7a1
--- /dev/null
+++ b/tests/trace_lstat.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (trace_lstat test_trace_expr '' -e%lstat -v -P stat.sample -P /dev/full); do not edit.
+. "${srcdir=.}/init.sh"
+test_trace_expr '' -e%lstat -v -P stat.sample -P /dev/full
diff --git a/tests/trace_lstat.in b/tests/trace_lstat.in
new file mode 100644
index 0000000..abbabc4
--- /dev/null
+++ b/tests/trace_lstat.in
@@ -0,0 +1,3 @@
+lstat	-a32
+lstat64	-a32
+oldlstat	-a32
diff --git a/tests/trace_question.gen.test b/tests/trace_question.gen.test
new file mode 100755
index 0000000..76b3578
--- /dev/null
+++ b/tests/trace_question.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (trace_question test_trace_expr '' -e?osf_utimes,?/^pkey_.*); do not edit.
+. "${srcdir=.}/init.sh"
+test_trace_expr '' -e?osf_utimes,?/^pkey_.*
diff --git a/tests/trace_question.in b/tests/trace_question.in
new file mode 100644
index 0000000..74d662c
--- /dev/null
+++ b/tests/trace_question.in
@@ -0,0 +1,4 @@
+osf_utimes	-a21
+pkey_alloc	-a17
+pkey_free	-a13
+pkey_mprotect	-a37
diff --git a/tests/trace_stat.gen.test b/tests/trace_stat.gen.test
new file mode 100755
index 0000000..ae95ab8
--- /dev/null
+++ b/tests/trace_stat.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (trace_stat test_trace_expr '' -e%stat -v -P stat.sample -P /dev/full); do not edit.
+. "${srcdir=.}/init.sh"
+test_trace_expr '' -e%stat -v -P stat.sample -P /dev/full
diff --git a/tests/trace_stat.in b/tests/trace_stat.in
new file mode 100644
index 0000000..f105d78
--- /dev/null
+++ b/tests/trace_stat.in
@@ -0,0 +1,3 @@
+oldstat	-a32
+stat	-a32
+stat64	-a32
diff --git a/tests/trace_stat_like.gen.test b/tests/trace_stat_like.gen.test
new file mode 100755
index 0000000..5681a8a
--- /dev/null
+++ b/tests/trace_stat_like.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (trace_stat_like test_trace_expr '' -e%%stat -v -P stat.sample -P /dev/full); do not edit.
+. "${srcdir=.}/init.sh"
+test_trace_expr '' -e%%stat -v -P stat.sample -P /dev/full
diff --git a/tests/trace_stat_like.in b/tests/trace_stat_like.in
new file mode 100644
index 0000000..22bd7f2
--- /dev/null
+++ b/tests/trace_stat_like.in
@@ -0,0 +1,12 @@
+fstat	-a15
+fstat64	-a17
+fstatat64	-a32
+lstat	-a32
+lstat64	-a32
+newfstatat	-a32
+oldfstat	-a21
+oldlstat	-a32
+oldstat	-a32
+stat	-a32
+stat64	-a32
+statx	-a32
diff --git a/tests/trace_statfs.gen.test b/tests/trace_statfs.gen.test
new file mode 100755
index 0000000..957412b
--- /dev/null
+++ b/tests/trace_statfs.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (trace_statfs test_trace_expr '' -e%statfs); do not edit.
+. "${srcdir=.}/init.sh"
+test_trace_expr '' -e%statfs
diff --git a/tests/trace_statfs.in b/tests/trace_statfs.in
new file mode 100644
index 0000000..7c4adfe
--- /dev/null
+++ b/tests/trace_statfs.in
@@ -0,0 +1,2 @@
+statfs	-a17
+statfs64	-a23
diff --git a/tests/trace_statfs_like.gen.test b/tests/trace_statfs_like.gen.test
new file mode 100755
index 0000000..be1a9c0
--- /dev/null
+++ b/tests/trace_statfs_like.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (trace_statfs_like test_trace_expr '' -e%%statfs); do not edit.
+. "${srcdir=.}/init.sh"
+test_trace_expr '' -e%%statfs
diff --git a/tests/trace_statfs_like.in b/tests/trace_statfs_like.in
new file mode 100644
index 0000000..285aec6
--- /dev/null
+++ b/tests/trace_statfs_like.in
@@ -0,0 +1,5 @@
+statfs	-a17
+statfs64	-a23
+fstatfs	-a18
+fstatfs64	-a24
+ustat	-a33
diff --git a/tests/truncate.gen.test b/tests/truncate.gen.test
new file mode 100755
index 0000000..0410e73
--- /dev/null
+++ b/tests/truncate.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (truncate ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/truncate.test b/tests/truncate.test
deleted file mode 100755
index 6bf1e70..0000000
--- a/tests/truncate.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check truncate syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff
diff --git a/tests/truncate64.gen.test b/tests/truncate64.gen.test
new file mode 100755
index 0000000..dae0fe6
--- /dev/null
+++ b/tests/truncate64.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (truncate64 ); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff 
diff --git a/tests/truncate64.test b/tests/truncate64.test
deleted file mode 100755
index c466806..0000000
--- a/tests/truncate64.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check truncate64 syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff
diff --git a/tests/ugetrlimit.gen.test b/tests/ugetrlimit.gen.test
new file mode 100755
index 0000000..ff27134
--- /dev/null
+++ b/tests/ugetrlimit.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (ugetrlimit -a28); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a28
diff --git a/tests/ugetrlimit.test b/tests/ugetrlimit.test
deleted file mode 100755
index f4648ff..0000000
--- a/tests/ugetrlimit.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of ugetrlimit syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a28
diff --git a/tests/uio.test b/tests/uio.test
index 020b97e..0184685 100755
--- a/tests/uio.test
+++ b/tests/uio.test
@@ -5,7 +5,7 @@
 . "${srcdir=.}/init.sh"
 
 run_prog
-run_strace -edesc $args
+run_strace -e%desc $args
 match_grep
 
 exit 0
diff --git a/tests/umask.gen.test b/tests/umask.gen.test
new file mode 100755
index 0000000..60af5e9
--- /dev/null
+++ b/tests/umask.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (umask -a11); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a11
diff --git a/tests/umask.test b/tests/umask.test
deleted file mode 100755
index 1351721..0000000
--- a/tests/umask.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check umask syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a11
diff --git a/tests/umode_t.c b/tests/umode_t.c
index 5041638..dcd1514 100644
--- a/tests/umode_t.c
+++ b/tests/umode_t.c
@@ -2,6 +2,7 @@
  * Check decoding of umode_t type syscall arguments.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -38,7 +39,7 @@
 # define TEST_SYSCALL_PREFIX_STR ""
 #endif
 
-static const char sample[] = TEST_SYSCALL_STR;
+static const char *sample;
 
 static void
 test_syscall(unsigned short mode)
@@ -49,17 +50,18 @@
 
 	if (mode <= 07)
 		printf("%s(%s\"%s\", 00%d) = %ld %s (%m)\n",
-		       sample, TEST_SYSCALL_PREFIX_STR,
+		       TEST_SYSCALL_STR, TEST_SYSCALL_PREFIX_STR,
 		       sample, (int) mode, rc, errno2name());
 	else
 		printf("%s(%s\"%s\", %#03ho) = %ld %s (%m)\n",
-		       sample, TEST_SYSCALL_PREFIX_STR,
+		       TEST_SYSCALL_STR, TEST_SYSCALL_PREFIX_STR,
 		       sample, mode, rc, errno2name());
 }
 
 int
-main(void)
+main(int ac, char **av)
 {
+	sample = av[0];
 	test_syscall(0);
 	test_syscall(0xffff);
 	test_syscall(06);
diff --git a/tests/umoven-illptr.gen.test b/tests/umoven-illptr.gen.test
new file mode 100755
index 0000000..eea7b1c
--- /dev/null
+++ b/tests/umoven-illptr.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (umoven-illptr -a36 -e trace=nanosleep); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a36 -e trace=nanosleep
diff --git a/tests/umoven-illptr.test b/tests/umoven-illptr.test
deleted file mode 100755
index 7b8cb31..0000000
--- a/tests/umoven-illptr.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of invalid pointer by umoven.
-. "${srcdir=.}/init.sh"
-
-run_strace_match_diff -a36 -e trace=nanosleep
diff --git a/tests/umovestr-illptr.gen.test b/tests/umovestr-illptr.gen.test
new file mode 100755
index 0000000..7685d44
--- /dev/null
+++ b/tests/umovestr-illptr.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (umovestr-illptr -a11 -e trace=chdir); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a11 -e trace=chdir
diff --git a/tests/umovestr-illptr.test b/tests/umovestr-illptr.test
deleted file mode 100755
index 6f1cc86..0000000
--- a/tests/umovestr-illptr.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of invalid pointer by umovestr.
-. "${srcdir=.}/init.sh"
-
-run_strace_match_diff -a11 -e trace=chdir
diff --git a/tests/umovestr2.test b/tests/umovestr2.test
index 5c5d561..3decbe2 100755
--- a/tests/umovestr2.test
+++ b/tests/umovestr2.test
@@ -9,7 +9,3 @@
 check_prog sed
 sed 1d < "$LOG" > "$OUT"
 match_diff "$OUT" "$EXP"
-
-rm -f "$EXP" "$OUT"
-
-exit 0
diff --git a/tests/umovestr3.gen.test b/tests/umovestr3.gen.test
new file mode 100755
index 0000000..b16e1ed
--- /dev/null
+++ b/tests/umovestr3.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (umovestr3 -a14 -e trace=chdir); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a14 -e trace=chdir
diff --git a/tests/umovestr3.test b/tests/umovestr3.test
deleted file mode 100755
index d5be283..0000000
--- a/tests/umovestr3.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# yet another umovestr short read test
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a14 -e trace=chdir
diff --git a/tests/uname.c b/tests/uname.c
index cd6f51c..96db753 100644
--- a/tests/uname.c
+++ b/tests/uname.c
@@ -10,7 +10,7 @@
 int main(int ac, char **av)
 {
 	int abbrev = ac > 1;
-	struct utsname *const uname = tail_alloc(sizeof(struct utsname));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct utsname, uname);
 	int rc = syscall(__NR_uname, uname);
 	printf("uname({sysname=\"");
 	print_quoted_string(uname->sysname);
diff --git a/tests/uname.test b/tests/uname.test
index 03fe30c..7ca1b5b 100755
--- a/tests/uname.test
+++ b/tests/uname.test
@@ -10,9 +10,8 @@
 run_strace -v -euname $args > "$EXP"
 uniq < "$LOG" > "$OUT"
 
-run_prog "./$NAME" abbrev > /dev/null
+run_prog "../$NAME" abbrev > /dev/null
 run_strace -euname $args >> "$EXP"
 uniq < "$LOG" >> "$OUT"
 
 match_diff "$OUT" "$EXP"
-rm -f "$OUT" "$EXP"
diff --git a/tests/unix-pair-send-recv.test b/tests/unix-pair-send-recv.test
index 4defdeb..10ab7cc 100755
--- a/tests/unix-pair-send-recv.test
+++ b/tests/unix-pair-send-recv.test
@@ -4,7 +4,7 @@
 
 . "${srcdir=.}/init.sh"
 
-run_prog ./unix-pair-send-recv abcdefghijklmnopqrstuvwxyz
+run_prog ../unix-pair-send-recv abcdefghijklmnopqrstuvwxyz
 run_strace -a32 -esignal=none -esend,recv -eread=0 -ewrite=0 $args
 match_diff
 
diff --git a/tests/unix-pair-sendto-recvfrom.test b/tests/unix-pair-sendto-recvfrom.test
index 21afe23..0bd9a04 100755
--- a/tests/unix-pair-sendto-recvfrom.test
+++ b/tests/unix-pair-sendto-recvfrom.test
@@ -4,7 +4,7 @@
 
 . "${srcdir=.}/init.sh"
 
-run_prog ./unix-pair-sendto-recvfrom abcdefghijklmnopqrstuvwxyz
+run_prog ../unix-pair-sendto-recvfrom abcdefghijklmnopqrstuvwxyz
 run_strace -esignal=none -esendto,recvfrom -eread=0 -ewrite=0 $args
 match_diff
 
diff --git a/tests/unlink.gen.test b/tests/unlink.gen.test
new file mode 100755
index 0000000..7b8522b
--- /dev/null
+++ b/tests/unlink.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (unlink -a24); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a24
diff --git a/tests/unlink.test b/tests/unlink.test
deleted file mode 100755
index 09bf79a..0000000
--- a/tests/unlink.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check unlink syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a24
diff --git a/tests/unlinkat.gen.test b/tests/unlinkat.gen.test
new file mode 100755
index 0000000..5a77c6a
--- /dev/null
+++ b/tests/unlinkat.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (unlinkat -a35); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a35
diff --git a/tests/unlinkat.test b/tests/unlinkat.test
deleted file mode 100755
index 864261f..0000000
--- a/tests/unlinkat.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check unlinkat syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a35
diff --git a/tests/unshare.gen.test b/tests/unshare.gen.test
new file mode 100755
index 0000000..077a458
--- /dev/null
+++ b/tests/unshare.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (unshare -a11); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a11
diff --git a/tests/unshare.test b/tests/unshare.test
deleted file mode 100755
index ccb9575..0000000
--- a/tests/unshare.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of setns syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a11
diff --git a/tests/userfaultfd.gen.test b/tests/userfaultfd.gen.test
new file mode 100755
index 0000000..4735146
--- /dev/null
+++ b/tests/userfaultfd.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (userfaultfd -a38); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a38
diff --git a/tests/userfaultfd.test b/tests/userfaultfd.test
deleted file mode 100755
index af8b6fb..0000000
--- a/tests/userfaultfd.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check userfaultfd syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a38
diff --git a/tests/ustat.c b/tests/ustat.c
index 57bb29c..3341c70 100644
--- a/tests/ustat.c
+++ b/tests/ustat.c
@@ -47,7 +47,7 @@
 	long rc;
 
 # ifdef HAVE_USTAT_H
-	struct ustat *const ust = tail_alloc(sizeof(*ust));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct ustat, ust);
 	struct stat st;
 	if (stat(".", &st))
 		perror_msg_and_fail("stat");
diff --git a/tests/ustat.gen.test b/tests/ustat.gen.test
new file mode 100755
index 0000000..f64b28d
--- /dev/null
+++ b/tests/ustat.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (ustat -a33); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a33
diff --git a/tests/ustat.test b/tests/ustat.test
deleted file mode 100755
index 60a88e0..0000000
--- a/tests/ustat.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check ustat syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a33
diff --git a/tests/utime.c b/tests/utime.c
index 8fd594f..03e3958 100644
--- a/tests/utime.c
+++ b/tests/utime.c
@@ -2,6 +2,7 @@
  * Check decoding of utime syscall.
  *
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -38,17 +39,6 @@
 # include <stdio.h>
 # include <unistd.h>
 
-
-static void
-print_tm(const struct tm * const p)
-{
-	char buf[256];
-
-	strftime(buf, sizeof(buf), "%FT%T%z", p);
-
-	printf("%s", buf);
-}
-
 static long
 k_utime(const void *const filename, const void *const times)
 {
@@ -60,8 +50,7 @@
 {
 	static const char *const dummy_str = "dummy filename";
 
-	const time_t t = time(NULL);
-	const struct tm * const p = localtime(&t);
+	const time_t t = 1492350678;
 	const struct utimbuf u = { .actime = t, .modtime = t };
 	const struct utimbuf *const tail_u = tail_memdup(&u, sizeof(u));
 	const char *const dummy_filename =
@@ -80,10 +69,10 @@
 
 	rc = k_utime("utime\nfilename", tail_u);
 	const char *errstr = sprintrc(rc);
-	printf("utime(\"utime\\nfilename\", {actime=");
-	print_tm(p);
-	printf(", modtime=");
-	print_tm(p);
+	printf("utime(\"utime\\nfilename\", {actime=%lld", (long long) t);
+	print_time_t_nsec(t, 0, 1);
+	printf(", modtime=%lld", (long long) t);
+	print_time_t_nsec(t, 0, 1);
 	printf("}) = %s\n", errstr);
 
 	puts("+++ exited with 0 +++");
diff --git a/tests/utime.gen.test b/tests/utime.gen.test
new file mode 100755
index 0000000..7270556
--- /dev/null
+++ b/tests/utime.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (utime -a16); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a16
diff --git a/tests/utime.test b/tests/utime.test
deleted file mode 100755
index bd64c53..0000000
--- a/tests/utime.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of utime syscall.
-. "${srcdir=.}/init.sh"
-
-run_strace_match_diff -a 16 -e trace=utime
diff --git a/tests/utimensat.c b/tests/utimensat.c
index 6d9faac..ddfd360 100644
--- a/tests/utimensat.c
+++ b/tests/utimensat.c
@@ -1,7 +1,7 @@
 /*
- * This file is part of utimensat strace test.
+ * Check decoding of utimensat syscall.
  *
- * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 Dmitry V. Levin <[email protected]>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -28,66 +28,173 @@
  */
 
 #include "tests.h"
-#include <assert.h>
-#include <errno.h>
 #include <fcntl.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <sys/stat.h>
 #include <sys/time.h>
+#include <unistd.h>
+#include <asm/unistd.h>
 
-#if defined HAVE_UTIMENSAT \
- && defined AT_FDCWD && defined AT_SYMLINK_NOFOLLOW \
- && defined UTIME_NOW && defined UTIME_OMIT
+#if defined __NR_utimensat && defined UTIME_NOW && defined UTIME_OMIT
 
 static void
 print_ts(const struct timespec *ts)
 {
-	printf("{tv_sec=%ju, tv_nsec=%ju}", (uintmax_t) ts->tv_sec,
-		(uintmax_t) ts->tv_nsec);
+	printf("{tv_sec=%lld, tv_nsec=%llu}", (long long) ts->tv_sec,
+		zero_extend_signed_to_ull(ts->tv_nsec));
+	print_time_t_nsec(ts->tv_sec,
+			  zero_extend_signed_to_ull(ts->tv_nsec), 1);
+}
+
+static const char *errstr;
+
+static long
+k_utimensat(const kernel_ulong_t dirfd,
+	    const kernel_ulong_t pathname,
+	    const kernel_ulong_t times,
+	    const kernel_ulong_t flags)
+{
+	long rc = syscall(__NR_utimensat, dirfd, pathname, times, flags);
+	errstr = sprintrc(rc);
+	return rc;
 }
 
 int
 main(void)
 {
-	static const char fname[] = "utimensat\nfilename";
+	static const kernel_ulong_t bogus_fd =
+		(kernel_ulong_t) 0xbadc0deddeadbeef;
+	static const kernel_ulong_t kfdcwd =
+		(kernel_ulong_t) 0xdefaced00000000 | -100U;
+	static const char proto_fname[] = "utimensat\nfilename";
+	static const char qname[] = "\"utimensat\\nfilename\"";
 
-	assert(utimensat(AT_FDCWD, fname, NULL, 0) == -1);
-	if (ENOENT != errno)
-		error_msg_and_skip("utimensat");
+	char *const fname = tail_memdup(proto_fname, sizeof(proto_fname));
+	const kernel_ulong_t kfname = (uintptr_t) fname;
+	struct timespec *const ts = tail_alloc(sizeof(*ts) * 2);
 
-	#define PREFIX "utimensat(AT_FDCWD, \"utimensat\\nfilename\", "
-	printf(PREFIX "NULL, 0) = -1 ENOENT (%m)\n");
+	(void) close(0);
 
-	struct timeval tv;
-	struct timespec ts[2];
+	/* dirfd */
+	k_utimensat(0, kfname, 0, 0);
+	printf("utimensat(0, %s, NULL, 0) = %s\n", qname, errstr);
 
-	if (gettimeofday(&tv, NULL))
-		perror_msg_and_skip("gettimeofday");
+	k_utimensat(bogus_fd, kfname, 0, 0);
+	printf("utimensat(%d, %s, NULL, 0) = %s\n",
+	       (int) bogus_fd, qname, errstr);
 
-	ts[0].tv_sec = tv.tv_sec;
-	ts[0].tv_nsec = tv.tv_usec;
-	ts[1].tv_sec = tv.tv_sec - 1;
-	ts[1].tv_nsec = tv.tv_usec + 1;
+	k_utimensat(-100U, kfname, 0, 0);
+	printf("utimensat(AT_FDCWD, %s, NULL, 0) = %s\n", qname, errstr);
 
-	printf(PREFIX "[");
+	k_utimensat(kfdcwd, kfname, 0, 0);
+	printf("utimensat(AT_FDCWD, %s, NULL, 0) = %s\n", qname, errstr);
+
+	/* pathname */
+	k_utimensat(kfdcwd, 0, 0, 0);
+	printf("utimensat(AT_FDCWD, NULL, NULL, 0) = %s\n", errstr);
+
+	k_utimensat(kfdcwd, kfname + sizeof(proto_fname) - 1, 0, 0);
+	printf("utimensat(AT_FDCWD, \"\", NULL, 0) = %s\n", errstr);
+
+	fname[sizeof(proto_fname) - 1] = '+';
+	k_utimensat(kfdcwd, kfname, 0, 0);
+	fname[sizeof(proto_fname) - 1] = '\0';
+	printf("utimensat(AT_FDCWD, %p, NULL, 0) = %s\n", fname, errstr);
+
+	if (F8ILL_KULONG_SUPPORTED) {
+		k_utimensat(kfdcwd, f8ill_ptr_to_kulong(fname), 0, 0);
+		printf("utimensat(AT_FDCWD, %#jx, NULL, 0) = %s\n",
+		       (uintmax_t) f8ill_ptr_to_kulong(fname), errstr);
+	}
+
+	/* times */
+	k_utimensat(kfdcwd, kfname, (uintptr_t) (ts + 1), 0);
+	printf("utimensat(AT_FDCWD, %s, %p, 0) = %s\n",
+	       qname, ts + 1, errstr);
+
+	k_utimensat(kfdcwd, kfname, (uintptr_t) (ts + 2), 0);
+	printf("utimensat(AT_FDCWD, %s, %p, 0)"
+	       " = %s\n", qname, ts + 2, errstr);
+
+	ts[0].tv_sec = 1492358706;
+	ts[0].tv_nsec = 123456789;
+	ts[1].tv_sec = 1492357068;
+	ts[1].tv_nsec = 234567890;
+
+	k_utimensat(kfdcwd, kfname, (uintptr_t) ts, 0x100);
+	printf("utimensat(AT_FDCWD, %s, [", qname);
 	print_ts(&ts[0]);
 	printf(", ");
 	print_ts(&ts[1]);
-	printf("], AT_SYMLINK_NOFOLLOW) = -1 ENOENT ");
+	printf("], AT_SYMLINK_NOFOLLOW) = %s\n", errstr);
 
-	assert(utimensat(AT_FDCWD, fname, ts, AT_SYMLINK_NOFOLLOW) == -1);
-	if (ENOENT != errno)
-		error_msg_and_skip("utimensat");
-	printf("(%m)\n");
+	ts[0].tv_sec = -1;
+	ts[0].tv_nsec = 2000000000;
+	ts[1].tv_sec = (time_t) -0x100000001LL;
+	ts[1].tv_nsec = 2345678900U;
+
+	k_utimensat(kfdcwd, kfname, (uintptr_t) ts, 0x100);
+	printf("utimensat(AT_FDCWD, %s, [", qname);
+	print_ts(&ts[0]);
+	printf(", ");
+	print_ts(&ts[1]);
+	printf("], AT_SYMLINK_NOFOLLOW) = %s\n", errstr);
+
+	ts[0].tv_sec = 0;
+	ts[0].tv_nsec = 0;
+	ts[1].tv_sec = (time_t) 0xcafef00ddeadbeefLL;
+	ts[1].tv_nsec = 0;
+
+	k_utimensat(kfdcwd, kfname, (uintptr_t) ts, 0x100);
+	printf("utimensat(AT_FDCWD, %s, [", qname);
+	print_ts(&ts[0]);
+	printf(", ");
+	print_ts(&ts[1]);
+	printf("], AT_SYMLINK_NOFOLLOW) = %s\n", errstr);
+
+	ts[0].tv_sec = 0xdeadbeefU;
+	ts[0].tv_nsec = 0xfacefeedU;
+	ts[1].tv_sec = (time_t) 0xcafef00ddeadbeefLL;
+	ts[1].tv_nsec = (long) 0xbadc0dedfacefeedLL;
+
+	k_utimensat(kfdcwd, kfname, (uintptr_t) ts, 0x100);
+	printf("utimensat(AT_FDCWD, %s, [", qname);
+	print_ts(&ts[0]);
+	printf(", ");
+	print_ts(&ts[1]);
+	printf("], AT_SYMLINK_NOFOLLOW) = %s\n", errstr);
 
 	ts[0].tv_nsec = UTIME_NOW;
 	ts[1].tv_nsec = UTIME_OMIT;
-	assert(utimensat(AT_FDCWD, fname, ts, AT_SYMLINK_NOFOLLOW) == -1);
-	if (ENOENT != errno)
-		error_msg_and_skip("utimensat");
-	printf(PREFIX "[UTIME_NOW, UTIME_OMIT], AT_SYMLINK_NOFOLLOW)"
-	       " = -1 ENOENT (%m)\n");
+	k_utimensat(kfdcwd, kfname, (uintptr_t) ts, 0x100);
+	printf("utimensat(AT_FDCWD, %s, [UTIME_NOW, UTIME_OMIT]"
+	       ", AT_SYMLINK_NOFOLLOW) = %s\n", qname, errstr);
+
+	if (F8ILL_KULONG_SUPPORTED) {
+		k_utimensat(kfdcwd, kfname, f8ill_ptr_to_kulong(ts), 0);
+		printf("utimensat(AT_FDCWD, %s, %#jx, 0) = %s\n",
+		       qname, (uintmax_t) f8ill_ptr_to_kulong(ts), errstr);
+	}
+
+	/* flags */
+	k_utimensat(kfdcwd, kfname, (uintptr_t) ts,
+		    (kernel_ulong_t) 0xdefaced00000200);
+	printf("utimensat(AT_FDCWD, %s, [UTIME_NOW, UTIME_OMIT]"
+	       ", AT_REMOVEDIR) = %s\n",
+	       qname, errstr);
+
+	k_utimensat(kfdcwd, kfname, (uintptr_t) ts,
+		    (kernel_ulong_t) 0xdefaced00000600);
+	printf("utimensat(AT_FDCWD, %s, [UTIME_NOW, UTIME_OMIT]"
+	       ", AT_REMOVEDIR|AT_SYMLINK_FOLLOW) = %s\n",
+	       qname, errstr);
+
+	k_utimensat(kfdcwd, kfname, (uintptr_t) ts, (kernel_ulong_t) -1ULL);
+	printf("utimensat(AT_FDCWD, %s, [UTIME_NOW, UTIME_OMIT]"
+	       ", AT_SYMLINK_NOFOLLOW|AT_REMOVEDIR|AT_SYMLINK_FOLLOW"
+	       "|AT_NO_AUTOMOUNT|AT_EMPTY_PATH|0xffffe0ff) = %s\n",
+	       qname, errstr);
 
 	puts("+++ exited with 0 +++");
 	return 0;
@@ -95,7 +202,6 @@
 
 #else
 
-SKIP_MAIN_UNDEFINED("HAVE_UTIMENSAT && AT_FDCWD && AT_SYMLINK_NOFOLLOW"
-		    " && UTIME_NOW && UTIME_OMIT")
+SKIP_MAIN_UNDEFINED("__NR_utimensat && UTIME_NOW && UTIME_OMIT")
 
 #endif
diff --git a/tests/utimensat.gen.test b/tests/utimensat.gen.test
new file mode 100755
index 0000000..a4d6656
--- /dev/null
+++ b/tests/utimensat.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (utimensat -a33); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a33
diff --git a/tests/utimensat.test b/tests/utimensat.test
deleted file mode 100755
index 52e3f31..0000000
--- a/tests/utimensat.test
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/sh
-
-# Check decoding of utimensat syscall.
-
-. "${srcdir=.}/init.sh"
-
-run_prog > /dev/null
-run_strace -e utimensat $args > "$OUT"
-
-check_prog grep
-LC_ALL=C grep -x "utimensat(.*" "$LOG" > /dev/null || {
-        rm -f "$OUT"
-        skip_ 'test executable does not use utimensat syscall'
-}
-
-match_diff "$LOG" "$OUT"
-
-rm -f "$OUT"
-
-exit 0
diff --git a/tests/utimes.c b/tests/utimes.c
index bbfa031..4bef1a6 100644
--- a/tests/utimes.c
+++ b/tests/utimes.c
@@ -1,7 +1,7 @@
 /*
  * Check decoding of utimes syscall.
  *
- * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 Dmitry V. Levin <[email protected]>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -32,50 +32,10 @@
 
 #ifdef __NR_utimes
 
-# include <stdint.h>
-# include <stdio.h>
-# include <sys/time.h>
-# include <unistd.h>
-
-int
-main(void)
-{
-	struct timeval tv;
-	if (gettimeofday(&tv, NULL))
-		perror_msg_and_fail("gettimeofday");
-
-	static const char sample[] = "utimes_sample";
-
-	long rc = syscall(__NR_utimes, sample, 0);
-	printf("utimes(\"%s\", NULL) = %ld %s (%m)\n",
-	       sample, rc, errno2name());
-
-	struct timeval *const ts = tail_alloc(sizeof(*ts) * 2);
-
-	ts[0].tv_sec = tv.tv_sec;
-	ts[0].tv_usec = tv.tv_usec;
-	ts[1].tv_sec = tv.tv_sec - 1;
-	ts[1].tv_usec = tv.tv_usec + 1;
-
-	rc = syscall(__NR_utimes, 0, ts + 2);
-	printf("utimes(NULL, %p) = %ld %s (%m)\n", ts + 2, rc, errno2name());
-
-	rc = syscall(__NR_utimes, 0, ts + 1);
-	printf("utimes(NULL, [{tv_sec=%jd, tv_usec=%jd}, %p]) = "
-	       "%ld %s (%m)\n",
-	       (intmax_t) ts[1].tv_sec, (intmax_t) ts[1].tv_usec,
-	       ts + 2, rc, errno2name());
-
-	rc = syscall(__NR_utimes, "", ts);
-	printf("utimes(\"\", [{tv_sec=%jd, tv_usec=%jd}, "
-	       "{tv_sec=%jd, tv_usec=%jd}]) = %ld %s (%m)\n",
-	       (intmax_t) ts[0].tv_sec, (intmax_t) ts[0].tv_usec,
-	       (intmax_t) ts[1].tv_sec, (intmax_t) ts[1].tv_usec,
-	       rc, errno2name());
-
-	puts("+++ exited with 0 +++");
-	return 0;
-}
+# define TEST_SYSCALL_NR	__NR_utimes
+# define TEST_SYSCALL_STR	"utimes"
+# define TEST_STRUCT		struct timeval
+# include "xutimes.c"
 
 #else
 
diff --git a/tests/utimes.gen.test b/tests/utimes.gen.test
new file mode 100755
index 0000000..37ed29c
--- /dev/null
+++ b/tests/utimes.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (utimes -a17); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a17
diff --git a/tests/utimes.test b/tests/utimes.test
deleted file mode 100755
index 99143a0..0000000
--- a/tests/utimes.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check utimes syscall decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a21
diff --git a/tests/vfork-f.gen.test b/tests/vfork-f.gen.test
new file mode 100755
index 0000000..b3c1c6b
--- /dev/null
+++ b/tests/vfork-f.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (vfork-f -a26 -qq -f -e signal=none -e trace=chdir); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a26 -qq -f -e signal=none -e trace=chdir
diff --git a/tests/vfork-f.test b/tests/vfork-f.test
deleted file mode 100755
index ff4422b..0000000
--- a/tests/vfork-f.test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Check how strace -f follows vfork syscall.
-
-. "${srcdir=.}/fork-f.test"
diff --git a/tests/vhangup.gen.test b/tests/vhangup.gen.test
new file mode 100755
index 0000000..7ac84e5
--- /dev/null
+++ b/tests/vhangup.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (vhangup -a10); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a10
diff --git a/tests/vhangup.test b/tests/vhangup.test
deleted file mode 100755
index 8fe1cac..0000000
--- a/tests/vhangup.test
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/sh
-
-# Check vhangup syscall decoding.
-
-. "${srcdir=.}/init.sh"
-
-run_strace_match_diff -a10
diff --git a/tests/vmsplice.gen.test b/tests/vmsplice.gen.test
new file mode 100755
index 0000000..fe6a07d
--- /dev/null
+++ b/tests/vmsplice.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (vmsplice -ewrite=1); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -ewrite=1
diff --git a/tests/vmsplice.test b/tests/vmsplice.test
deleted file mode 100755
index 8a80650..0000000
--- a/tests/vmsplice.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of vmsplice syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -ewrite=1
diff --git a/tests/wait4-v.gen.test b/tests/wait4-v.gen.test
new file mode 100755
index 0000000..5b23f42
--- /dev/null
+++ b/tests/wait4-v.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (wait4-v -v -e signal=none -e trace=wait4); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -v -e signal=none -e trace=wait4
diff --git a/tests/wait4-v.test b/tests/wait4-v.test
deleted file mode 100755
index 58e55f2..0000000
--- a/tests/wait4-v.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check verbose decoding of wait4 syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -v -e signal=none -e trace=wait4
diff --git a/tests/wait4.c b/tests/wait4.c
index ccb3ebb..ab0c7a4 100644
--- a/tests/wait4.c
+++ b/tests/wait4.c
@@ -2,6 +2,7 @@
  * Check decoding of wait4 syscall.
  *
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -40,8 +41,8 @@
 {
 	static char buf[1024];
 	snprintf(buf, sizeof(buf),
-		 "{ru_utime={tv_sec=%lu, tv_usec=%lu}"
-		 ", ru_stime={tv_sec=%lu, tv_usec=%lu}"
+		 "{ru_utime={tv_sec=%lld, tv_usec=%llu}"
+		 ", ru_stime={tv_sec=%lld, tv_usec=%llu}"
 #if VERBOSE
 		 ", ru_maxrss=%lu"
 		 ", ru_ixrss=%lu"
@@ -60,10 +61,10 @@
 #else
 		 ", ...}"
 #endif
-		 , (long) ru->ru_utime.tv_sec
-		 , (long) ru->ru_utime.tv_usec
-		 , (long) ru->ru_stime.tv_sec
-		 , (long) ru->ru_stime.tv_usec
+		 , (long long) ru->ru_utime.tv_sec
+		 , zero_extend_signed_to_ull(ru->ru_utime.tv_usec)
+		 , (long long) ru->ru_stime.tv_sec
+		 , zero_extend_signed_to_ull(ru->ru_stime.tv_usec)
 #if VERBOSE
 		 , (long) ru->ru_maxrss
 		 , (long) ru->ru_ixrss
@@ -119,12 +120,12 @@
 
 	(void) close(0);
 
-	int *const s = tail_alloc(sizeof(*s));
+	TAIL_ALLOC_OBJECT_CONST_PTR(int, s);
 	if (wait4(pid, s, WNOHANG|__WALL, NULL))
 		perror_msg_and_fail("wait4 #1");
 	tprintf("wait4(%d, %p, WNOHANG|__WALL, NULL) = 0\n", pid, s);
 
-	struct rusage *const rusage = tail_alloc(sizeof(*rusage));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct rusage, rusage);
 	if (wait4(pid, s, WNOHANG|__WALL, rusage))
 		perror_msg_and_fail("wait4 #2");
 	tprintf("wait4(%d, %p, WNOHANG|__WALL, %p) = 0\n", pid, s, rusage);
diff --git a/tests/wait4.gen.test b/tests/wait4.gen.test
new file mode 100755
index 0000000..ae04915
--- /dev/null
+++ b/tests/wait4.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (wait4 -esignal=none); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -esignal=none
diff --git a/tests/wait4.test b/tests/wait4.test
deleted file mode 100755
index 6338d1f..0000000
--- a/tests/wait4.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of wait4 syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -esignal=none
diff --git a/tests/waitid-v.gen.test b/tests/waitid-v.gen.test
new file mode 100755
index 0000000..45744cd
--- /dev/null
+++ b/tests/waitid-v.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (waitid-v -v -e signal=none -e trace=waitid); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -v -e signal=none -e trace=waitid
diff --git a/tests/waitid-v.test b/tests/waitid-v.test
deleted file mode 100755
index eb498cb..0000000
--- a/tests/waitid-v.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check verbose decoding of waitid syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -v -e signal=none -e trace=waitid
diff --git a/tests/waitid.c b/tests/waitid.c
index 6a10299..b56feea 100644
--- a/tests/waitid.c
+++ b/tests/waitid.c
@@ -2,6 +2,7 @@
  * Check decoding of waitid syscall.
  *
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -42,8 +43,8 @@
 {
 	static char buf[1024];
 	snprintf(buf, sizeof(buf),
-		 "{ru_utime={tv_sec=%lld, tv_usec=%lld}"
-		 ", ru_stime={tv_sec=%lld, tv_usec=%lld}"
+		 "{ru_utime={tv_sec=%lld, tv_usec=%llu}"
+		 ", ru_stime={tv_sec=%lld, tv_usec=%llu}"
 #if VERBOSE
 		 ", ru_maxrss=%llu"
 		 ", ru_ixrss=%llu"
@@ -63,9 +64,9 @@
 		 ", ...}"
 #endif
 		 , (long long) ru->ru_utime.tv_sec
-		 , (long long) ru->ru_utime.tv_usec
+		 , zero_extend_signed_to_ull(ru->ru_utime.tv_usec)
 		 , (long long) ru->ru_stime.tv_sec
-		 , (long long) ru->ru_stime.tv_usec
+		 , zero_extend_signed_to_ull(ru->ru_stime.tv_usec)
 #if VERBOSE
 		 , zero_extend_signed_to_ull(ru->ru_maxrss)
 		 , zero_extend_signed_to_ull(ru->ru_ixrss)
@@ -185,9 +186,9 @@
 		perror_msg_and_fail("waitid #1");
 	tprintf("waitid(P_PID, %d, NULL, WNOHANG|WEXITED, NULL) = 0\n", pid);
 
-	siginfo_t *const sinfo = tail_alloc(sizeof(*sinfo));
+	TAIL_ALLOC_OBJECT_CONST_PTR(siginfo_t, sinfo);
 	memset(sinfo, 0, sizeof(*sinfo));
-	struct rusage *const rusage = tail_alloc(sizeof(*rusage));
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct rusage, rusage);
 	if (do_waitid(P_PID, pid, sinfo, WNOHANG|WEXITED|WSTOPPED, rusage))
 		perror_msg_and_fail("waitid #2");
 	tprintf("waitid(P_PID, %d, {}, WNOHANG|WEXITED|WSTOPPED, %s) = 0\n",
diff --git a/tests/waitid.gen.test b/tests/waitid.gen.test
new file mode 100755
index 0000000..59f4022
--- /dev/null
+++ b/tests/waitid.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (waitid -esignal=none); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -esignal=none
diff --git a/tests/waitid.test b/tests/waitid.test
deleted file mode 100755
index 3bcba3a..0000000
--- a/tests/waitid.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of waitid syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -esignal=none
diff --git a/tests/waitpid.gen.test b/tests/waitpid.gen.test
new file mode 100755
index 0000000..d91e298
--- /dev/null
+++ b/tests/waitpid.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (waitpid -a28); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a28
diff --git a/tests/waitpid.test b/tests/waitpid.test
deleted file mode 100755
index 93807d1..0000000
--- a/tests/waitpid.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check decoding of waitpid syscall.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a28
diff --git a/tests/xattr-strings.gen.test b/tests/xattr-strings.gen.test
new file mode 100755
index 0000000..3317892
--- /dev/null
+++ b/tests/xattr-strings.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (xattr-strings -a22 -s 4 -e trace=fsetxattr); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a22 -s 4 -e trace=fsetxattr
diff --git a/tests/xattr-strings.test b/tests/xattr-strings.test
deleted file mode 100755
index 25ef360..0000000
--- a/tests/xattr-strings.test
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/sh
-
-# Check *xattr syscalls decoding when limiting string size.
-
-. "${srcdir=.}/init.sh"
-
-run_strace_match_diff -a22 -s 4 -e trace=fsetxattr
diff --git a/tests/xattr.gen.test b/tests/xattr.gen.test
new file mode 100755
index 0000000..030f2ce
--- /dev/null
+++ b/tests/xattr.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (xattr -a22 -e trace=getxattr,fgetxattr,lgetxattr,setxattr,fsetxattr,lsetxattr,listxattr,flistxattr,llistxattr,removexattr,fremovexattr,lremovexattr); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a22 -e trace=getxattr,fgetxattr,lgetxattr,setxattr,fsetxattr,lsetxattr,listxattr,flistxattr,llistxattr,removexattr,fremovexattr,lremovexattr
diff --git a/tests/xattr.test b/tests/xattr.test
deleted file mode 100755
index 8c7a87b..0000000
--- a/tests/xattr.test
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-
-# Check *xattr syscalls decoding.
-
-. "${srcdir=.}/init.sh"
-
-syscalls=
-for n in getxattr setxattr listxattr removexattr; do
-	syscalls="$syscalls,${n},f${n},l${n}"
-done
-
-run_strace_match_diff -a22 -e trace=$syscalls
diff --git a/tests/xet_robust_list.c b/tests/xet_robust_list.c
index 211dec4..a612b92 100644
--- a/tests/xet_robust_list.c
+++ b/tests/xet_robust_list.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -51,8 +52,8 @@
 {
 	const pid_t pid = getpid();
 	const long long_pid = (unsigned long) (0xdeadbeef00000000LL | pid);
-	void **p_head = tail_alloc(sizeof(void *));
-	size_t *p_len = tail_alloc(sizeof(size_t));
+	TAIL_ALLOC_OBJECT_CONST_PTR(void *, p_head);
+	TAIL_ALLOC_OBJECT_CONST_PTR(size_t, p_len);
 
 	if (syscall(__NR_get_robust_list, long_pid, p_head, p_len))
 		perror_msg_and_skip("get_robust_list");
diff --git a/tests/xet_robust_list.gen.test b/tests/xet_robust_list.gen.test
new file mode 100755
index 0000000..798cdff
--- /dev/null
+++ b/tests/xet_robust_list.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (xet_robust_list -a24 -e trace=get_robust_list,set_robust_list); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a24 -e trace=get_robust_list,set_robust_list
diff --git a/tests/xet_robust_list.test b/tests/xet_robust_list.test
deleted file mode 100755
index 8a3a382..0000000
--- a/tests/xet_robust_list.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check get_robust_list and set_robust_list syscalls decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a24 -e trace=get_robust_list,set_robust_list
diff --git a/tests/xetitimer.c b/tests/xetitimer.c
index 4b17edd..3a81880 100644
--- a/tests/xetitimer.c
+++ b/tests/xetitimer.c
@@ -1,5 +1,7 @@
 /*
- * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Check decoding of setitimer and getitimer syscalls.
+ *
+ * Copyright (c) 2015-2017 Dmitry V. Levin <[email protected]>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -29,48 +31,153 @@
 #include <stdio.h>
 #include <stdint.h>
 #include <sys/time.h>
+#include <unistd.h>
+#include <asm/unistd.h>
 
 int
 main(void)
 {
-	struct {
-		struct itimerval itv;
-		uint32_t pad[4];
-	} old = {
-		.pad = { 0xdeadbeef, 0xbadc0ded, 0xdeadbeef, 0xbadc0ded }
-	}, new = {
-		.itv = {
-			.it_interval = { 0xc0de1, 0xc0de2 },
-			.it_value = { 0xc0de3, 0xc0de4 }
-		},
-		.pad = { 0xdeadbeef, 0xbadc0ded, 0xdeadbeef, 0xbadc0ded }
+	static const struct itimerval new = {
+		.it_interval = { 0xc0de1, 0xc0de2 },
+		.it_value = { 0xc0de3, 0xc0de4 }
 	};
+	static const kernel_ulong_t long_timer =
+		F8ILL_KULONG_MASK | ITIMER_REAL;
+	static const kernel_ulong_t bogus_timer =
+		(kernel_ulong_t) 0xfacefeeddeadbeefULL;
 
-	if (setitimer(ITIMER_REAL, &new.itv, &old.itv))
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct itimerval, p_old);
+	struct itimerval *const p_new = tail_memdup(&new, sizeof(new));
+	void *const efault = tail_alloc(sizeof(new) - 8);
+	long rc;
+
+	if (setitimer(ITIMER_REAL, p_new, NULL))
 		perror_msg_and_skip("setitimer");
 	printf("setitimer(ITIMER_REAL"
-	       ", {it_interval={tv_sec=%jd, tv_usec=%jd}, "
-	       "it_value={tv_sec=%jd, tv_usec=%jd}}"
-	       ", {it_interval={tv_sec=%jd, tv_usec=%jd}, "
-	       "it_value={tv_sec=%jd, tv_usec=%jd}}) = 0\n",
-	       (intmax_t) new.itv.it_interval.tv_sec,
-	       (intmax_t) new.itv.it_interval.tv_usec,
-	       (intmax_t) new.itv.it_value.tv_sec,
-	       (intmax_t) new.itv.it_value.tv_usec,
-	       (intmax_t) old.itv.it_interval.tv_sec,
-	       (intmax_t) old.itv.it_interval.tv_usec,
-	       (intmax_t) old.itv.it_value.tv_sec,
-	       (intmax_t) old.itv.it_value.tv_usec);
+	       ", {it_interval={tv_sec=%lld, tv_usec=%llu}"
+	       ", it_value={tv_sec=%lld, tv_usec=%llu}}"
+	       ", NULL) = 0\n",
+	       (long long) new.it_interval.tv_sec,
+	       zero_extend_signed_to_ull(new.it_interval.tv_usec),
+	       (long long) new.it_value.tv_sec,
+	       zero_extend_signed_to_ull(new.it_value.tv_usec));
 
-	if (getitimer(ITIMER_REAL, &old.itv))
+	fill_memory(p_old, sizeof(*p_old));
+	if (getitimer(ITIMER_REAL, p_old))
 		perror_msg_and_skip("getitimer");
 	printf("getitimer(ITIMER_REAL"
-	       ", {it_interval={tv_sec=%jd, tv_usec=%jd}, "
-	       "it_value={tv_sec=%jd, tv_usec=%jd}}) = 0\n",
-	       (intmax_t) old.itv.it_interval.tv_sec,
-	       (intmax_t) old.itv.it_interval.tv_usec,
-	       (intmax_t) old.itv.it_value.tv_sec,
-	       (intmax_t) old.itv.it_value.tv_usec);
+	       ", {it_interval={tv_sec=%lld, tv_usec=%llu}"
+	       ", it_value={tv_sec=%lld, tv_usec=%llu}}) = 0\n",
+	       (long long) p_old->it_interval.tv_sec,
+	       zero_extend_signed_to_ull(p_old->it_interval.tv_usec),
+	       (long long) p_old->it_value.tv_sec,
+	       zero_extend_signed_to_ull(p_old->it_value.tv_usec));
+
+	fill_memory(p_old, sizeof(*p_old));
+	setitimer(ITIMER_REAL, p_new, p_old);
+	printf("setitimer(ITIMER_REAL"
+	       ", {it_interval={tv_sec=%lld, tv_usec=%llu}"
+	       ", it_value={tv_sec=%lld, tv_usec=%llu}}"
+	       ", {it_interval={tv_sec=%lld, tv_usec=%llu}"
+	       ", it_value={tv_sec=%lld, tv_usec=%llu}}) = 0\n",
+	       (long long) new.it_interval.tv_sec,
+	       zero_extend_signed_to_ull(new.it_interval.tv_usec),
+	       (long long) new.it_value.tv_sec,
+	       zero_extend_signed_to_ull(new.it_value.tv_usec),
+	       (long long) p_old->it_interval.tv_sec,
+	       zero_extend_signed_to_ull(p_old->it_interval.tv_usec),
+	       (long long) p_old->it_value.tv_sec,
+	       zero_extend_signed_to_ull(p_old->it_value.tv_usec));
+
+	rc = getitimer(ITIMER_REAL, efault);
+	printf("getitimer(ITIMER_REAL, %p) = %s\n", efault, sprintrc(rc));
+
+	rc = setitimer(ITIMER_REAL, p_new, efault);
+	printf("setitimer(ITIMER_REAL"
+	       ", {it_interval={tv_sec=%lld, tv_usec=%llu}"
+	       ", it_value={tv_sec=%lld, tv_usec=%llu}}, %p) = %s\n",
+	       (long long) new.it_interval.tv_sec,
+	       zero_extend_signed_to_ull(new.it_interval.tv_usec),
+	       (long long) new.it_value.tv_sec,
+	       zero_extend_signed_to_ull(new.it_value.tv_usec),
+	       efault, sprintrc(rc));
+
+	rc = setitimer(ITIMER_REAL, efault, p_old);
+	printf("setitimer(ITIMER_REAL, %p, %p) = %s\n",
+	       efault, p_old, sprintrc(rc));
+
+	fill_memory(p_old, sizeof(*p_old));
+	rc = syscall(__NR_setitimer, long_timer, p_new, p_old);
+	printf("setitimer(ITIMER_REAL"
+	       ", {it_interval={tv_sec=%lld, tv_usec=%llu}"
+	       ", it_value={tv_sec=%lld, tv_usec=%llu}}"
+	       ", {it_interval={tv_sec=%lld, tv_usec=%llu}"
+	       ", it_value={tv_sec=%lld, tv_usec=%llu}}) = %s\n",
+	       (long long) new.it_interval.tv_sec,
+	       zero_extend_signed_to_ull(new.it_interval.tv_usec),
+	       (long long) new.it_value.tv_sec,
+	       zero_extend_signed_to_ull(new.it_value.tv_usec),
+	       (long long) p_old->it_interval.tv_sec,
+	       zero_extend_signed_to_ull(p_old->it_interval.tv_usec),
+	       (long long) p_old->it_value.tv_sec,
+	       zero_extend_signed_to_ull(p_old->it_value.tv_usec),
+	       sprintrc(rc));
+
+	fill_memory(p_old, sizeof(*p_old));
+	rc = syscall(__NR_getitimer, long_timer, p_old);
+	printf("getitimer(ITIMER_REAL"
+	       ", {it_interval={tv_sec=%lld, tv_usec=%llu}"
+	       ", it_value={tv_sec=%lld, tv_usec=%llu}}) = %s\n",
+	       (long long) p_old->it_interval.tv_sec,
+	       zero_extend_signed_to_ull(p_old->it_interval.tv_usec),
+	       (long long) p_old->it_value.tv_sec,
+	       zero_extend_signed_to_ull(p_old->it_value.tv_usec),
+	       sprintrc(rc));
+
+	rc = syscall(__NR_setitimer, bogus_timer, p_new, p_old);
+	printf("setitimer(%#x /* ITIMER_??? */"
+	       ", {it_interval={tv_sec=%lld, tv_usec=%llu}"
+	       ", it_value={tv_sec=%lld, tv_usec=%llu}}, %p) = %s\n",
+	       (int) bogus_timer,
+	       (long long) new.it_interval.tv_sec,
+	       zero_extend_signed_to_ull(new.it_interval.tv_usec),
+	       (long long) new.it_value.tv_sec,
+	       zero_extend_signed_to_ull(new.it_value.tv_usec),
+	       p_old, sprintrc(rc));
+
+	rc = syscall(__NR_getitimer, bogus_timer, p_old);
+	printf("getitimer(%#x /* ITIMER_??? */, %p) = %s\n",
+	       (int) bogus_timer, p_old, sprintrc(rc));
+
+	if (F8ILL_KULONG_SUPPORTED) {
+		const kernel_ulong_t ill_new = f8ill_ptr_to_kulong(p_new);
+		const kernel_ulong_t ill_old = f8ill_ptr_to_kulong(p_old);
+
+		rc = syscall(__NR_setitimer, long_timer, ill_new, ill_old);
+		printf("setitimer(ITIMER_REAL, %#llx, %#llx) = %s\n",
+		       (unsigned long long) ill_new,
+		       (unsigned long long) ill_old,
+		       sprintrc(rc));
+
+		rc = syscall(__NR_getitimer, long_timer, ill_old);
+		printf("getitimer(ITIMER_REAL, %#llx) = %s\n",
+		       (unsigned long long) ill_old, sprintrc(rc));
+	}
+
+	p_new->it_interval.tv_sec = 0xdeadbeefU;
+	p_new->it_interval.tv_usec = 0xfacefeedU;
+	p_new->it_value.tv_sec = (time_t) 0xcafef00ddeadbeefLL;
+	p_new->it_value.tv_usec = (long) 0xbadc0dedfacefeedLL;
+
+	rc = setitimer(ITIMER_REAL, p_new, p_old);
+	printf("setitimer(ITIMER_REAL"
+	       ", {it_interval={tv_sec=%lld, tv_usec=%llu}"
+	       ", it_value={tv_sec=%lld, tv_usec=%llu}}, %p) = %s\n",
+	       (long long) p_new->it_interval.tv_sec,
+	       zero_extend_signed_to_ull(p_new->it_interval.tv_usec),
+	       (long long) p_new->it_value.tv_sec,
+	       zero_extend_signed_to_ull(p_new->it_value.tv_usec),
+	       p_old, sprintrc(rc));
 
 	puts("+++ exited with 0 +++");
 	return 0;
diff --git a/tests/xetitimer.gen.test b/tests/xetitimer.gen.test
new file mode 100755
index 0000000..0cdb926
--- /dev/null
+++ b/tests/xetitimer.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (xetitimer -a29 -e trace=setitimer,getitimer); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a29 -e trace=setitimer,getitimer
diff --git a/tests/xetitimer.test b/tests/xetitimer.test
deleted file mode 100755
index 4aa00cc..0000000
--- a/tests/xetitimer.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check setitimer and getitimer syscalls decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -e trace=setitimer,getitimer
diff --git a/tests/xetpgid.c b/tests/xetpgid.c
index 24e0d7f..0efffcb 100644
--- a/tests/xetpgid.c
+++ b/tests/xetpgid.c
@@ -2,6 +2,7 @@
  * This file is part of xetpgid strace test.
  *
  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -39,13 +40,10 @@
 main(void)
 {
 	const int pid = getpid();
-	long rc = syscall(__NR_getpgid,
-			  (unsigned long) 0xffffffff00000000ULL | pid);
+	long rc = syscall(__NR_getpgid, F8ILL_KULONG_MASK | pid);
 	printf("getpgid(%d) = %ld\n", pid, rc);
 
-	rc = syscall(__NR_setpgid,
-		     (unsigned long) 0xffffffff00000000ULL,
-		     (unsigned long) 0xffffffff00000000ULL | pid);
+	rc = syscall(__NR_setpgid, F8ILL_KULONG_MASK, F8ILL_KULONG_MASK | pid);
 	printf("setpgid(0, %d) = %ld\n", pid, rc);
 
 	puts("+++ exited with 0 +++");
diff --git a/tests/xetpgid.gen.test b/tests/xetpgid.gen.test
new file mode 100755
index 0000000..fc57fc4
--- /dev/null
+++ b/tests/xetpgid.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (xetpgid -a11 -e trace=getpgid,setpgid); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a11 -e trace=getpgid,setpgid
diff --git a/tests/xetpgid.test b/tests/xetpgid.test
deleted file mode 100755
index 07f4f9e..0000000
--- a/tests/xetpgid.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check getpgid and setpgid syscalls decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a11 -e trace=getpgid,setpgid
diff --git a/tests/xetpriority.c b/tests/xetpriority.c
index ed55259..30c59c8 100644
--- a/tests/xetpriority.c
+++ b/tests/xetpriority.c
@@ -12,12 +12,11 @@
 {
 	const int pid = getpid();
 	long rc = syscall(__NR_getpriority, PRIO_PROCESS,
-			  (unsigned long) 0xffffffff00000000ULL | pid);
+			  F8ILL_KULONG_MASK | pid);
 	printf("getpriority(PRIO_PROCESS, %d) = %ld\n", pid, rc);
 
 	rc = syscall(__NR_setpriority, PRIO_PROCESS,
-		     (unsigned long) 0xffffffff00000000ULL | pid,
-		     (unsigned long) 0xffffffff00000000ULL);
+		     F8ILL_KULONG_MASK | pid, F8ILL_KULONG_MASK);
 	printf("setpriority(PRIO_PROCESS, %d, 0) = %s\n", pid, sprintrc(rc));
 
 	puts("+++ exited with 0 +++");
diff --git a/tests/xetpriority.gen.test b/tests/xetpriority.gen.test
new file mode 100755
index 0000000..4b95524
--- /dev/null
+++ b/tests/xetpriority.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (xetpriority -a29 -e trace=getpriority,setpriority); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a29 -e trace=getpriority,setpriority
diff --git a/tests/xetpriority.test b/tests/xetpriority.test
deleted file mode 100755
index 2c84ba4..0000000
--- a/tests/xetpriority.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check getpriority and setpriority syscalls decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a29 -e trace=getpriority,setpriority
diff --git a/tests/xettimeofday.c b/tests/xettimeofday.c
index d36c57b..ec422cf 100644
--- a/tests/xettimeofday.c
+++ b/tests/xettimeofday.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -36,36 +37,49 @@
 int
 main(void)
 {
-	struct {
-		struct timeval tv;
-		uint32_t pad0[2];
-		struct timezone tz;
-		uint32_t pad1[2];
-	} t = {
-		.pad0 = { 0xdeadbeef, 0xbadc0ded },
-		.pad1 = { 0xdeadbeef, 0xbadc0ded }
-	};
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct timeval, tv);
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct timezone, tz);
 
-	if (syscall(__NR_gettimeofday, &t.tv, NULL))
+	if (syscall(__NR_gettimeofday, tv, NULL))
 		perror_msg_and_skip("gettimeofday");
-	printf("gettimeofday({tv_sec=%jd, tv_usec=%jd}, NULL) = 0\n",
-	       (intmax_t) t.tv.tv_sec, (intmax_t) t.tv.tv_usec);
+	printf("gettimeofday({tv_sec=%lld, tv_usec=%llu}, NULL) = 0\n",
+	       (long long) tv->tv_sec,
+	       zero_extend_signed_to_ull(tv->tv_usec));
 
-	if (syscall(__NR_gettimeofday, &t.tv, &t.tz))
+	if (syscall(__NR_gettimeofday, tv, tz))
 		perror_msg_and_skip("gettimeofday");
-	printf("gettimeofday({tv_sec=%jd, tv_usec=%jd}"
+	printf("gettimeofday({tv_sec=%lld, tv_usec=%llu}"
 	       ", {tz_minuteswest=%d, tz_dsttime=%d}) = 0\n",
-	       (intmax_t) t.tv.tv_sec, (intmax_t) t.tv.tv_usec,
-	       t.tz.tz_minuteswest, t.tz.tz_dsttime);
+	       (long long) tv->tv_sec,
+	       zero_extend_signed_to_ull(tv->tv_usec),
+	       tz->tz_minuteswest, tz->tz_dsttime);
 
-	t.tv.tv_sec = -1;
-	t.tv.tv_usec = 1000000000;
-	assert(syscall(__NR_settimeofday, &t.tv, &t.tz) == -1);
-	printf("settimeofday({tv_sec=%jd, tv_usec=%jd}"
-	       ", {tz_minuteswest=%d, tz_dsttime=%d})"
-	       " = -1 EINVAL (%m)\n",
-	       (intmax_t) t.tv.tv_sec, (intmax_t) t.tv.tv_usec,
-	       t.tz.tz_minuteswest, t.tz.tz_dsttime);
+	tv->tv_sec = -1;
+	tv->tv_usec = 1000000;
+	assert(syscall(__NR_settimeofday, tv, tz) == -1);
+	printf("settimeofday({tv_sec=%lld, tv_usec=%llu}"
+	       ", {tz_minuteswest=%d, tz_dsttime=%d}) = -1 EINVAL (%m)\n",
+	       (long long) tv->tv_sec,
+	       zero_extend_signed_to_ull(tv->tv_usec),
+	       tz->tz_minuteswest, tz->tz_dsttime);
+
+	tv->tv_sec = 0xdeadbeefU;
+	tv->tv_usec = 0xfacefeedU;
+	assert(syscall(__NR_settimeofday, tv, tz) == -1);
+	printf("settimeofday({tv_sec=%lld, tv_usec=%llu}"
+	       ", {tz_minuteswest=%d, tz_dsttime=%d}) = -1 EINVAL (%m)\n",
+	       (long long) tv->tv_sec,
+	       zero_extend_signed_to_ull(tv->tv_usec),
+	       tz->tz_minuteswest, tz->tz_dsttime);
+
+	tv->tv_sec = (time_t) 0xcafef00ddeadbeefLL;
+	tv->tv_usec = (long) 0xbadc0dedfacefeedLL;
+	assert(syscall(__NR_settimeofday, tv, tz) == -1);
+	printf("settimeofday({tv_sec=%lld, tv_usec=%llu}"
+	       ", {tz_minuteswest=%d, tz_dsttime=%d}) = -1 EINVAL (%m)\n",
+	       (long long) tv->tv_sec,
+	       zero_extend_signed_to_ull(tv->tv_usec),
+	       tz->tz_minuteswest, tz->tz_dsttime);
 
 	puts("+++ exited with 0 +++");
 	return 0;
diff --git a/tests/xettimeofday.gen.test b/tests/xettimeofday.gen.test
new file mode 100755
index 0000000..1a021e4
--- /dev/null
+++ b/tests/xettimeofday.gen.test
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (xettimeofday -a20 -e trace=gettimeofday,settimeofday); do not edit.
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a20 -e trace=gettimeofday,settimeofday
diff --git a/tests/xettimeofday.test b/tests/xettimeofday.test
deleted file mode 100755
index 68764e4..0000000
--- a/tests/xettimeofday.test
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-# Check gettimeofday and settimeofday syscalls decoding.
-
-. "${srcdir=.}/init.sh"
-run_strace_match_diff -a20 -e trace=gettimeofday,settimeofday
diff --git a/tests/xselect.c b/tests/xselect.c
index 39e87ac..e1638c8 100644
--- a/tests/xselect.c
+++ b/tests/xselect.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -31,6 +32,7 @@
 
 #include <assert.h>
 #include <stdio.h>
+#include <string.h>
 #include <unistd.h>
 #include <sys/select.h>
 
@@ -38,14 +40,10 @@
 
 int main(void)
 {
+	TAIL_ALLOC_OBJECT_CONST_PTR(struct timeval, tv);
+	struct timeval tv_in;
 	int fds[2];
-	struct {
-		struct timeval tv;
-		int pad[2];
-	} tm_in = {
-		.tv = { .tv_sec = 0xc0de1, .tv_usec = 0xc0de2 },
-		.pad = { 0xdeadbeef, 0xbadc0ded }
-	}, tm = tm_in;
+	long rc;
 
 	if (pipe(fds))
 		perror_msg_and_fail("pipe");
@@ -56,7 +54,7 @@
 	FD_ZERO(set);
 	FD_SET(fds[0], set);
 	FD_SET(fds[1], set);
-	int rc = syscall(TEST_SYSCALL_NR, fds[1] + 1, set, set, set, NULL);
+	rc = syscall(TEST_SYSCALL_NR, fds[1] + 1, set, set, set, NULL);
 	if (rc < 0)
 		perror_msg_and_skip(TEST_SYSCALL_STR);
 	assert(rc == 1);
@@ -65,19 +63,73 @@
 	       fds[0], fds[1], fds[0], fds[1]);
 
 	/*
+	 * Odd timeout.
+	 */
+	FD_SET(fds[0], set);
+	FD_SET(fds[1], set);
+	tv->tv_sec = 0xdeadbeefU;
+	tv->tv_usec = 0xfacefeedU;
+	memcpy(&tv_in, tv, sizeof(tv_in));
+	rc = syscall(TEST_SYSCALL_NR, fds[1] + 1, set, set, set, tv);
+	if (rc < 0) {
+		printf("%s(%d, [%d %d], [%d %d], [%d %d]"
+		       ", {tv_sec=%lld, tv_usec=%llu}) = %s\n",
+		       TEST_SYSCALL_STR, fds[1] + 1, fds[0], fds[1],
+		       fds[0], fds[1], fds[0], fds[1], (long long) tv->tv_sec,
+		       zero_extend_signed_to_ull(tv->tv_usec), sprintrc(rc));
+	} else {
+		printf("%s(%d, [%d %d], [%d %d], [%d %d]"
+		       ", {tv_sec=%lld, tv_usec=%llu}) = %ld"
+		       " (left {tv_sec=%lld, tv_usec=%llu})\n",
+		       TEST_SYSCALL_STR, fds[1] + 1, fds[0], fds[1],
+		       fds[0], fds[1], fds[0], fds[1], (long long) tv_in.tv_sec,
+		       zero_extend_signed_to_ull(tv_in.tv_usec),
+		       rc, (long long) tv->tv_sec,
+		       zero_extend_signed_to_ull(tv->tv_usec));
+	}
+
+	FD_SET(fds[0], set);
+	FD_SET(fds[1], set);
+	tv->tv_sec = (time_t) 0xcafef00ddeadbeefLL;
+	tv->tv_usec = (long) 0xbadc0dedfacefeedLL;
+	memcpy(&tv_in, tv, sizeof(tv_in));
+	rc = syscall(TEST_SYSCALL_NR, fds[1] + 1, set, set, set, tv);
+	if (rc < 0) {
+		printf("%s(%d, [%d %d], [%d %d], [%d %d]"
+		       ", {tv_sec=%lld, tv_usec=%llu}) = %s\n",
+		       TEST_SYSCALL_STR, fds[1] + 1, fds[0], fds[1],
+		       fds[0], fds[1], fds[0], fds[1], (long long) tv->tv_sec,
+		       zero_extend_signed_to_ull(tv->tv_usec), sprintrc(rc));
+	} else {
+		printf("%s(%d, [%d %d], [%d %d], [%d %d]"
+		       ", {tv_sec=%lld, tv_usec=%llu}) = %ld"
+		       " (left {tv_sec=%lld, tv_usec=%llu})\n",
+		       TEST_SYSCALL_STR, fds[1] + 1, fds[0], fds[1],
+		       fds[0], fds[1], fds[0], fds[1], (long long) tv_in.tv_sec,
+		       zero_extend_signed_to_ull(tv_in.tv_usec),
+		       rc, (long long) tv->tv_sec,
+		       zero_extend_signed_to_ull(tv->tv_usec));
+	}
+
+	/*
 	 * Another simple one, with a timeout.
 	 */
 	FD_SET(1, set);
 	FD_SET(2, set);
 	FD_SET(fds[0], set);
 	FD_SET(fds[1], set);
-	assert(syscall(TEST_SYSCALL_NR, fds[1] + 1, NULL, set, NULL, &tm.tv) == 3);
-	printf("%s(%d, NULL, [1 2 %d %d], NULL, {tv_sec=%lld, tv_usec=%lld})"
-	       " = 3 (out [1 2 %d], left {tv_sec=%lld, tv_usec=%lld})\n",
+	tv->tv_sec = 0xc0de1;
+	tv->tv_usec = 0xc0de2;
+	memcpy(&tv_in, tv, sizeof(tv_in));
+	assert(syscall(TEST_SYSCALL_NR, fds[1] + 1, NULL, set, NULL, tv) == 3);
+	printf("%s(%d, NULL, [1 2 %d %d], NULL, {tv_sec=%lld, tv_usec=%llu})"
+	       " = 3 (out [1 2 %d], left {tv_sec=%lld, tv_usec=%llu})\n",
 	       TEST_SYSCALL_STR, fds[1] + 1, fds[0], fds[1],
-	       (long long) tm_in.tv.tv_sec, (long long) tm_in.tv.tv_usec,
+	       (long long) tv_in.tv_sec,
+	       zero_extend_signed_to_ull(tv_in.tv_usec),
 	       fds[1],
-	       (long long) tm.tv.tv_sec, (long long) tm.tv.tv_usec);
+	       (long long) tv->tv_sec,
+	       zero_extend_signed_to_ull(tv->tv_usec));
 
 	/*
 	 * Now the crash case that trinity found, negative nfds
@@ -94,9 +146,9 @@
 	 */
 	FD_ZERO(set);
 	FD_SET(fds[0],set);
-	tm.tv.tv_sec = 0;
-	tm.tv.tv_usec = 123;
-	assert(syscall(TEST_SYSCALL_NR, FD_SETSIZE + 1, set, set + 1, NULL, &tm.tv) == 0);
+	tv->tv_sec = 0;
+	tv->tv_usec = 123;
+	assert(syscall(TEST_SYSCALL_NR, FD_SETSIZE + 1, set, set + 1, NULL, tv) == 0);
 	printf("%s(%d, [%d], [], NULL, {tv_sec=0, tv_usec=123}) = 0 (Timeout)\n",
 	       TEST_SYSCALL_STR, FD_SETSIZE + 1, fds[0]);
 
diff --git a/tests/xstatfsx.c b/tests/xstatfsx.c
index d8288f1..cb524ff 100644
--- a/tests/xstatfsx.c
+++ b/tests/xstatfsx.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -62,9 +63,9 @@
 {
 	int fd = open(sample, O_RDONLY);
 	if (fd < 0)
-		perror_msg_and_fail("open: %s", sample);
+		perror_msg_and_skip("open: %s", sample);
 
-	STRUCT_STATFS *const b = tail_alloc(sizeof(*b));
+	TAIL_ALLOC_OBJECT_CONST_PTR(STRUCT_STATFS, b);
 	long rc = SYSCALL_INVOKE(sample, fd, b, sizeof(*b));
 	if (rc)
 		perror_msg_and_skip(SYSCALL_NAME);
diff --git a/tests/xstatx.c b/tests/xstatx.c
index 0d5fca8..8758ef8 100644
--- a/tests/xstatx.c
+++ b/tests/xstatx.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -47,26 +48,7 @@
 # include <unistd.h>
 # include <sys/sysmacros.h>
 
-static void
-print_time(const time_t t)
-{
-	if (!t) {
-		printf("0");
-		return;
-	}
-
-	struct tm *p = localtime(&t);
-
-	if (p) {
-		char buf[256];
-
-		strftime(buf, sizeof(buf), "%FT%T%z", p);
-
-		printf("%s", buf);
-	} else {
-		printf("%llu", zero_extend_signed_to_ull(t));
-	}
-}
+# include "statx.h"
 
 # ifndef STRUCT_STAT
 #  define STRUCT_STAT struct stat
@@ -130,6 +112,10 @@
 #  define OLD_STAT 0
 # endif
 
+# ifndef IS_STATX
+#  define IS_STATX 0
+# endif
+
 static void
 print_ftype(const unsigned int mode)
 {
@@ -151,6 +137,8 @@
 	printf("%#o", mode & ~S_IFMT);
 }
 
+# if !IS_STATX
+
 static void
 print_stat(const STRUCT_STAT *st)
 {
@@ -165,12 +153,12 @@
 	printf(", st_nlink=%llu", zero_extend_signed_to_ull(st->st_nlink));
 	printf(", st_uid=%llu", zero_extend_signed_to_ull(st->st_uid));
 	printf(", st_gid=%llu", zero_extend_signed_to_ull(st->st_gid));
-# if OLD_STAT
+#  if OLD_STAT
 	printf(", st_blksize=0, st_blocks=0");
-# else /* !OLD_STAT */
+#  else /* !OLD_STAT */
 	printf(", st_blksize=%llu", zero_extend_signed_to_ull(st->st_blksize));
 	printf(", st_blocks=%llu", zero_extend_signed_to_ull(st->st_blocks));
-# endif /* OLD_STAT */
+#  endif /* OLD_STAT */
 
 	switch (st->st_mode & S_IFMT) {
 	case S_IFCHR: case S_IFBLK:
@@ -182,27 +170,87 @@
 		printf(", st_size=%llu", zero_extend_signed_to_ull(st->st_size));
 	}
 
-	printf(", st_atime=");
-	print_time(sign_extend_unsigned_to_ll(st->st_atime));
-# if defined(HAVE_STRUCT_STAT_ST_MTIME_NSEC) && !OLD_STAT
-	if (st->st_atime_nsec)
-		printf(".%09llu", zero_extend_signed_to_ull(st->st_atime_nsec));
-# endif
-	printf(", st_mtime=");
-	print_time(sign_extend_unsigned_to_ll(st->st_mtime));
-# if defined(HAVE_STRUCT_STAT_ST_MTIME_NSEC) && !OLD_STAT
-	if (st->st_mtime_nsec)
-		printf(".%09llu", zero_extend_signed_to_ull(st->st_mtime_nsec));
-# endif
-	printf(", st_ctime=");
-	print_time(sign_extend_unsigned_to_ll(st->st_ctime));
-# if defined(HAVE_STRUCT_STAT_ST_MTIME_NSEC) && !OLD_STAT
-	if (st->st_ctime_nsec)
-		printf(".%09llu", zero_extend_signed_to_ull(st->st_ctime_nsec));
-# endif
+#  if defined(HAVE_STRUCT_STAT_ST_MTIME_NSEC) && !OLD_STAT
+#   define TIME_NSEC(val)	zero_extend_signed_to_ull(val)
+#   define HAVE_NSEC		1
+#  else
+#   define TIME_NSEC(val)	0ULL
+#   define HAVE_NSEC		0
+#  endif
+
+#define PRINT_ST_TIME(field)						\
+	printf(", st_" #field "=%lld",					\
+	       sign_extend_unsigned_to_ll(st->st_ ## field));		\
+	print_time_t_nsec(sign_extend_unsigned_to_ll(st->st_ ## field),	\
+			  TIME_NSEC(st->st_ ## field ## _nsec), 1);	\
+	if (HAVE_NSEC)							\
+		printf(", st_" #field "_nsec=%llu",			\
+		       TIME_NSEC(st->st_ ## field ## _nsec))
+
+	PRINT_ST_TIME(atime);
+	PRINT_ST_TIME(mtime);
+	PRINT_ST_TIME(ctime);
 	printf("}");
 }
 
+# else /* !IS_STATX */
+
+static void
+print_stat(const STRUCT_STAT *st)
+{
+#  define PRINT_FIELD_U(field) \
+	printf(", %s=%llu", #field, (unsigned long long) st->field)
+
+#  define PRINT_FIELD_U32_UID(field) \
+	if (st->field == (uint32_t) -1) \
+		printf(", %s=-1", #field); \
+	else \
+		printf(", %s=%llu", #field, (unsigned long long) st->field)
+
+#  define PRINT_FIELD_TIME(field)					\
+	printf(", %s={tv_sec=%lld, tv_nsec=%u}",			\
+	       #field, (long long) st->field.tv_sec,			\
+	       (unsigned) st->field.tv_nsec);				\
+	print_time_t_nsec(st->field.tv_sec,				\
+			  zero_extend_signed_to_ull(st->field.tv_nsec), 1);
+
+	printf("{stx_mask=");
+	printflags(statx_masks, st->stx_mask, "STATX_???");
+
+	PRINT_FIELD_U(stx_blksize);
+
+	printf(", stx_attributes=");
+	printflags(statx_attrs, st->stx_attributes, "STATX_ATTR_???");
+
+	PRINT_FIELD_U(stx_nlink);
+	PRINT_FIELD_U32_UID(stx_uid);
+	PRINT_FIELD_U32_UID(stx_gid);
+
+	printf(", stx_mode=");
+	print_ftype(st->stx_mode);
+	printf("|");
+	print_perms(st->stx_mode);
+
+	PRINT_FIELD_U(stx_ino);
+	PRINT_FIELD_U(stx_size);
+	PRINT_FIELD_U(stx_blocks);
+
+	printf(", stx_attributes_mask=");
+	printflags(statx_attrs, st->stx_attributes_mask, "STATX_ATTR_???");
+
+	PRINT_FIELD_TIME(stx_atime);
+	PRINT_FIELD_TIME(stx_btime);
+	PRINT_FIELD_TIME(stx_ctime);
+	PRINT_FIELD_TIME(stx_mtime);
+	PRINT_FIELD_U(stx_rdev_major);
+	PRINT_FIELD_U(stx_rdev_minor);
+	PRINT_FIELD_U(stx_dev_major);
+	PRINT_FIELD_U(stx_dev_minor);
+	printf("}");
+}
+
+# endif /* !IS_STATX */
+
 static int
 create_sample(const char *fname, const libc_off_t size)
 {
@@ -229,19 +277,19 @@
 int
 main(void)
 {
-# if !IS_FSTAT
+# if IS_FSTAT
+	skip_if_unavailable("/proc/self/fd/");
+# else
 	static const char full[] = "/dev/full";
 # endif
-	static const char sample[] = TEST_SYSCALL_STR ".sample";
-	STRUCT_STAT st[2];
+	static const char sample[] = "stat.sample";
+	TAIL_ALLOC_OBJECT_CONST_PTR(STRUCT_STAT, st);
 
 	int rc;
 
 	rc = create_sample(sample, SAMPLE_SIZE);
-	if (rc) {
-		(void) unlink(sample);
+	if (rc)
 		return rc;
-	}
 
 # if TEST_BOGUS_STRUCT_STAT
 	STRUCT_STAT *st_cut = tail_alloc(sizeof(long) * 4);
@@ -262,46 +310,71 @@
 # endif
 
 	if ((rc = TEST_SYSCALL_INVOKE(sample, st))) {
-# if OLD_STAT
-		if (errno != EOVERFLOW)
-# endif
-		{
+		if (errno != EOVERFLOW) {
+			rc = (errno == ENOSYS) ? 77 : 1;
 			perror(TEST_SYSCALL_STR);
-			(void) unlink(sample);
-			return 77;
+			return rc;
 		}
 	}
-	(void) unlink(sample);
+
+# if IS_STATX
+#  define ST_SIZE_FIELD stx_size
+# else
+#  define ST_SIZE_FIELD st_size
+# endif
 	if (!rc && zero_extend_signed_to_ull(SAMPLE_SIZE) !=
-	    zero_extend_signed_to_ull(st[0].st_size)) {
+	    zero_extend_signed_to_ull(st->ST_SIZE_FIELD)) {
 		fprintf(stderr, "Size mismatch: "
 				"requested size(%llu) != st_size(%llu)\n",
 			zero_extend_signed_to_ull(SAMPLE_SIZE),
-			zero_extend_signed_to_ull(st[0].st_size));
+			zero_extend_signed_to_ull(st->ST_SIZE_FIELD));
 		fprintf(stderr, "The most likely reason for this is incorrect"
 				" definition of %s.\n"
 				"Here is some diagnostics that might help:\n",
 			STRUCT_STAT_STR);
 
-#define LOG_STAT_OFFSETOF_SIZEOF(object, member)			\
+# define LOG_STAT_OFFSETOF_SIZEOF(object, member)			\
 		fprintf(stderr, "offsetof(%s, %s) = %zu"		\
 				", sizeof(%s) = %zu\n",			\
 				STRUCT_STAT_STR, #member,		\
 				offsetof(STRUCT_STAT, member),		\
 				#member, sizeof((object).member))
 
-		LOG_STAT_OFFSETOF_SIZEOF(st[0], st_dev);
-		LOG_STAT_OFFSETOF_SIZEOF(st[0], st_ino);
-		LOG_STAT_OFFSETOF_SIZEOF(st[0], st_mode);
-		LOG_STAT_OFFSETOF_SIZEOF(st[0], st_nlink);
-		LOG_STAT_OFFSETOF_SIZEOF(st[0], st_uid);
-		LOG_STAT_OFFSETOF_SIZEOF(st[0], st_gid);
-		LOG_STAT_OFFSETOF_SIZEOF(st[0], st_rdev);
-		LOG_STAT_OFFSETOF_SIZEOF(st[0], st_size);
-# if !OLD_STAT
-		LOG_STAT_OFFSETOF_SIZEOF(st[0], st_blksize);
-		LOG_STAT_OFFSETOF_SIZEOF(st[0], st_blocks);
-# endif /* !OLD_STAT */
+# if IS_STATX
+		LOG_STAT_OFFSETOF_SIZEOF(*st, stx_mask);
+		LOG_STAT_OFFSETOF_SIZEOF(*st, stx_blksize);
+		LOG_STAT_OFFSETOF_SIZEOF(*st, stx_attributes);
+		LOG_STAT_OFFSETOF_SIZEOF(*st, stx_nlink);
+		LOG_STAT_OFFSETOF_SIZEOF(*st, stx_uid);
+		LOG_STAT_OFFSETOF_SIZEOF(*st, stx_gid);
+		LOG_STAT_OFFSETOF_SIZEOF(*st, stx_mode);
+		LOG_STAT_OFFSETOF_SIZEOF(*st, stx_ino);
+		LOG_STAT_OFFSETOF_SIZEOF(*st, stx_size);
+		LOG_STAT_OFFSETOF_SIZEOF(*st, stx_blocks);
+		LOG_STAT_OFFSETOF_SIZEOF(*st, stx_attributes_mask);
+		LOG_STAT_OFFSETOF_SIZEOF(*st, stx_atime);
+		LOG_STAT_OFFSETOF_SIZEOF(*st, stx_btime);
+		LOG_STAT_OFFSETOF_SIZEOF(*st, stx_ctime);
+		LOG_STAT_OFFSETOF_SIZEOF(*st, stx_mtime);
+		LOG_STAT_OFFSETOF_SIZEOF(*st, stx_rdev_major);
+		LOG_STAT_OFFSETOF_SIZEOF(*st, stx_rdev_minor);
+		LOG_STAT_OFFSETOF_SIZEOF(*st, stx_dev_major);
+		LOG_STAT_OFFSETOF_SIZEOF(*st, stx_dev_minor);
+# else
+		LOG_STAT_OFFSETOF_SIZEOF(*st, st_dev);
+		LOG_STAT_OFFSETOF_SIZEOF(*st, st_ino);
+		LOG_STAT_OFFSETOF_SIZEOF(*st, st_mode);
+		LOG_STAT_OFFSETOF_SIZEOF(*st, st_nlink);
+		LOG_STAT_OFFSETOF_SIZEOF(*st, st_uid);
+		LOG_STAT_OFFSETOF_SIZEOF(*st, st_gid);
+		LOG_STAT_OFFSETOF_SIZEOF(*st, st_rdev);
+		LOG_STAT_OFFSETOF_SIZEOF(*st, st_size);
+#  if !OLD_STAT
+		LOG_STAT_OFFSETOF_SIZEOF(*st, st_blksize);
+		LOG_STAT_OFFSETOF_SIZEOF(*st, st_blocks);
+#  endif /* !OLD_STAT */
+
+# endif /* IS_STATX */
 
 		return 1;
 	}
@@ -313,6 +386,63 @@
 		print_stat(st);
 	PRINT_SYSCALL_FOOTER(rc);
 
+# if IS_STATX
+
+#  define INVOKE() \
+	rc = TEST_SYSCALL_INVOKE(sample, st); \
+	PRINT_SYSCALL_HEADER(sample); \
+	if (rc) \
+		printf("%p", st); \
+	else \
+		print_stat(st); \
+	PRINT_SYSCALL_FOOTER(rc)
+
+#  define SET_FLAGS_INVOKE(flags, flags_str) \
+	TEST_SYSCALL_STATX_FLAGS = flags; \
+	TEST_SYSCALL_STATX_FLAGS_STR = flags_str; \
+	INVOKE()
+
+#  define SET_MASK_INVOKE(mask, mask_str) \
+	TEST_SYSCALL_STATX_MASK = mask; \
+	TEST_SYSCALL_STATX_MASK_STR = mask_str; \
+	INVOKE()
+
+	unsigned old_flags = TEST_SYSCALL_STATX_FLAGS;
+	const char *old_flags_str = TEST_SYSCALL_STATX_FLAGS_STR;
+	unsigned old_mask = TEST_SYSCALL_STATX_MASK;
+	const char *old_mask_str = TEST_SYSCALL_STATX_MASK_STR;
+
+	SET_FLAGS_INVOKE(AT_SYMLINK_FOLLOW | 0xffff0000U,
+		"AT_STATX_SYNC_AS_STAT|AT_SYMLINK_FOLLOW|0xffff0000");
+
+	SET_FLAGS_INVOKE(AT_STATX_SYNC_TYPE,
+		"AT_STATX_FORCE_SYNC|AT_STATX_DONT_SYNC");
+
+	SET_FLAGS_INVOKE(0xffffff,
+		"AT_STATX_FORCE_SYNC|AT_STATX_DONT_SYNC|AT_SYMLINK_NOFOLLOW|"
+		"AT_REMOVEDIR|AT_SYMLINK_FOLLOW|AT_NO_AUTOMOUNT|AT_EMPTY_PATH|"
+		"0xff80ff");
+
+	/* We're done playing with flags. */
+	TEST_SYSCALL_STATX_FLAGS = old_flags;
+	TEST_SYSCALL_STATX_FLAGS_STR = old_flags_str;
+
+	SET_MASK_INVOKE(0, "0");
+	SET_MASK_INVOKE(0xfffff000U, "0xfffff000 /* STATX_??? */");
+
+	SET_MASK_INVOKE(0xfffffffbU,
+		"STATX_TYPE|STATX_MODE|STATX_UID|STATX_GID|STATX_ATIME|"
+		"STATX_MTIME|STATX_CTIME|STATX_INO|STATX_SIZE|STATX_BLOCKS|"
+		"STATX_BTIME|0xfffff000");
+
+	SET_MASK_INVOKE(STATX_UID, "STATX_UID");
+
+	/* ...and with mask. */
+	TEST_SYSCALL_STATX_MASK = old_mask;
+	TEST_SYSCALL_STATX_MASK_STR = old_mask_str;
+
+# endif /* IS_STATX */
+
 	puts("+++ exited with 0 +++");
 	return 0;
 }
diff --git a/tests/xutimes.c b/tests/xutimes.c
new file mode 100644
index 0000000..5fd7161
--- /dev/null
+++ b/tests/xutimes.c
@@ -0,0 +1,149 @@
+/*
+ * Check decoding of utimes/osf_utimes syscall.
+ *
+ * Copyright (c) 2015-2017 Dmitry V. Levin <[email protected]>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef TEST_SYSCALL_NR
+# error TEST_SYSCALL_NR must be defined
+#endif
+
+#ifndef TEST_SYSCALL_STR
+# error TEST_SYSCALL_STR must be defined
+#endif
+
+#ifndef TEST_STRUCT
+# error TEST_STRUCT must be defined
+#endif
+
+#include <stdint.h>
+#include <stdio.h>
+#include <sys/time.h>
+#include <unistd.h>
+
+static void
+print_tv(const TEST_STRUCT *const tv)
+{
+	printf("{tv_sec=%lld, tv_usec=%llu}",
+	       (long long) tv->tv_sec,
+	       zero_extend_signed_to_ull(tv->tv_usec));
+	print_time_t_usec(tv->tv_sec,
+			  zero_extend_signed_to_ull(tv->tv_usec), 1);
+}
+
+static const char *errstr;
+
+static long
+k_utimes(const kernel_ulong_t pathname, const kernel_ulong_t times)
+{
+	long rc = syscall(TEST_SYSCALL_NR, pathname, times);
+	errstr = sprintrc(rc);
+	return rc;
+}
+
+int
+main(void)
+{
+	static const char proto_fname[] = TEST_SYSCALL_STR "_sample";
+	static const char qname[] = "\"" TEST_SYSCALL_STR "_sample\"";
+
+	char *const fname = tail_memdup(proto_fname, sizeof(proto_fname));
+	const kernel_ulong_t kfname = (uintptr_t) fname;
+	TEST_STRUCT *const tv = tail_alloc(sizeof(*tv) * 2);
+
+	/* pathname */
+	k_utimes(0, 0);
+	printf("%s(NULL, NULL) = %s\n", TEST_SYSCALL_STR, errstr);
+
+	k_utimes(kfname + sizeof(proto_fname) - 1, 0);
+	printf("%s(\"\", NULL) = %s\n", TEST_SYSCALL_STR, errstr);
+
+	k_utimes(kfname, 0);
+	printf("%s(%s, NULL) = %s\n", TEST_SYSCALL_STR, qname, errstr);
+
+	fname[sizeof(proto_fname) - 1] = '+';
+	k_utimes(kfname, 0);
+	fname[sizeof(proto_fname) - 1] = '\0';
+	printf("%s(%p, NULL) = %s\n", TEST_SYSCALL_STR, fname, errstr);
+
+	if (F8ILL_KULONG_SUPPORTED) {
+		k_utimes(f8ill_ptr_to_kulong(fname), 0);
+		printf("%s(%#jx, NULL) = %s\n", TEST_SYSCALL_STR,
+		       (uintmax_t) f8ill_ptr_to_kulong(fname), errstr);
+	}
+
+	/* times */
+	k_utimes(kfname, (uintptr_t) (tv + 1));
+	printf("%s(%s, %p) = %s\n", TEST_SYSCALL_STR,
+	       qname, tv + 1, errstr);
+
+	k_utimes(kfname, (uintptr_t) (tv + 2));
+	printf("%s(%s, %p) = %s\n", TEST_SYSCALL_STR,
+	       qname, tv + 2, errstr);
+
+	tv[0].tv_sec = 0xdeadbeefU;
+	tv[0].tv_usec = 0xfacefeedU;
+	tv[1].tv_sec = (time_t) 0xcafef00ddeadbeefLL;
+	tv[1].tv_usec = (long) 0xbadc0dedfacefeedLL;
+
+	k_utimes(kfname, (uintptr_t) tv);
+	printf("%s(%s, [", TEST_SYSCALL_STR, qname);
+	print_tv(&tv[0]);
+	printf(", ");
+	print_tv(&tv[1]);
+	printf("]) = %s\n", errstr);
+
+	tv[0].tv_sec = 1492358607;
+	tv[0].tv_usec = 1000000;
+	tv[1].tv_sec = 1492356078;
+	tv[1].tv_usec = 1000001;
+
+	k_utimes(kfname, (uintptr_t) tv);
+	printf("%s(%s, [", TEST_SYSCALL_STR, qname);
+	print_tv(&tv[0]);
+	printf(", ");
+	print_tv(&tv[1]);
+	printf("]) = %s\n", errstr);
+
+	tv[0].tv_usec = 345678;
+	tv[1].tv_usec = 456789;
+
+	k_utimes(kfname, (uintptr_t) tv);
+	printf("%s(%s, [", TEST_SYSCALL_STR, qname);
+	print_tv(&tv[0]);
+	printf(", ");
+	print_tv(&tv[1]);
+	printf("]) = %s\n", errstr);
+
+	if (F8ILL_KULONG_SUPPORTED) {
+		k_utimes(kfname, f8ill_ptr_to_kulong(tv));
+		printf("%s(%s, %#jx) = %s\n", TEST_SYSCALL_STR,
+		       qname, (uintmax_t) f8ill_ptr_to_kulong(tv), errstr);
+	}
+
+	puts("+++ exited with 0 +++");
+	return 0;
+}