Support building bits/syscall.h for any number of subarch variants.

This commit is contained in:
Joseph Myers 2011-12-22 18:22:50 +00:00
parent 16c6f99208
commit 154bfc1622
6 changed files with 89 additions and 32 deletions

View File

@ -1,3 +1,31 @@
2011-12-22 Joseph Myers <joseph@codesourcery.com>
* sysdeps/unix/sysv/linux/Makefile (syscall-list-variants)
(syscall-list-default-options, syscall-list-default-condition)
(syscall-list-includes): Define.
($(objpfx)syscall-%.h $(objpfx)syscall-%.d): Support arbitrary
list of ABIs and options and #if conditions for each ABI. Do not
handle common syscalls between ABIs specially.
* sysdeps/unix/sysv/linux/powerpc/Makefile (64bit-predefine):
Remove.
(syscall-list-variants, syscall-list-32bit-options)
(syscall-list-32bit-condition, syscall-list-64bit-options)
(syscall-list-64bit-condition): Define.
* sysdeps/unix/sysv/linux/s390/Makefile (64bit-predefine): Remove.
(syscall-list-variants, syscall-list-32bit-options)
(syscall-list-32bit-condition, syscall-list-64bit-options)
(syscall-list-64bit-condition): Define.
* sysdeps/unix/sysv/linux/sparc/Makefile (64bit-predefine):
Remove.
(syscall-list-variants, syscall-list-32bit-options)
(syscall-list-32bit-condition, syscall-list-64bit-options)
(syscall-list-64bit-condition): Define.
* sysdeps/unix/sysv/linux/x86_64/Makefile (64bit-predefine):
Remove.
(syscall-list-variants, syscall-list-32bit-options)
(syscall-list-32bit-condition, syscall-list-64bit-options)
(syscall-list-64bit-condition): Define.
2011-12-22 Ulrich Drepper <drepper@gmail.com>
* locale/iso-639.def: Add brx entry.

View File

