This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: Support bits/syscall.h build for triarch systems
On Wed, 21 Dec 2011, Roland McGrath wrote:
> I think the most useful sort of anal testing would be just to write
> up a file that enumerates all the conceivable SYS_* macros, as in:
>
> #include <sys/syscall.h>
> SYS_this
> SYS_that
> ...
>
> Then run that through cpp (and perhaps sed to canonicalize the whitespace)
> and compare the results from the old and new files in each -mfoo state on
> each machine that's affected. I won't insist that you do something like
> that now, but if it turns out your code produces headers that have
> different effective results in some case, I'll pretend I had insisted.
I've tested doing this for x86_64-linux-gnu (default and -m32),
sparc64-linux-gnu (default and -m32), s390-linux-gnu (default and -m64),
powerpc-linux-gnu (default and -m64), i686-linux-gnu (to test the uniarch
case).
In general I think it's desirable that glibc patches be appropriately
tested for at least one architecture before commit - but for a patch
involving very mechanical changes to multiple architectures it would seem
reasonable to me to test for one architecture, make the mechanical changes
to the others and least it to people testing on the other architectures to
discover any problems. (And that's better than changing one architecture
and leaving the others definitely out of sync, although some changes do
involve more complicated architecture-specific work that does require
architecture experts.)
Comparing the headers themselves showed uniarch configurations now have an
include of <bits/wordsize.h> from <bits/syscall.h> where they didn't
before, since that's the default syscall-list-includes. I think this is
harmless - and arguably beneficial, since the general rule in glibc is
that the headers some header implicitly includes should not depend on the
architecture, and if an architecture-specific build bug occurs because of
a difference in implicit includes, the fix should be to make the includes
consistent.
> > +syscall-list-default-condition := 1
>
> I know it's a trifling matter, but a scenario that produces "#if 1"
> is something I just cannot abide. Make the special case to avoid it as
> clean as you can see how to do, but please do something.
>
> If you've done that clean-up and tested enough that you'd testify to its
> correctness, then go ahead and commit it.
This is the patch I will commit, using make's $(if) to remove the #if 1
and #endif in the uniarch case.
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.
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 <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 | \
- 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 <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)
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
--
Joseph S. Myers
joseph@codesourcery.com