]> sourceware.org Git - newlib-cygwin.git/commit
Only pass the minimum number of syscall arguments
authorGeorg Sauthoff <mail@gms.tf>
Mon, 10 Feb 2020 20:19:58 +0000 (21:19 +0100)
committerCorinna Vinschen <corinna@vinschen.de>
Tue, 11 Feb 2020 08:41:52 +0000 (09:41 +0100)
commit9b51beeb2af79d2d492e59c853ebabd4560c225a
tree6be6af2aabdd1d63facb8b111456d760bd36f2a3
parent2379142bc5d345421acb9e3ac86abcad0d7bf71e
Only pass the minimum number of syscall arguments

Previously, __internal_syscall() compiled into asm-code that unconditionally
sets the syscall argument registers a0 to a5.

For example, the instruction sequence for a exit syscall looked like
this:

    li    a0, 1   # in ther caller of exit()
    # ...         # in newlib:
    li    a1, 0   # unused arguments
    li    a2, 0
    li    a3, 0
    li    a4, 0
    li    a5, 0
    li    a7, 93  # exit syscall number

(i.e. the binary contains then 5 superfluous instructions for this
one argument syscall)

This commit changes the RISC-V syscall code such that only the required
syscall argument registers are set.

GCC detects that argc is known at compile time and thus evaluates all the
if-statements where argc is used at compile time (tested with -O2 and -Os).
18 files changed:
libgloss/riscv/internal_syscall.h
libgloss/riscv/sys_access.c
libgloss/riscv/sys_close.c
libgloss/riscv/sys_exit.c
libgloss/riscv/sys_faccessat.c
libgloss/riscv/sys_fstat.c
libgloss/riscv/sys_fstatat.c
libgloss/riscv/sys_gettimeofday.c
libgloss/riscv/sys_link.c
libgloss/riscv/sys_lseek.c
libgloss/riscv/sys_lstat.c
libgloss/riscv/sys_open.c
libgloss/riscv/sys_openat.c
libgloss/riscv/sys_read.c
libgloss/riscv/sys_sbrk.c
libgloss/riscv/sys_stat.c
libgloss/riscv/sys_unlink.c
libgloss/riscv/sys_write.c
This page took 0.033408 seconds and 5 git commands to generate.