diff mbox series

[v2,14/23] linux: Use generic __syscall_error for sh

Message ID 20201113165837.121629-15-adhemerval.zanella@linaro.org
State New
Headers show
Series Simplify internal Linux syscall | expand

Commit Message

Adhemerval Zanella Nov. 13, 2020, 4:58 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 -
 .../linux/sh/{sysdep.S => syscall_error.h}    |  21 ++--
 3 files changed, 7 insertions(+), 130 deletions(-)
 delete mode 100644 sysdeps/unix/sh/sysdep.S
 rename sysdeps/unix/sysv/linux/sh/{sysdep.S => syscall_error.h} (60%)
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/syscall_error.h
similarity index 60%
rename from sysdeps/unix/sysv/linux/sh/sysdep.S
rename to sysdeps/unix/sysv/linux/sh/syscall_error.h
index 85ff3f900e..5b75619168 100644
--- a/sysdeps/unix/sysv/linux/sh/sysdep.S
+++ b/sysdeps/unix/sysv/linux/sh/syscall_error.h
@@ -1,4 +1,5 @@ 
-/* Copyright (C) 1995-2020 Free Software Foundation, Inc.
+/* Linux wrappers for setting errno.  SH version.
+   Copyright (C) 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
@@ -15,18 +16,10 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <sysdep.h>
+#ifndef _SYSCALL_ERROR_H
+#define _SYSCALL_ERROR_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.  */
+#define SYSCALL_ERROR_FUNC        1
+#define SYSCALL_ERROR_FUNC_ATTR
 
-#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>
+#endif