diff mbox series

[15/23] linux: Use generic __syscall_error for sh

Message ID 20201109201826.120534-16-adhemerval.zanella@linaro.org
State Superseded
Headers show
Series Simplify internal Linux syscall | expand

Commit Message

Adhemerval Zanella Nov. 9, 2020, 8:18 p.m. UTC
Although the auto-generated syscall sets errno directly for dynamic
case, using a function call generates more compact code:

--- sizes-sh4-linux-gnu.outline
+++ sizes-sh4-linux-gnu.inline

    text           data     bss     dec     hex filename
-1242446           9948    9240 1261634  134042 libc.so
- 122480           3764     176  126420   1edd4 elf/ld.so
-  91548            804    8348  100700   1895c nptl/libpthread.so
-  23613            608     160   24381    5f3d rt/librt.so
+1244638           9948    9240 1263826  1348d2 libc.so
+ 122416           3764     176  126356   1ed94 elf/ld.so
+  91460            804    8348  100612   18904 nptl/libpthread.so
+  23805            608     160   24573    5ffd rt/librt.so

It also removes the PLT call done by the generic unix syscall.S
which calls __errno_location instead of the accessing it directly
(as done by C implementation through syscall_error.c).

Checked with some basic tests to see if errno is set correctly
on both static and dynamic binaries with auto-generated syscals
and C implementation (which uses INTERNAL_SYSCALL_CALL).
---
 sysdeps/unix/sh/sysdep.S                 | 115 -----------------------
 sysdeps/unix/sysv/linux/sh/localplt.data |   1 -
 sysdeps/unix/sysv/linux/sh/sysdep.S      |  32 -------
 sysdeps/unix/sysv/linux/sh/sysdep.h      |   2 +
 4 files changed, 2 insertions(+), 148 deletions(-)
 delete mode 100644 sysdeps/unix/sh/sysdep.S
 delete mode 100644 sysdeps/unix/sysv/linux/sh/sysdep.S
diff mbox series

Patch

