mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-01 10:06:57 +03:00
stdio: Remove the usage of $(fno-unit-at-a-time) for siglist.c
The siglist.c is built with -fno-toplevel-reorder to avoid compiler to reorder the compat assembly directives due an assembler issue [1] (fixed on 2.39). This patch removes the compiler flags by split the compat symbol generation in two phases. First the __sys_siglist and __sys_sigabbrev without any compat symbol directive is preprocessed to generate an assembly source code. This generate assembly is then used as input on a platform agnostic siglist.S which then creates the compat definitions. This prevents compiler to move any compat directive prior the _sys_errlist definition itself. Checked on a make check run-built-tests=no on all affected ABIs. Reviewed-by: Fangrui Song <maskray@google.com>
This commit is contained in:
@ -14,10 +14,8 @@ libc_hidden_proto (__sigpause)
|
|||||||
libc_hidden_proto (raise)
|
libc_hidden_proto (raise)
|
||||||
libc_hidden_proto (__libc_current_sigrtmin)
|
libc_hidden_proto (__libc_current_sigrtmin)
|
||||||
libc_hidden_proto (__libc_current_sigrtmax)
|
libc_hidden_proto (__libc_current_sigrtmax)
|
||||||
extern const char * const __sys_siglist[_NSIG];
|
extern const char * const __sys_siglist[_NSIG] attribute_hidden;
|
||||||
libc_hidden_proto (__sys_siglist)
|
extern const char * const __sys_sigabbrev[_NSIG] attribute_hidden;
|
||||||
extern const char * const __sys_sigabbrev[_NSIG];
|
|
||||||
libc_hidden_proto (__sys_sigabbrev)
|
|
||||||
|
|
||||||
/* Now define the internal interfaces. */
|
/* Now define the internal interfaces. */
|
||||||
extern __sighandler_t __bsd_signal (int __sig, __sighandler_t __handler);
|
extern __sighandler_t __bsd_signal (int __sig, __sighandler_t __handler);
|
||||||
|
@ -215,6 +215,8 @@ tests := \
|
|||||||
generated += \
|
generated += \
|
||||||
errlist-data-aux-shared.S \
|
errlist-data-aux-shared.S \
|
||||||
errlist-data-aux.S \
|
errlist-data-aux.S \
|
||||||
|
siglist-aux-shared.S \
|
||||||
|
siglist-aux.S \
|
||||||
# generated
|
# generated
|
||||||
|
|
||||||
test-srcs = tst-unbputc tst-printf tst-printfsz-islongdouble
|
test-srcs = tst-unbputc tst-printf tst-printfsz-islongdouble
|
||||||
@ -265,6 +267,17 @@ $(objpfx)errlist-data-aux.S: errlist-data-gen.c
|
|||||||
$(objpfx)errlist-data.os: $(objpfx)errlist-data-aux-shared.S
|
$(objpfx)errlist-data.os: $(objpfx)errlist-data-aux-shared.S
|
||||||
$(objpfx)errlist-data.o: $(objpfx)errlist-data-aux.S
|
$(objpfx)errlist-data.o: $(objpfx)errlist-data-aux.S
|
||||||
|
|
||||||
|
$(objpfx)siglist-aux-shared.S: siglist-gen.c
|
||||||
|
$(make-target-directory)
|
||||||
|
$(compile-command.c) $(pic-cppflags) $(pic-ccflag) $(no-stack-protector) -S
|
||||||
|
|
||||||
|
$(objpfx)siglist-aux.S: siglist-gen.c
|
||||||
|
$(make-target-directory)
|
||||||
|
$(compile-command.c) $(pie-default) $(no-stack-protector) -S
|
||||||
|
|
||||||
|
$(objpfx)siglist.os: $(objpfx)siglist-aux-shared.S
|
||||||
|
$(objpfx)siglist.o: $(objpfx)siglist-aux.S
|
||||||
|
|
||||||
ifeq ($(run-built-tests),yes)
|
ifeq ($(run-built-tests),yes)
|
||||||
LOCALES := \
|
LOCALES := \
|
||||||
de_DE.ISO-8859-1 \
|
de_DE.ISO-8859-1 \
|
||||||
@ -353,7 +366,6 @@ CFLAGS-isoc99_vfscanf.c += -fexceptions
|
|||||||
CFLAGS-isoc99_vscanf.c += -fexceptions
|
CFLAGS-isoc99_vscanf.c += -fexceptions
|
||||||
CFLAGS-isoc99_fscanf.c += -fexceptions
|
CFLAGS-isoc99_fscanf.c += -fexceptions
|
||||||
CFLAGS-isoc99_scanf.c += -fexceptions
|
CFLAGS-isoc99_scanf.c += -fexceptions
|
||||||
CFLAGS-siglist.c += $(fno-unit-at-a-time)
|
|
||||||
|
|
||||||
# scanf14a.c and scanf16a.c test a deprecated extension which is no
|
# scanf14a.c and scanf16a.c test a deprecated extension which is no
|
||||||
# longer visible under most conformance levels; see the source files
|
# longer visible under most conformance levels; see the source files
|
||||||
|
@ -26,7 +26,6 @@ const char *const __sys_siglist[NSIG] =
|
|||||||
#include <siglist.h>
|
#include <siglist.h>
|
||||||
#undef init_sig
|
#undef init_sig
|
||||||
};
|
};
|
||||||
libc_hidden_def (__sys_siglist)
|
|
||||||
|
|
||||||
const char *const __sys_sigabbrev[NSIG] =
|
const char *const __sys_sigabbrev[NSIG] =
|
||||||
{
|
{
|
||||||
@ -34,6 +33,3 @@ const char *const __sys_sigabbrev[NSIG] =
|
|||||||
#include <siglist.h>
|
#include <siglist.h>
|
||||||
#undef init_sig
|
#undef init_sig
|
||||||
};
|
};
|
||||||
libc_hidden_def (__sys_sigabbrev)
|
|
||||||
|
|
||||||
#include <siglist-compat.c>
|
|
7
stdio-common/siglist.S
Normal file
7
stdio-common/siglist.S
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#ifdef SHARED
|
||||||
|
# include "siglist-aux-shared.S"
|
||||||
|
#else
|
||||||
|
# include "siglist-aux.S"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <siglist-compat.h>
|
@ -28,20 +28,23 @@
|
|||||||
sys_sigabbrev alias to __sys_sigabbrev. Both target alias are
|
sys_sigabbrev alias to __sys_sigabbrev. Both target alias are
|
||||||
define in siglist.c. */
|
define in siglist.c. */
|
||||||
#define DEFINE_COMPAT_SIGLIST(NUMBERSIG, VERSION) \
|
#define DEFINE_COMPAT_SIGLIST(NUMBERSIG, VERSION) \
|
||||||
declare_symbol_alias (__ ## VERSION ## _sys_siglist, \
|
declare_object_symbol_alias (__ ## VERSION ## _sys_siglist, \
|
||||||
__sys_siglist, \
|
__sys_siglist, \
|
||||||
object, NUMBERSIG * (ULONG_WIDTH / UCHAR_WIDTH)); \
|
NUMBERSIG * (ULONG_WIDTH / UCHAR_WIDTH)) \
|
||||||
declare_symbol_alias (__ ## VERSION ## sys_siglist, \
|
ASM_LINE_SEP \
|
||||||
|
declare_object_symbol_alias (__ ## VERSION ## sys_siglist, \
|
||||||
__sys_siglist, \
|
__sys_siglist, \
|
||||||
object, NUMBERSIG * (ULONG_WIDTH / UCHAR_WIDTH)); \
|
NUMBERSIG * (ULONG_WIDTH / UCHAR_WIDTH)) \
|
||||||
declare_symbol_alias (__ ## VERSION ## _sys_sigabbrev, \
|
ASM_LINE_SEP \
|
||||||
|
declare_object_symbol_alias (__ ## VERSION ## _sys_sigabbrev, \
|
||||||
__sys_sigabbrev, \
|
__sys_sigabbrev, \
|
||||||
object, NUMBERSIG * (ULONG_WIDTH / UCHAR_WIDTH)); \
|
NUMBERSIG * (ULONG_WIDTH / UCHAR_WIDTH)) \
|
||||||
|
ASM_LINE_SEP \
|
||||||
compat_symbol (libc, __## VERSION ## _sys_siglist, _sys_siglist, \
|
compat_symbol (libc, __## VERSION ## _sys_siglist, _sys_siglist, \
|
||||||
VERSION); \
|
VERSION) ASM_LINE_SEP \
|
||||||
compat_symbol (libc, __## VERSION ## sys_siglist, sys_siglist, \
|
compat_symbol (libc, __## VERSION ## sys_siglist, sys_siglist, \
|
||||||
VERSION); \
|
VERSION) ASM_LINE_SEP \
|
||||||
compat_symbol (libc, __## VERSION ## _sys_sigabbrev, sys_sigabbrev, \
|
compat_symbol (libc, __## VERSION ## _sys_sigabbrev, sys_sigabbrev, \
|
||||||
VERSION); \
|
VERSION)
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -1 +0,0 @@
|
|||||||
/* Empty. */
|
|
@ -16,12 +16,15 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<https://www.gnu.org/licenses/>. */
|
<https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <siglist-compat.h>
|
#include <siglist-compat-def.h>
|
||||||
|
/* To get _NSIG definition. */
|
||||||
|
#define _SIGNAL_H
|
||||||
|
#include <bits/signum-generic.h>
|
||||||
|
|
||||||
#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
|
#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
|
||||||
DEFINE_COMPAT_SIGLIST (33, GLIBC_2_0)
|
DEFINE_COMPAT_SIGLIST (33, GLIBC_2_0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if SHLIB_COMPAT (libc, GLIBC_2_1, GLIBC_2_32)
|
#if SHLIB_COMPAT (libc, GLIBC_2_1, GLIBC_2_32)
|
||||||
DEFINE_COMPAT_SIGLIST (NSIG, GLIBC_2_1)
|
DEFINE_COMPAT_SIGLIST (_NSIG, GLIBC_2_1)
|
||||||
#endif
|
#endif
|
@ -16,7 +16,10 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<https://www.gnu.org/licenses/>. */
|
<https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <siglist-compat.h>
|
#include <siglist-compat-def.h>
|
||||||
|
/* To get _NSIG definition. */
|
||||||
|
#define _SIGNAL_H
|
||||||
|
#include <bits/signum-generic.h>
|
||||||
|
|
||||||
#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
|
#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
|
||||||
DEFINE_COMPAT_SIGLIST (32, GLIBC_2_0)
|
DEFINE_COMPAT_SIGLIST (32, GLIBC_2_0)
|
||||||
@ -27,5 +30,5 @@ DEFINE_COMPAT_SIGLIST (64, GLIBC_2_1)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if SHLIB_COMPAT (libc, GLIBC_2_3_3, GLIBC_2_32)
|
#if SHLIB_COMPAT (libc, GLIBC_2_3_3, GLIBC_2_32)
|
||||||
DEFINE_COMPAT_SIGLIST (NSIG, GLIBC_2_3_3)
|
DEFINE_COMPAT_SIGLIST (_NSIG, GLIBC_2_3_3)
|
||||||
#endif
|
#endif
|
Reference in New Issue
Block a user