From 154bfc16225aaa3d3104e758eed2a17297131599 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Thu, 22 Dec 2011 18:22:50 +0000 Subject: Support building bits/syscall.h for any number of subarch variants. --- ChangeLog | 28 ++++++++++++++ sysdeps/unix/sysv/linux/Makefile | 66 +++++++++++++++++++------------- sysdeps/unix/sysv/linux/powerpc/Makefile | 7 +++- sysdeps/unix/sysv/linux/s390/Makefile | 7 +++- sysdeps/unix/sysv/linux/sparc/Makefile | 6 ++- sysdeps/unix/sysv/linux/x86_64/Makefile | 7 +++- 6 files changed, 89 insertions(+), 32 deletions(-) diff --git a/ChangeLog b/ChangeLog index a9cdf76..f74e0a5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,31 @@ +2011-12-22 Joseph Myers + + * 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 * locale/iso-639.def: Add brx entry. diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index 3032026..e684b16 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -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 . + +# 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 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 directly; include 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 | \ - 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 | \ + $(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).new64; \ - if cmp -s $(@:.d=.h).new32 $(@:.d=.h).new64; then \ - cat $(@:.d=.h).new32; \ - else \ - echo '#include '; \ - 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) diff --git a/sysdeps/unix/sysv/linux/powerpc/Makefile b/sysdeps/unix/sysv/linux/powerpc/Makefile index d1281cf..55311a4 100644 --- a/sysdeps/unix/sysv/linux/powerpc/Makefile +++ b/sysdeps/unix/sysv/linux/powerpc/Makefile @@ -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 diff --git a/sysdeps/unix/sysv/linux/s390/Makefile b/sysdeps/unix/sysv/linux/s390/Makefile index 72eae68..fb20fb0 100644 --- a/sysdeps/unix/sysv/linux/s390/Makefile +++ b/sysdeps/unix/sysv/linux/s390/Makefile @@ -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 diff --git a/sysdeps/unix/sysv/linux/sparc/Makefile b/sysdeps/unix/sysv/linux/sparc/Makefile index 9cb2a63..96bf0bb 100644 --- a/sysdeps/unix/sysv/linux/sparc/Makefile +++ b/sysdeps/unix/sysv/linux/sparc/Makefile @@ -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 diff --git a/sysdeps/unix/sysv/linux/x86_64/Makefile b/sysdeps/unix/sysv/linux/x86_64/Makefile index 6e2741a..9c9e615 100644 --- a/sysdeps/unix/sysv/linux/x86_64/Makefile +++ b/sysdeps/unix/sysv/linux/x86_64/Makefile @@ -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 -- cgit v1.1