diff --git a/sysdeps/unix/sh/sysdep.S b/sysdeps/unix/sh/sysdep.S
deleted file mode 100644
index dc9a230ee0..0000000000
--- a/sysdeps/unix/sh/sysdep.S
+++ /dev/null
@@ -1,115 +0,0 @@ 
-/* Copyright (C) 1999-2020 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <https://www.gnu.org/licenses/>.  */
-
-#include <sysdep.h>
-#include <errno.h>
-
-ENTRY(__syscall_error)
-#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN
-	/* We translate the system's EWOULDBLOCK error into EAGAIN.
-	   The GNU C library always defines EWOULDBLOCK==EAGAIN.
-	   EWOULDBLOCK_sys is the original number.  */
-	mov.l	.L1, r1
-	cmp/eq	r1, r0
-	bf	skip
-	nop
-	mov.l	.L2, r0
-skip:
-#endif
-	/* Store it in errno... */
-#ifndef SHARED
-#ifndef _LIBC_REENTRANT
-	mov.l	.L3, r1
-	mov.l	r0, @r1
-#else
-	mov.l	.L3, r1
-	sts.l	pr, @-r15
-	cfi_adjust_cfa_offset (4)
-	cfi_rel_offset (pr, 0)
-	mov.l	r0, @-r15
-	cfi_adjust_cfa_offset (4)
-	jsr	@r1
-	 nop
-	mov.l	@r15+, r1
-	cfi_adjust_cfa_offset (-4)
-	lds.l	@r15+, pr
-	cfi_adjust_cfa_offset (-4)
-	cfi_restore (pr)
-	mov.l	r1, @r0
-#endif
-#else
-	mov.l	r12, @-r15
-	cfi_adjust_cfa_offset (4)
-	cfi_rel_offset (r12, 0)
-#ifndef _LIBC_REENTRANT
-	mov	r0, r2
-        mov.l	0f, r12
-	mova	0f, r0
-	add	r0, r12
-	mov.l	.L3, r0
-	mov.l	@(r0,r12), r1
-	mov.l	r2, @r1
-#else
-	mov.l	r0, @-r15
-	cfi_adjust_cfa_offset (4)
-	sts.l	pr, @-r15
-	cfi_adjust_cfa_offset (4)
-	cfi_rel_offset (pr, 0)
-        mov.l	0f, r12
-	mova	0f, r0
-	add	r0, r12
-	mov.l	.L3, r1
-	mova	.L3, r0
-	add	r0, r1
-	jsr	@r1
-	 nop
-	lds.l	@r15+, pr
-	cfi_adjust_cfa_offset (-4)
-	cfi_restore (pr)
-	mov.l	@r15+, r1
-	cfi_adjust_cfa_offset (-4)
-	mov.l	r1, @r0
-#endif
-	mov.l	@r15+, r12
-	cfi_adjust_cfa_offset (-4)
-	cfi_restore (r12)
-#endif
-	/* And just kick back a -1.  */
-	rts
-	 mov	#-1, r0
-
-	.align	2
-#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN
-.L1:	.long	EWOULDBLOCK_sys
-.L2:	.long	EAGAIN
-#endif
-#ifndef SHARED
-#ifndef _LIBC_REENTRANT
-.L3:	.long	C_SYMBOL_NAME(errno)
-#else
-.L3:	.long	C_SYMBOL_NAME(__errno_location)
-#endif
-#else
-0:
-	.long	_GLOBAL_OFFSET_TABLE_
-#ifndef _LIBC_REENTRANT
-.L3:	.long	C_SYMBOL_NAME(errno@GOT)
-#else
-.L3:	.long	C_SYMBOL_NAME(__errno_location@PLT)
-#endif
-#endif
-END(__syscall_error)
diff --git a/sysdeps/unix/sysv/linux/sh/localplt.data b/sysdeps/unix/sysv/linux/sh/localplt.data
index 3225177c50..9d8154648b 100644
--- a/sysdeps/unix/sysv/linux/sh/localplt.data
+++ b/sysdeps/unix/sysv/linux/sh/localplt.data
@@ -8,7 +8,6 @@  libc.so: memalign
 libc.so: realloc
 libc.so: _Unwind_Find_FDE
 libc.so: _exit
-libc.so: __errno_location
 libm.so: matherr
 # Generated by the compiler because there is no trap insn pattern.
 libc.so: abort ?
diff --git a/sysdeps/unix/sysv/linux/sh/sysdep.S b/sysdeps/unix/sysv/linux/sh/sysdep.S
deleted file mode 100644
index 85ff3f900e..0000000000
--- a/sysdeps/unix/sysv/linux/sh/sysdep.S
+++ /dev/null
@@ -1,32 +0,0 @@ 
-/* Copyright (C) 1995-2020 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <https://www.gnu.org/licenses/>.  */
-
-#include <sysdep.h>
-
-/* The syscall stubs jump here when they detect an error.
-   The code for Linux is almost identical to the canonical Unix
-   code, except that the error number in R0 is negated.  */
-
-#undef CALL_MCOUNT
-#define CALL_MCOUNT /* Don't insert the profiling call, it clobbers R0.  */
-
-ENTRY (__syscall_error)
-	neg r4, r0
-	cfi_endproc
-
-#define __syscall_error __syscall_error_1
-#include <sysdeps/unix/sh/sysdep.S>
diff --git a/sysdeps/unix/sysv/linux/sh/sysdep.h b/sysdeps/unix/sysv/linux/sh/sysdep.h
index 60a5032ce4..511406b5dc 100644
--- a/sysdeps/unix/sysv/linux/sh/sysdep.h
+++ b/sysdeps/unix/sysv/linux/sh/sysdep.h
@@ -20,6 +20,8 @@ 
 #ifndef _LINUX_SH_SYSDEP_H
 #define _LINUX_SH_SYSDEP_H 1
 
+#define SYSCALL_ERROR_FUNC
+
 /* There is some commonality.  */
 #include <sysdeps/unix/sysv/linux/sysdep.h>
 #include <sysdeps/unix/sh/sysdep.h>