@ -39,8 +39,27 @@ install-others += $(inst_includedir)/bits/syscall.h
tests += tst-clone
# Generate the list of SYS_* macros for the system calls (__NR_* macros).
# For bi-arch platforms, the CPU/Makefile defines {32,64}bit-predefine and
# we generate a file that uses <bits/wordsize.h>.
# If there is more than one syscall list for different architecture
# variants, the CPU/Makefile defines syscall-list-variants to be a
# list of names for those variants (e.g. 32bit 64bit), and, for each
# variant, defines syscall-list-$(variant)-options to be compiler
# options to cause <asm/unistd.h> to define the desired list of
# syscalls and syscall-list-$(variant)-condition to be the condition
# for those options to use in a C #if condition.
# syscall-list-includes may be defined to a list of headers to include
# in the generated header, if the default does not suffice.
ifndef syscall-list-variants
syscall-list-variants := default
syscall-list-default-options :=
syscall-list-default-condition :=
endif
ifndef syscall-list-includes
syscall-list-includes := bits/wordsize.h
endif
$(objpfx)syscall-%.h $(objpfx)syscall-%.d: ../sysdeps/unix/sysv/linux/sys/syscall.h
$(make-target-directory)
{ \
@ -50,37 +69,30 @@ $(objpfx)syscall-%.h $(objpfx)syscall-%.d: ../sysdeps/unix/sysv/linux/sys/syscal
echo '# error "Never use <bits/syscall.h> directly; include <sys/syscall.h> instead."'; \
echo '#endif'; \
echo ''; \
$(CC) -E -MD -MP -MF $(@:.h=.d)-t1 -MT '$(@:.d=.h) $(@:.h=.d)' \
-x c $(sysincludes) $< $(addprefix -U,$(64bit-predefine)) \
$(addprefix -D,$(32bit-predefine)) -D_LIBC -dM | \
$(foreach h,$(syscall-list-includes), echo '#include <$(h)>';) \
echo ''; \
$(foreach v,$(syscall-list-variants),\
$(CC) -E -MD -MP -MF $(@:.h=.d)-t$(v) -MT '$(@:.d=.h) $(@:.h=.d)' \
-x c $(sysincludes) $< $(syscall-list-$(v)-options) \
-D_LIBC -dM | \
sed -n 's@^#define __NR_\([^ ]*\) .*$$@#define SYS_\1 __NR_\1@p' | \
LC_ALL=C sort > $(@:.d=.h).new32; \
$(CC) -E -MD -MP -MF $(@:.h=.d)-t2 -MT '$(@:.d=.h) $(@:.h=.d)' \
-x c $(sysincludes) $< $(addprefix -U,$(32bit-predefine)) \
$(addprefix -D,$(64bit-predefine)) -D_LIBC -dM | \
sed -n 's@^#define __NR_\([^ ]*\) .*$$@#define SYS_\1 __NR_\1@p' | \
LC_ALL=C sort > $(@:.d=.h).new64; \
if cmp -s $(@:.d=.h).new32 $(@:.d=.h).new64; then \
cat $(@:.d=.h).new32; \
else \
echo '#include <bits/wordsize.h>'; \
echo ''; \
LC_ALL=C comm -12 $(@:.d=.h).new32 $(@:.d=.h).new64; \
echo '#if __WORDSIZE == 64'; \
LC_ALL=C comm -13 $(@:.d=.h).new32 $(@:.d=.h).new64; \
echo '#else'; \
LC_ALL=C comm -23 $(@:.d=.h).new32 $(@:.d=.h).new64; \
echo '#endif'; \
fi; \
rm -f $(@:.d=.h).new32 $(@:.d=.h).new64; \
LC_ALL=C sort > $(@:.d=.h).new$(v); \
$(if $(syscall-list-$(v)-condition),\
echo '#if $(syscall-list-$(v)-condition)';) \
cat $(@:.d=.h).new$(v); \
$(if $(syscall-list-$(v)-condition),echo '#endif';) \
rm -f $(@:.d=.h).new$(v); \
) \
} > $(@:.d=.h).new
mv -f $(@:.d=.h).new $(@:.d=.h)
ifneq (,$(objpfx))
sed $(sed-remove-objpfx) $(@:.h=.d)-t1 $(@:.h=.d)-t2 > $(@:.h=.d)-t3
sed $(sed-remove-objpfx) \
$(foreach v,$(syscall-list-variants),$(@:.h=.d)-t$(v)) > $(@:.h=.d)-t3
else
cat $(@:.h=.d)-t1 $(@:.h=.d)-t2 > $(@:.h=.d)-t3
cat $(foreach v,$(syscall-list-variants),$(@:.h=.d)-t$(v)) \
> $(@:.h=.d)-t3
endif
rm -f $(@:.h=.d)-t1 $(@:.h=.d)-t2
rm -f $(foreach v,$(syscall-list-variants),$(@:.h=.d)-t$(v))
mv -f $(@:.h=.d)-t3 $(@:.h=.d)
$(inst_includedir)/bits/syscall.h: $(objpfx)syscall-list.h $(+force)

View File

@ -1,4 +1,9 @@
64bit-predefine = __powerpc64__
syscall-list-variants := 32bit 64bit
syscall-list-32bit-options := -U__powerpc64__
syscall-list-32bit-condition := __WORDSIZE == 32
syscall-list-64bit-options := -D__powerpc64__
syscall-list-64bit-condition := __WORDSIZE == 64
ifeq ($(subdir),rt)
librt-routines += rt-sysdep
endif

View File

@ -1,4 +1,9 @@
64bit-predefine = __s390x__
syscall-list-variants := 32bit 64bit
syscall-list-32bit-options := -U__s390x__
syscall-list-32bit-condition := __WORDSIZE == 32
syscall-list-64bit-options := -D__s390x__
syscall-list-64bit-condition := __WORDSIZE == 64
ifeq ($(subdir),rt)
librt-routines += rt-sysdep
endif

View File

@ -1,4 +1,8 @@
64bit-predefine = __sparc_v9__ __arch64__
syscall-list-variants := 32bit 64bit
syscall-list-32bit-options := -U__sparc_v9__ -U__arch64__
syscall-list-32bit-condition := __WORDSIZE == 32
syscall-list-64bit-options := -D__sparc_v9__ -D__arch64__
syscall-list-64bit-condition := __WORDSIZE == 64
ifeq ($(subdir),rt)
librt-routines += rt-sysdep

View File

@ -1,5 +1,8 @@
32bit-predefine = __i386__
64bit-predefine = __x86_64__
syscall-list-variants := 32bit 64bit
syscall-list-32bit-options := -D__i386__ -U__x86_64__
syscall-list-32bit-condition := __WORDSIZE == 32
syscall-list-64bit-options := -U__i386__ -D__x86_64__
syscall-list-64bit-condition := __WORDSIZE == 64
ifeq ($(subdir),misc)
sysdep_routines += ioperm iopl