mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-08 14:20:07 +00: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:
parent
900fa25736
commit
6fad891dfd
@ -14,10 +14,8 @@ libc_hidden_proto (__sigpause)
|
||||
libc_hidden_proto (raise)
|
||||
libc_hidden_proto (__libc_current_sigrtmin)
|
||||
libc_hidden_proto (__libc_current_sigrtmax)
|
||||
extern const char * const __sys_siglist[_NSIG];
|
||||
libc_hidden_proto (__sys_siglist)
|
||||
extern const char * const __sys_sigabbrev[_NSIG];
|
||||
libc_hidden_proto (__sys_sigabbrev)
|
||||
extern const char * const __sys_siglist[_NSIG] attribute_hidden;
|
||||
extern const char * const __sys_sigabbrev[_NSIG] attribute_hidden;
|
||||
|
||||
/* Now define the internal interfaces. */
|
||||
extern __sighandler_t __bsd_signal (int __sig, __sighandler_t __handler);
|
||||
|
@ -215,6 +215,8 @@ tests := \
|
||||
generated += \
|
||||
errlist-data-aux-shared.S \
|
||||
errlist-data-aux.S \
|
||||
siglist-aux-shared.S \
|
||||
siglist-aux.S \
|
||||
# generated
|
||||
|
||||
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.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)
|
||||
LOCALES := \
|
||||
de_DE.ISO-8859-1 \
|
||||
@ -353,7 +366,6 @@ CFLAGS-isoc99_vfscanf.c += -fexceptions
|
||||
CFLAGS-isoc99_vscanf.c += -fexceptions
|
||||
CFLAGS-isoc99_fscanf.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
|
||||
# longer visible under most conformance levels; see the source files
|
||||
|
@ -26,7 +26,6 @@ const char *const __sys_siglist[NSIG] =
|
||||
#include <siglist.h>
|
||||
#undef init_sig
|
||||
};
|
||||
libc_hidden_def (__sys_siglist)
|
||||
|
||||
const char *const __sys_sigabbrev[NSIG] =
|
||||
{
|
||||
@ -34,6 +33,3 @@ const char *const __sys_sigabbrev[NSIG] =
|
||||
#include <siglist.h>
|
||||
#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
|
||||
define in siglist.c. */
|
||||
#define DEFINE_COMPAT_SIGLIST(NUMBERSIG, VERSION) \
|
||||
declare_symbol_alias (__ ## VERSION ## _sys_siglist, \
|
||||
__sys_siglist, \
|
||||
object, NUMBERSIG * (ULONG_WIDTH / UCHAR_WIDTH)); \
|
||||
declare_symbol_alias (__ ## VERSION ## sys_siglist, \
|
||||
__sys_siglist, \
|
||||
object, NUMBERSIG * (ULONG_WIDTH / UCHAR_WIDTH)); \
|
||||
declare_symbol_alias (__ ## VERSION ## _sys_sigabbrev, \
|
||||
__sys_sigabbrev, \
|
||||
object, NUMBERSIG * (ULONG_WIDTH / UCHAR_WIDTH)); \
|
||||
declare_object_symbol_alias (__ ## VERSION ## _sys_siglist, \
|
||||
__sys_siglist, \
|
||||
NUMBERSIG * (ULONG_WIDTH / UCHAR_WIDTH)) \
|
||||
ASM_LINE_SEP \
|
||||
declare_object_symbol_alias (__ ## VERSION ## sys_siglist, \
|
||||
__sys_siglist, \
|
||||
NUMBERSIG * (ULONG_WIDTH / UCHAR_WIDTH)) \
|
||||
ASM_LINE_SEP \
|
||||
declare_object_symbol_alias (__ ## VERSION ## _sys_sigabbrev, \
|
||||
__sys_sigabbrev, \
|
||||
NUMBERSIG * (ULONG_WIDTH / UCHAR_WIDTH)) \
|
||||
ASM_LINE_SEP \
|
||||
compat_symbol (libc, __## VERSION ## _sys_siglist, _sys_siglist, \
|
||||
VERSION); \
|
||||
VERSION) ASM_LINE_SEP \
|
||||
compat_symbol (libc, __## VERSION ## sys_siglist, sys_siglist, \
|
||||
VERSION); \
|
||||
VERSION) ASM_LINE_SEP \
|
||||
compat_symbol (libc, __## VERSION ## _sys_sigabbrev, sys_sigabbrev, \
|
||||
VERSION); \
|
||||
VERSION)
|
||||
|
||||
#endif
|
@ -1 +0,0 @@
|
||||
/* Empty. */
|
@ -16,12 +16,15 @@
|
||||
License along with the GNU C Library; if not, see
|
||||
<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)
|
||||
DEFINE_COMPAT_SIGLIST (33, GLIBC_2_0)
|
||||
#endif
|
||||
|
||||
#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
|
@ -16,7 +16,10 @@
|
||||
License along with the GNU C Library; if not, see
|
||||
<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)
|
||||
DEFINE_COMPAT_SIGLIST (32, GLIBC_2_0)
|
||||
@ -27,5 +30,5 @@ DEFINE_COMPAT_SIGLIST (64, GLIBC_2_1)
|
||||
#endif
|
||||
|
||||
#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
|
Loading…
Reference in New Issue
Block a user