[PATCH v2 0/5] linux: Avoid va_list for generic syscall wrappers if possible
Xi Ruoyao
xry111@xry111.site
Sat Mar 25 14:08:10 GMT 2023
Currently GCC generates highly sub-optimal code on architectures where
the calling convention prefers registers for arugment passing. This is
GCC PR100955. While it's technically a missed-optimization in GCC, it
seems not trivial to fix (I've not seen any compiler which can optimize
this properly yet).
As the generic Linux syscall wrappers often uses a fixed number of
arguments, and "overreading" the variable arguments is usually safe
(fcntl etc. is already doing this), we can pretend these wrappers were
declared with named arguments and make the compiler do right thing.
Add a macro __ASSUME_SYSCALL_NAMED_WORKS to control this, which should
be defined if we can safely replace "..." with several named arguments.
Use an internal function prototype with named arguments if it's defined,
for fcntl64, fcntl_nocancel, ioctl, mremap, open64, open64_nocancel,
openat64, openat64_nocancel, prctl, ptrace, and generic syscall()
wrapper. I've not changed open* without "64" because I don't have a
test platform. shm_ctl is also not changed because it contains
aggregate variable arugment which is more tricky than integers or
pointers.
Define this macro for LoongArch, x86-64, and AArch64. This should be
also suitable for some other architectures (I think it will be fine on
RISC-V) but again I don't have a test platform.
This is the first time I make such a large change in Glibc so it's
likely I've done something wrong. Please correct me :).
Xi Ruoyao (5):
linux: Add __ASSUME_SYSCALL_NAMED_WORKS to allow avoiding va_list for
generic syscall
linux: [__ASSUME_SYSCALL_NAMED_WORKS] Avoid using va_list for various
syscall wrappers
LoongArch: Define __ASSUME_SYSCALL_NAMED_WORKS for Linux
x86_64: Define __ASSUME_SYSCALL_NAMED_WORKS for Linux
aarch64: Define __ASSUME_SYSCALL_NAMED_WORKS for Linux
include/fcntl.h | 32 ++++++++-----
.../unix/sysv/linux/aarch64/kernel-features.h | 9 ++++
sysdeps/unix/sysv/linux/fcntl64.c | 40 +++++++++++++----
sysdeps/unix/sysv/linux/fcntl_nocancel.c | 30 ++++++++++---
sysdeps/unix/sysv/linux/ioctl.c | 38 ++++++++++++----
.../sysv/linux/loongarch/kernel-features.h | 29 ++++++++++++
sysdeps/unix/sysv/linux/mremap.c | 36 +++++++++++++--
sysdeps/unix/sysv/linux/not-cancel.h | 8 ++--
sysdeps/unix/sysv/linux/open64.c | 35 ++++++++++++---
sysdeps/unix/sysv/linux/open64_nocancel.c | 29 ++++++++++--
sysdeps/unix/sysv/linux/openat64.c | 30 +++++++++++--
sysdeps/unix/sysv/linux/openat64_nocancel.c | 29 ++++++++++--
sysdeps/unix/sysv/linux/prctl.c | 23 +++++++++-
sysdeps/unix/sysv/linux/ptrace.c | 45 ++++++++++++++-----
sysdeps/unix/sysv/linux/syscall.c | 35 +++++++++++----
.../unix/sysv/linux/x86_64/kernel-features.h | 9 ++++
16 files changed, 382 insertions(+), 75 deletions(-)
create mode 100644 sysdeps/unix/sysv/linux/loongarch/kernel-features.h
--
2.40.0
More information about the Libc-alpha
mailing list